Spring MVC 中的自定义授权

Posted

技术标签:

【中文标题】Spring MVC 中的自定义授权【英文标题】:Custom authorization in Spring MVC 【发布时间】: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 1EXPORTER 角色Class 2

在我的 spring-security 配置中,我只定义了两个权限 - ADMINISTRATORUSER

ADMINISTRATOR - 可以访问所有内容 USER - 可以访问除 /admin/* URI 之外的所有内容。

VIEWEREDITOREXPORTER 角色不是 spring-security 角色。现在我在限制用户访问他们无权访问的资源时遇到了问题。

另外,如果用户没有EXPORTER 权限,他甚至不应该看到导出 按钮(放置在应用程序的某处)。也许我可以使用 spring 的security taglib 来做到这一点。但这完全是另一个问题。

我可以让他们意识到弹簧安全性,但问题是我应该将阅读studentId (@PathVariable) 的逻辑放在哪里,并将其与当前登录的用户进行匹配,以检查他是否有权访问它。

我什至想到了创建一个过滤器/HandlerInterceptor 来监听/content/* 的想法。但是我将不得不做一些丑陋的事情,比如解析 URI,自己提取第二个路径参数,然后检查数据库。

有没有更优雅、更安全的方式来做到这一点?

欢迎任何想法。

【问题讨论】:

我个人使用 Shiro。效果很好。 【参考方案1】:

您可以提供您自己的SecurityExpressionHandler 实现的spring security。只需扩展DefaultWebSecurityExpressionHandler 并覆盖createSecurityExpressionRoot。默认情况下,此方法返回WebSecurityExpressionRoot 的实例。您的实现可以只扩展此类并添加其他方法,您将在 Spring 安全配置中使用这些方法。

这是您提供自己的 SecurityExpressionHandler 实现的方式。代码来自spring security documentation:

<security:global-method-security pre-post-annotations="enabled">
    <security:expression-handler ref="expressionHandler"/>
</security:global-method-security>

<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
    <property name="permissionEvaluator" ref="myPermissionEvaluator"/>
</bean>

答案是否提供了足够的信息或您需要进一步的帮助?

【讨论】:

谢谢,我会稍微探索一下,然后再回复你。 不客气。顺便说一句,这是另一个类似主题的问题+答案:***.com/questions/6632982/… 我只需要在我的@RequestMappings 上实现PermissionEvaluator 并使用@PreAuthorize("hasPermission(#studentId, 'EDITOR') 等等。但是,由于我对每个 URI 根都有一个专用控制器,因此我只需要在类级别上定义 @PreAuthorize。非常感谢。

以上是关于Spring MVC 中的自定义授权的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 spring mvc 和 $http 访问 CORS 环境中的自定义标头

Spring OAuth:用于验证授权端点的自定义表单

Spring MVC(或 Spring Boot)。针对安全相关异常(例如 401 Unauthorized 或 403 Forbidden)的自定义 JSON 响应)

带有权限代码的 ASP.NET MVC 4 自定义授权属性(无角色)

asp.MVC 中的自定义警报消息

MVC4 中的自定义 403 错误页面未显示