【发布时间】:2012-11-25 20:15:01
【问题描述】:
我们有一个应用程序,管理员可以在其中创建用户并将角色分配给特定类型的实体。
例如,如果实体名为Student,则应用程序的用户具有不同级别的权限,例如:
- 查看器 - 查看学生详细信息
- 编辑器 - 编辑学生详细信息
- EXPORTER - 导出学生详细信息
执行上述操作的 URI 如下所示:
-
GET-/content/{classId}/{studentId}/view -
PUT-/content/{classId}/{studentId} -
GET-/content/{classId}/{studentId}/export -
POST-/content/{classId}/{studentId}/export
请注意,URI 是动态的。此外,可以为给定用户User A 分配VIEWER 角色Class 1 和EXPORTER 角色Class 2。
在我的 spring-security 配置中,我只定义了两个权限 - ADMINISTRATOR 和 USER。
-
ADMINISTRATOR- 可以访问所有内容 -
USER- 可以访问除/admin/*URI 之外的所有内容。
VIEWER、EDITOR、EXPORTER 角色不是 spring-security 角色。现在我在限制用户访问他们无权访问的资源时遇到了问题。
另外,如果用户没有EXPORTER 权限,他甚至不应该看到导出 按钮(放置在应用程序的某处)。也许我可以使用 spring 的security taglib 来做到这一点。但这完全是另一个问题。
我可以让他们意识到弹簧安全性,但问题是我应该将阅读{studentId} (@PathVariable) 的逻辑放在哪里,并将其与当前登录的用户进行匹配,以检查他是否有权访问它。
我什至想到了创建一个过滤器/HandlerInterceptor 来监听/content/* 的想法。但是我将不得不做一些丑陋的事情,比如解析 URI,自己提取第二个路径参数,然后检查数据库。
有没有更优雅、更安全的方式来做到这一点?
欢迎任何想法。
【问题讨论】:
-
我个人使用 Shiro。效果很好。
标签: java spring-mvc spring-security