Spring MVC中的自定义授权

时间:2012-12-07 16:05:31

标签: java spring-mvc spring-security

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

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

  • 查看者 - 查看学生详细信息
  • 编辑 - 编辑学生详细信息
  • 出口商 - 出口学生资料

执行上述操作的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 EXPORTERClass 2 ADMINISTRATOR

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

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

角色EDITOREXPORTEREXPORTER不是弹簧安全角色。现在我遇到了一个问题,同时限制用户访问他们没有权限的资源。

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

我可以让他们知道spring-security,但问题是我在哪里读取@PathVariableHandlerInterceptor)的逻辑并将其与当前登录用户匹配以检查他是否拥有访问它。

我甚至想过创建一个监听/content/*的过滤器/ {{1}}的想法。但我必须做一些丑陋的事情,比如解析URI,自己提取第二个路径参数然后检查数据库。

是否有更优雅,弹簧安全的方式来做到这一点?

欢迎任何想法。

1 个答案:

答案 0 :(得分:3)

您可以为自己的SecurityExpressionHandler实施提供Spring安全性。只需展开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>

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