如何使用HttpSecurity(Spring Security)应用角色?

时间:2014-03-29 23:44:58

标签: java spring configuration spring-security

我正在使用Spring Security 3.2.3.RELEASE

这是我的WebSecurityConfigurerAdapter的代码

@Configuration
@EnableWebSecurity
public class WebSecurityContext extends WebSecurityConfigurerAdapter {

private static final Logger log = LogManager.getLogger(WebSecurityContext.class);

@Autowired
private AuthenticationProvider authenticationProvider;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    log.info("Setting AuthenticationManagerBuilder");
    auth.authenticationProvider(authenticationProvider);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    log.info("Configuring HttpSecurity");
    http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/**").hasRole("USER")
                .anyRequest().authenticated()
                .and()
                .httpBasic();

}
}

结果是:HTTP状态403 - 访问被拒绝

但如果我评论这一行:

//.antMatchers("/**").hasRole("USER")

一切正常。这意味着(我猜)我的角色或HttpSecurity出了问题。

所以我开始调试了。我仔细检查我的UserDetails是否有两个带有名称的GrantedAuthorities:ADMIN,USER。

那么任何想法可能会导致什么问题?

2 个答案:

答案 0 :(得分:11)

从方法hasRole(String role)的javadoc:

  

指定网址的快捷方式需要特定的角色。如果你不   希望自动插入“ ROLE _ ”,请参阅hasAuthority(String)

因此,您可以使用hasAuthorityhasAnyAuthority代替

答案 1 :(得分:1)

回答我自己的问题

显然,Spring Security会自动为每个角色名称添加前缀ROLE_。因此,在我的数据库中为每个角色名称添加ROLE_前缀解决了这个问题。