hasRole()和hasPermission()Web安全表达式如何工作?

时间:2016-05-04 15:10:29

标签: java spring spring-security

这些实际上是两个问题,因为它在Spring Security参考中没有得到很好的解释。第一个问题是,在我的配置中,我有一个这样的代码:

 @Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
                .antMatchers("/admin").hasRole("ADMIN")
                .antMatchers("/admin").access("hasRole('ADMIN')");

然后Spring在哪里寻找当前用户在这两种情况下的角色?它是否可能在UserDetailsS​​ervice上调用loadUserByUsername()方法,然后在获取的UserDetails上调用getAuthorities()?

我的第二个问题是关于hasPermission()表达式。假设我有一个自定义的PermissionEvaluator,有没有办法使它在配置类中工作,例如:

 @Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
                .antMatchers("/admin").access("hasPermission(...)")

或者这是一个仅适用于方法级别的表达式吗?

1 个答案:

答案 0 :(得分:0)

回答您的第二个问题:是的,您可以使用自己的PermissionEvaluator和HttpSecurity。首先,您必须定义WebSecurityExpressionHandler,如

final DefaultWebSecurityExpressionHandler webSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();           
webSecurityExpressionHandler.setPermissionEvaluator(myPermissionEvaluator);

或像豆子一样:

@Bean
public DefaultWebSecurityExpressionHandler webExpressionHandler(PermissionEvaluator myPermissionEvaluator) {
    final DefaultWebSecurityExpressionHandler webSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
    webSecurityExpressionHandler.setPermissionEvaluator(siraPermissionEvaluator);
    return webSecurityExpressionHandler;
}

/*this option then needs to autowire the bean*/

然后将其与HttpSecurity一起使用,如:

http.authorizeRequests().expressionHandler(webSecurityExpressionHandler)
.antMatchers("/admin").access("hasPermission(...)");