如何在 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/1234http://www.example.com/companies/1234/departmentshttp://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 中显示的成员

Play Framework bindFromRequest() 方法返回参数为空的对象

Play Framework 2.7 授权获取用户

如何使用 Play Framework 和 videojs 流式传输视频?