java – 带有permitAll()和过期的Auth Token的URL的Spring Security
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 带有permitAll()和过期的Auth Token的URL的Spring Security,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4064字,纯文字阅读大概需要6分钟。
内容图文
![java – 带有permitAll()和过期的Auth Token的URL的Spring Security](/upload/InfoBanner/zyjiaocheng/763/59a689c1b22c4582847a60b07f6c09ab.jpg)
我正在使用带有Spring Security的Spring 4,自定义GenericFilterBean和AuthenticationProvider实现.除了URL以创建新会话之外,我主要保护URL:/ v2 / session(例如,基于用户名和密码登录,并返回Auth Token以在后续请求身份验证的请求中使用),配置如下:
@Configuration
@ComponentScan(basePackages={"com.api.security"})
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private ApiAuthenticationProvider apiAuthenticationProvider;
@Autowired
private AuthTokenHeaderAuthenticationFilter authTokenHeaderAuthenticationFilter;
@Autowired
private AuthenticationEntryPoint apiAuthenticationEntryPoint;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(apiAuthenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.addFilterBefore(authTokenHeaderAuthenticationFilter, BasicAuthenticationFilter.class) // Main auth filter
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.authorizeRequests()
.antMatchers(HttpMethod.POST, "/v2/session").permitAll()
.anyRequest().authenticated();
http.exceptionHandling()
.authenticationEntryPoint(apiAuthenticationEntryPoint);
}
}
authTokenHeaderAuthenticationFilter在每个请求上运行,并从请求标头获取Token:
/**
* Main Auth Filter. Always sets Security Context if the Auth token Header is not empty
*/
@Component
public class AuthTokenHeaderAuthenticationFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
final String token = ((HttpServletRequest) request).getHeader(RequestHeaders.AUTH_TOKEN_HEADER);
if (StringUtils.isEmpty(token)) {
chain.doFilter(request, response);
return;
}
try {
AuthenticationToken authRequest = new AuthenticationToken(token);
SecurityContextHolder.getContext().setAuthentication(authRequest);
}
} catch (AuthenticationException failed) {
SecurityContextHolder.clearContext();
return;
}
chain.doFilter(request, response); // continue down the chain
}
}
自定义apiAuthenticationProvider将尝试根据标头中提供的令牌对所有请求进行身份验证,如果身份验证不成功,则抛出AccessException,客户端将收到HTTP 401响应:
@Component
public class ApiAuthenticationProvider implements AuthenticationProvider {
@Autowired
private remoteAuthService remoteAuthService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
AuthenticationToken authRequest = (AuthenticationToken) authentication;
String identity = null;
try {
identity = remoteAuthService.getUserIdentityFromToken(authRequest.getToken());
} catch (AccessException e) {
throw new InvalidAuthTokenException("Cannot get user identity from the token", e);
}
return new AuthenticationToken(identity, authRequest.getToken(), getGrantedAuthorites());
}
}
这对于需要身份验证的请求非常有效.这适用于/ v2 /会话请求,但不包含Authentication Header.但是,对于在标头中(或在cookie中未显示的代码示例中具有过期的Auth标记的/ v2 /会话请求;如果客户端未清除标头或继续发送带有请求的cookie,则有时会发生这种情况; )安全上下文将被初始化,apiAuthenticationProvider将抛出异常并使用HTTP 401响应客户端.
由于/ v2 / session已配置为
http.authorizeRequests()
.antMatchers(HttpMethod.POST, "/v2/session").permitAll()
我希望Spring Security在调用ApiAuthenticationProvider.authenticate()之前确定它.过滤器或身份验证提供程序应该忽略/不抛出配置为permitAll()的URL的异常的方式是什么?
解决方法:
在执行请求授权检查之前,会触发Spring安全筛选器.要使授权检查起作用,假定请求已通过过滤器并且已设置Spring安全上下文(或不设置,具体取决于是否已传入身份验证凭据).
在过滤器中,如果令牌不存在,则检查是否继续进行过滤器链处理.不幸的是,如果是,那么它将被传递给您的提供者进行身份验证,这会引发异常,因为令牌已过期,因此您获得了401.
您最好的选择是绕过您认为公开的URL的过滤器执行.您可以在过滤器本身或配置类中执行此操作.将以下方法添加到SecurityConfig类:
@Override
public void configure(WebSecurity webSecurity) {
webSecurity.ignoring().antMatchers(HttpMethod.POST, "/v2/session");
}
这将做什么,完全绕过您的AuthTokenHeaderAuthenticationFilter POST / v2 / sessions URL.
内容总结
以上是互联网集市为您收集整理的java – 带有permitAll()和过期的Auth Token的URL的Spring Security全部内容,希望文章能够帮你解决java – 带有permitAll()和过期的Auth Token的URL的Spring Security所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。