4

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

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

  • 查看器 - 查看学生详细信息
  • EDITOR - 编辑学生详细信息
  • 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角色 forClass 1EXPORTERfor Class 2

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

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

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

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

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

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

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

欢迎任何想法。

4

1 回答 1

3

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

以下是您如何提供自己的 SecurityExpressionHandler 实现。代码来自spring 安全文档

<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>

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

于 2012-12-07T16:27:50.190 回答