我想保护REST API。规则很简单。
/api/authenticate
以获取令牌/api/authenticate
收到)来访问API /api/**
/api/authenticate
仅接受HTTP基本身份验证(无令牌身份验证)/api/**
(不包括/api/authenticate
)仅接受令牌身份验证(无基本身份验证)我实际上是用这个:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private TokenAuthenticationProvider tokenAuthenticationProvider;
@Override
protected void configure(final HttpSecurity httpSecurity) throws Exception {
httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
httpSecurity.headers().disable();
httpSecurity.setSharedObject(TokenAuthenticationProvider.class, this.tokenAuthenticationProvider);
httpSecurity.antMatcher("/api/authenticate").httpBasic();
httpSecurity.antMatcher("/api/**").apply(new TokenAuthenticationConfigurer());
httpSecurity.authorizeRequests()
.antMatchers("/api/**").authenticated()
.anyRequest().permitAll();
}
}
实际上,如果我向/api/authenticate
发送带有令牌的请求,我的配置会接受请求。我认为这是因为/api/authenticate
是/api/**
的一部分。所以我需要排除这个路径进行令牌认证。
我该怎么做?
编辑1
如果我使用.and()
流畅的风格,结果完全相同。
@Override
protected void configure(final HttpSecurity httpSecurity) throws Exception {
httpSecurity.setSharedObject(TokenAuthenticationProvider.class, this.tokenAuthenticationProvider);
httpSecurity
.headers().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.antMatcher("/api/authenticate").httpBasic()
.and()
.antMatcher("/api/**").apply(new TokenAuthenticationConfigurer())
.and()
.authorizeRequests().antMatchers("/api/**").authenticated().anyRequest().permitAll();
}
编辑2
据我了解SecurityBuilder
(HttpSecurity
),antMatcher(...)
方法中configure(...)
的每次调用都会覆盖之前的调用。在调试日志中,我可以看到,Spring Security始终尝试将请求路径与/api/**
匹配,但永远不会再次/api/authenticate
。如果我切换订单,我再也无法访问API,只有/api/authenticate
,因为Spring Security现在总是尝试再次匹配/api/authenticate
。
所以问题是:我如何注册多个规则:
/api/authenticate
- > HttpBasicConfigurer
(.http()
)/api/**
- > TokenAuthenticationConfigurer
(已配置我的令牌身份验证,.apply(...)
)答案 0 :(得分:0)
也许是因为你总是覆盖父级的配置而你不使用and()
方法:
使用and()方法表示关闭XML标记的Java配置,它允许我们继续配置父标记。如果您阅读代码,它也是有道理的。我想配置授权请求并配置表单登录并配置HTTP基本身份验证。
http://docs.spring.io/spring-security/site/docs/current/reference/html/jc.html#jc-httpsecurity