3

使用 Spring Security 3.1.3.RELEASE

因此,如果有一个角色列表(超过 10 个)并且只需要阻止一个角色访问 Spring Controller 方法。这可以使用 Spring 表达式语言来完成,并且避免列出每个非常受欢迎的角色吗?

例如,通过包含 Not 符号。

@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 to case 上似乎没有任何内容。任何人都面临类似的问题?

4

2 回答 2

3

I'm pretty sure that NOT-sign (!) is supported in Spring Expression Language (SPEL). Naturally, it returns a boolean result.

An Example from the 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);
于 2013-01-10T22:37:11.327 回答
0

在这种情况下,Spring 表达式语言对我不起作用。最初我尝试了以下内容,

@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;
        }
}

如果您找到更好/替代的解决方案,请更新此线程。

于 2019-09-09T11:47:07.940 回答