我试图限制对一个角色的URL的GET访问权限,以及对另一个角色的同一URL的POST访问权限,如下所示。
-v true
当我使用我的readuser帐户尝试GET(或POST)时,我收到拒绝访问错误;但是当我尝试使用管理员帐户时,它可以同时执行这两项操作。
但是,当我删除行@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("password").roles("USER").and()
.withUser("readuser").password("password").roles("USER", "READ").and()
.withUser("admin").password("password").roles("USER", "READ", "WRITE");
}
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin().permitAll().and()
.logout().permitAll().and()
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/api/foo").hasRole("READ")
.antMatchers(HttpMethod.POST, "/api/foo").hasRole("WRITE")
.anyRequest().authenticated()
.and().csrf().disable()
.httpBasic();
时,我的readuser帐户可以使用GET请求正确命中/ api / foo。
如何让Spring Security允许这两种限制?
更新 - 包括相关的弹簧安全调试日志信息
以下是尝试使用readuser时的相关日志:
.antMatchers(HttpMethod.POST, "/api/foo").hasRole("WRITE")
答案 0 :(得分:1)
您使用的是错误的HttpMethod
类。
javax.ws.rs.HttpMethod#GET
会返回String
,因此您在Spring Security配置中使用antMatchers(String... antPatterns)
而不是antMatchers(HttpMethod method, String... antPatterns)
。
使用该配置,Spring Security会检查URL模式GET
和/api/foo
(两者都适用于所有HTTP方法),请参阅日志:
2017-05-08 11:31:27.817 DEBUG 5812 --- [p1731685294-106] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/api/foo'; against 'GET' 2017-05-08 11:31:27.817 DEBUG 5812 --- [p1731685294-106] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/api/foo'; against '/api/foo'
您必须使用org.springframework.http.HttpMethod#GET
,它会返回HttpMethod
个对象。