在我的Spring-Boot应用程序(资源服务器)中,在某些情况下,我想跳过对Authorization Server的令牌检查。为此,我在Spring-Security过滤器链的SecurityContextPersistenceFilter
之前插入了一个过滤器。
理想情况下,我希望在不满足条件的情况下不要更改(称为授权服务器,根据响应设置身份验证)。我发现,当满足条件时安全上下文将被覆盖,而过滤器什么也不做时会出现问题:在这种情况下,OAuth2AuthenticationProcessingFilter
根本不会出现在链中,而我留下了“匿名用户”。
这是我的自定义过滤器的外观:
public class SessionFilter extends GenericFilterBean {
@Override
public void doFilter(
ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain
) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
String authorizationHeader = httpRequest.getHeader(HttpHeaders.AUTHORIZATION);
if (authorizationHeader != null && meetsCondition(authorizationHeader)) {
SecurityContext sc = SecurityContextHolder.getContext();
sc.setAuthentication(new CustomAuthentication(authorizationHeader));
httpRequest.getSession(true)
.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc);
}
filterChain.doFilter(servletRequest, servletResponse);
}
}
使用WebSecurityConfigurerAdapter
将其扔到链中:
http //...
.and().csrf().disable()
.addFilterBefore(
new SessionFilter(),
SecurityContextPersistenceFilter.class
);
有没有一种方法可以实现使用此方法的目标?我正在将Spring-Boot 1.4.7与Java 8和Spring-Security 4.1.4一起使用(由于该问题之外的原因,无法进行升级)。
我基于我的代码/理解的来源:
答案 0 :(得分:0)
对于您的过滤器,我没有看到任何特别独特或奇怪的东西,因此问题可能不在于过滤器本身,而在于其余的配置。我只有几点笔记
在放入此自定义类之前,您是否已确认OAuth2过滤器工作正常?您是手动添加它还是使用@EnableResourceServer注释添加它?
我注意到您使用GenericFilterBean并手动添加它。我认为Spring Security会自动扫描GenericFilterBeans并将其添加到过滤器链中,以便它可能在您的链中两次出现。
答案 1 :(得分:-1)
我认为问题在于您在WebSecurityConfigurerAdapter中注入会话过滤器的方式。
Bareword "something" not allowed while "strict subs" in use at /tmp/heredoc2.pl line 6.
syntax error at /tmp/heredoc2.pl line 9, near "FOO
close"
Execution of /tmp/heredoc2.pl aborted due to compilation errors.
请参阅此答案以更好地了解如何使用自动接线。 How does autowiring work in Spring?
如果有帮助,您可以尝试使用此代码块。
http //...
.and().csrf().disable()
.addFilterBefore(
new SessionFilter(), // The session filter here is never set in the application context the way you want it to.
SecurityContextPersistenceFilter.class
);