Spring Security @PreAuthorize - 使用Spring EL限制某些角色

时间:2013-01-10 22:10:02

标签: spring spring-mvc spring-security

使用Spring Security 3.1.3.RELEASE

因此,如果有一个角色列表(超过10个),则需要阻止一个访问Spring Controller方法。这可以使用Spring Expression Language完成,并避免列出每个非常接受的角色吗?

例如,包含Not sign。

  

@PreAuthorize( “!hasRole( 'ROLE_FREE_USER')”)

列出了像这样的所有角色

  

@PreAuthorize(“hasAnyRole( 'ROLE_ADMIN', 'ROLE_PAID_USER', 'ROLE_PREM_USER',...)

我在这里查看了文档:http://static.springsource.org/spring-security/site/docs/3.0.x/reference/el-access.html

但似乎没有任何关于案件的NOT EQUAL。任何人都面临类似的问题?

2 个答案:

答案 0 :(得分:2)

我很确定Spring Expression Language(SPEL)支持NOT-sign(!)。当然,它会返回boolean结果。

来自official documentation

的示例
// evaluates to false
boolean falseValue = parser.parseExpression("!true").getValue(Boolean.class);

// -- AND and NOT --
String expression =  "isMember('Nikola Tesla') and !isMember('Mihajlo Pupin')";
boolean falseValue = parser.parseExpression(expression).getValue(societyContext, Boolean.class);

答案 1 :(得分:0)

在这种情况下,Spring Expression Language对我不起作用。最初,我尝试了以下方法,

@RequestMapping("/post/edit")
        @PreAuthorize("hasRole('ROLE_OWNER') AND !hasRole('ROLE_ADMIN')")
        public String editPost(Model model, Principal principal,  HttpServletRequest request, @RequestParam("postId") String postId) {
    }

但是,我不得不从方法内部重新检查“角色”,并在用户具有“管理员权限”的情况下重定向页面。

@RequestMapping("/post/edit")
    @PreAuthorize("hasRole('ROLE_OWNER')")
    public String editPost(Model model, Principal principal,  HttpServletRequest request{

        //Admin Users does not have access to post edit page
        if (request.isUserInRole("ROLE_ADMIN")) {
            return TemplateNamesConstants.POST_WALL;
        }
}

如果发现更好的/替代的解决方案,请更新此线程。