0

我有一个 Play 框架应用程序,它有一个这样的模型:ACompany有一个并且只有一个User与之关联。

我有诸如http://www.example.com/companies/1234http://www.example.com/companies/1234/departments之 类的 URL http://www.example.com/companies/1234/departments/employees。这些数字是公司 ID,而不是用户 ID。

我希望普通用户(不是管理员)只能访问他们自己的个人资料页面,而不是其他人的个人资料页面。因此,与 ID 为 1234 的公司关联的用户应该无法访问该 URL http://www.example.com/companies/6789

我试图通过覆盖Secure.check()请求参数“id”并将其与与登录用户关联的公司的 ID 进行比较来完成此操作。但是,如果参数被称为“id”以外的任何东西,这显然会失败。

有谁知道如何做到这一点?

4

2 回答 2

1

您可以有一个简单的@Before 函数,或者如果它仅在您想要应用安全性的视图页面上,那么您可以在开头有一段简单的代码来检查用户的 id(我假设来自会话) ,并检查是否允许他们访问该页面,方法是从会话中的 id 获取用户,并从传入的 id 获取公司,并相互检查。

如果安全失败,则要么返回错误请求而不是渲染,要么调用显示未授权自定义页面的操作。

于 2012-05-31T14:55:16.753 回答
0

您可以创建一个扩展 Controller 的 SecureProfileController 类,具有针对用户 companyId 执行 checkCompanyId-that-is-to-be-viewed 的方法,并让需要该逻辑的控制器扩展 SecureController。

如果方法是 @Before 函数,就像 Codemwnci 说的那样,那么它可以拦截继承类中的所有动作方法。

或者,您可以查看 Deadbolt,您可以在其中为用户设置角色并根据这些角色限制访问:http ://www.playframework.org/modules/deadbolt-1.0/home

希望有帮助:)

于 2012-06-01T17:55:39.903 回答