如何在Play Framework中编写“用户只能访问自己的个人资料页面”类型的安全检查?

时间:2012-05-31 14:49:43

标签: security playframework playframework-1.x

我有一个Play框架应用程序,其模型如下: Company只有一个User与之关联。

我有http://www.example.com/companies/1234http://www.example.com/companies/1234/departmentshttp://www.example.com/companies/1234/departments/employees等网址。这些数字是公司ID,而不是用户ID。

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

我试图通过覆盖Secure.check()并将请求参数“id”与与登录用户关联的公司的ID进行比较来实现此目的。但是,如果参数被调用为“id”以外的其他内容,这显然会失败。

有谁知道如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

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

如果安全性失败,则返回badrequest而不是render,或者调用显示notAuthorised自定义页面的操作。

答案 1 :(得分:0)

你可以创建一个扩展Controller的SecureProfileController类,有一个方法可以对用户companyId执行checkCompanyId查看,并让需要该逻辑的控制器扩展SecureController。

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

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

希望有所帮助:)