如何在 Play Framework 中编写“用户只能访问自己的个人资料页面”类型的安全检查?
Posted
技术标签:
【中文标题】如何在 Play Framework 中编写“用户只能访问自己的个人资料页面”类型的安全检查?【英文标题】:How can I write a "user can only access own profile page" type of security check in Play Framework? 【发布时间】:2012-05-31 14:49:42 【问题描述】:我有一个 Play 框架应用程序,它的模型如下:
Company
有一个且只有一个 User
与之关联。
我有 http://www.example.com/companies/1234
、http://www.example.com/companies/1234/departments
、http://www.example.com/companies/1234/departments/employees
等 URL。这些数字是公司 ID,而不是用户 ID。
我希望普通用户(不是管理员)只能访问他们自己的个人资料页面,而不是其他人的个人资料页面。因此,与 ID 为 1234 的公司关联的用户应该无法访问 URL http://www.example.com/companies/6789
我尝试通过覆盖Secure.check()
并将请求参数“id”与与登录用户关联的公司的ID 进行比较来实现此目的。但是,如果参数被称为“id”以外的任何东西,这显然会失败。
有谁知道如何做到这一点?
【问题讨论】:
【参考方案1】:你可以有一个简单的@Before 函数,或者如果它只是在你想要应用安全性的视图页面上,那么你可以在开头有一段简单的代码来检查用户的 id(我假设从会话),并检查他们是否被允许访问该页面,方法是从会话中的 id 获取用户,并从传入的 id 获取公司,并相互检查。
如果安全失败,则要么返回错误请求而不是渲染,要么调用显示未授权自定义页面的操作。
【讨论】:
安全模块没有标准方法吗?我宁愿不要用这种逻辑来迷惑我所有的控制器。这应该是一个足够常见的用例,有人已经解决了这个问题......【参考方案2】:您可以创建一个扩展 Controller 的 SecureProfileController 类,具有针对用户 companyId 执行 checkCompanyId-that-is-to-be-viewed 的方法,并让需要该逻辑的控制器扩展 SecureController。
如果方法是@Before函数,就像Codemwnci说的那样,那么它可以拦截继承类中的所有动作方法。
或者,您可以查看 Deadbolt,您可以在其中为用户设置角色并根据这些角色限制访问:http://www.playframework.org/modules/deadbolt-1.0/home
希望有帮助:)
【讨论】:
以上是关于如何在 Play Framework 中编写“用户只能访问自己的个人资料页面”类型的安全检查?的主要内容,如果未能解决你的问题,请参考以下文章
Play Framework:如何在用户注册时使用 Secure 模块自动登录?
我可以在 Play Framework 2.4 中从两个没有转换器的模型中编写 Json
Play Framework:如何在 CRUD 模型中声明不应在 UI 中显示的成员