我有一个Play框架应用程序,其模型如下:
Company
只有一个User
与之关联。
我有http://www.example.com/companies/1234
,http://www.example.com/companies/1234/departments
,http://www.example.com/companies/1234/departments/employees
等网址。这些数字是公司ID,而不是用户ID。
我希望普通用户(不是管理员)应该只能访问自己的个人资料页面,而不能访问其他人的个人资料页面。因此,与ID为1234的公司关联的用户无法访问网址http://www.example.com/companies/6789
我试图通过覆盖Secure.check()
并将请求参数“id”与与登录用户关联的公司的ID进行比较来实现此目的。但是,如果参数被调用为“id”以外的其他内容,这显然会失败。
有谁知道如何实现这一目标?
答案 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
希望有所帮助:)