在Spring Oauth2 @EnableResourceServer中,如何添加基于角色的请求匹配器

时间:2016-05-23 14:03:15

标签: java spring spring-security spring-boot spring-security-oauth2

我正在尝试为资源提供基于角色的授权。如果我这样做,它可以用于角色

@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .requestMatcher(new OrRequestMatcher(
                        new AntPathRequestMatcher("/hello"),
                        new AntPathRequestMatcher("/user")
                ))
                .authorizeRequests()
                .anyRequest().access("#oauth2.hasScope('read')");
    }

    @Override
    public void configure(ResourceServerSecurityConfigurer resources)
            throws Exception {
        resources.resourceId("openid");
    }

}

如果我使用以下方法,它将无法用于测试资源。

@Override
    public void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
                .requestMatcher(new OrRequestMatcher(
                        new AntPathRequestMatcher("/hello"),
                        new AntPathRequestMatcher("/user")
                ))
                .authorizeRequests()
                .antMatchers("/test").hasRole("ADMIN")
                .anyRequest().access("#oauth2.hasScope('read')");
    }

它完全忽略了基于令牌的授权。我该如何实现呢?我得到的另一个问题是,如果我删除requestMatcher阻止,Oauth客户端无法获取授权代码,在将用户凭据提交到登录表单后,它会再次重新加载登录页面。但是使用前面的代码块,它可以正常工作。我在这里做错了什么?

这是我的安全配置类

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/css/**").permitAll()
                .antMatchers("/js/**").permitAll()
                .antMatchers("/img/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage("/login").permitAll()
                .defaultSuccessUrl("/hello")
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login?logout");
    }
}

1 个答案:

答案 0 :(得分:0)

在spring中使用角色时,必须使用前缀ROLE(例如ROLE_ADMIN)才能使其使用默认设置。