2012-12-07 126 views
4

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

例如,如果实体被称为Student,应用程序的用户有不同程度的优惠,如:

  • VIEWER - 查看学生详细介绍
  • 编辑器 - 编辑学生详细介绍
  • 出口商 - 出口学生详细信息

用于执行上述操作的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可以访问一切。

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

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

我可以让他们的安全意识,但问题是我在哪里把我的逻辑阅读{studentId}@PathVariable)并匹配它与当前登录的用户,以检查他是否有权访问它。

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

有没有更优雅的,弹簧安全的做法呢?

任何想法的欢迎。

+0

我个人使用Shiro。它工作得很好。 –

回答

3

你可以提供弹簧安全你自己执行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> 

其答案是否提供足够的信息,或者你需要更多的帮助?

+0

谢谢,我会探索一下,回到你身边。 – adarshr

+0

欢迎您。顺便说一下,这里是另一个问题+与类似主题的答案:http://stackoverflow.com/questions/6632982/how-to-create-custom-methods-for-use-in-spring-security-expression-language -anno – Yevgeniy

+0

我只需要实现'PermissionEvaluator'并在我的'@ RequestMapping'上使用'@PreAuthorize(“hasPermission(#studentId,'EDITOR')'等等。但是,因为我有一个专用的控制器URI根,我只需要在类级别定义'@ PreAuthorize'。非常感谢。 – adarshr