使用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。任何人都面临类似的问题?
答案 0 :(得分:2)
我很确定Spring Expression Language(SPEL)支持NOT-sign(!
)。当然,它会返回boolean
结果。
// 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;
}
}
如果发现更好的/替代的解决方案,请更新此线程。