Spring MVC中的自定义授权
我们有一个应用程序,用户可以由管理员创建用户,并将角色分配给特定类型的实体。
例如,如果实体名为Student
,则应用程序的用户具有不同级别的权限,例如:
- 查看者 – 查看学生详细信息
- 编辑 – 编辑学生详细信息
- 出口商 – 出口学生详细信息
执行上述操作的URI如下所示:
-
GET
–/content/{classId}/{studentId}/view
-
PUT
–/content/{classId}/{studentId}
-
GET
–/content/{classId}/{studentId}/export
-
POST
–/content/{classId}/{studentId}/export
请注意,URI具有动态性质。 此外,给定用户User A
可以为Class 1
分配VIEWER
角色,为Class 2
分配EXPORTER
。
在我的spring-security配置中,我只定义了两个权限 – ADMINISTRATOR
和USER
。
-
ADMINISTRATOR
– 可以访问所有内容 -
USER
– 可以访问除/admin/*
URI之外的所有内容。
角色VIEWER
, EDITOR
, EXPORTER
不是弹簧安全角色。 现在我遇到了一个问题,同时限制用户访问他们没有权限的资源。
此外,如果用户没有正确的EXPORTER
,他甚至不应该看到导出按钮(放在应用程序的某个位置)。 也许我可以使用spring的security
标记库来做到这一点。 但这完全是另一个问题。
我可以让他们知道spring-security,但问题是我在哪里读取{studentId}
( @PathVariable
)的逻辑并将其与当前登录用户匹配以检查他是否有权访问它。
我甚至想过创建一个侦听/content/*
的filter/ HandlerInterceptor
的想法。 但我必须做一些难看的事情,比如解析URI,自己提取第二个路径参数,然后检查数据库。
这样做有更优雅,弹簧安全的方式吗?
欢迎任何想法。
您可以提供Spring安全性自己的SecurityExpressionHandler
实现。 只需扩展DefaultWebSecurityExpressionHandler
并覆盖createSecurityExpressionRoot
。 默认情况下,此方法返回WebSecurityExpressionRoot
的实例。 您的实现可以只扩展此类并添加其他方法,您将在spring安全配置中使用这些方法。
以下是您提供自己的SecurityExpressionHandler实现的方法。 代码来自spring安全文档 :
答案是否提供了足够的信息,还是需要进一步的帮助?