java - Spring MVC 中的自定义授权

标签 java spring-mvc spring-security

我们有一个应用程序,管理员可以在其中创建用户并将角色分配给特定类型的实体。

例如,如果实体名为 Student,则应用程序的用户具有不同级别的权限,例如:

  • VIEWER - 查看学生详细信息
  • 编辑 - 编辑学生详细信息
  • 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 权限,他甚至不应该看到Export 按钮(位于应用程序的某处)。也许我可以使用 spring 的 security 标签库来做到这一点。但这完全是另一个问题。

我可以让他们知道 spring-security 但问题是我应该把读取 {studentId} (@PathVariable) 的逻辑放在哪里并将其与当前的匹配登录用户检查他是否有权访问它。

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

是否有更优雅的 spring-security 方式来做到这一点?

欢迎任何想法。

最佳答案

您可以为 Spring Security 提供您自己的 SecurityExpressionHandler 实现。只需扩展 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>

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

关于java - Spring MVC 中的自定义授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13766685/

相关文章:

java - 为什么这个基于 token 的 Spring Security 过滤器没有被调用?

Spring 安全 3.1.3 @EnableWebSecurity

grails - Grails和Hudson插件问题

java - 为什么 Java 中的 JWT token 无效或过期时,我的 CustomAuthenticationEntryPoint 开始方法没有被调用?

java - 作为 Windows 服务运行时,Excel 无法读取由 Java 进程编写的文件

java - GUI编程和上传图像?

java - JPA manytomany 在使用@JoinTable 时保持列表顺序

java - 为什么Spring MVC会以404响应并报告 “No mapping found for HTTP request with URI […] in DispatcherServlet”?

java - Spring 启动 Spring 安全AngularJS

java - Java图形画线性能问题