我正在开发一个由注释配置的spring boot web app项目。我成功配置了spring-security,在某些URL上添加了基本身份验证,在其他URL上添加了sso。 但实际上我必须修改这种行为才能实现这个目标:
我的所有网址都由两种身份验证方法保护,以确定使用方式我必须阅读请求的标头:如果有ppauth令牌,我会尝试sso身份验证,如果我有一个授权:基本标题我要尝试Basic auth。在另一种情况下,身份验证失败。
在spring boot文档中,这个例子非常简单,它显示了WebSecurityConfigurerAdapter的用法,实际上我们可以通过不同的URL模式确定身份验证方法,但不能通过其他类似谓词的谓词来确定。
有人有想法吗?
答案 0 :(得分:0)
总有不止一种方法可以做某事。在这种情况下,最简单的方法是编写sso过滤器,使其在没有自定义标头的情况下继续链接,并在基本身份验证过滤器之前将其设置为。然后,如果您的自定义过滤器跳过请求,它将由基本身份验证。
处理答案 1 :(得分:0)
最后我得到了一个解决这个问题的方法,所以我将简要地分享一下:
因此,我们有多种身份验证方式,在几个扩展AbstractPreAuthenticatedProcessingFilter
的类中进行了描述。 (所有这些都不会被添加到过滤器链中)
最重要的是我们得到了MultiAuthModeSecurityFilter
,这个类将被添加到应用程序的过滤器链中:
在configure
WebSecurityConfigurerAdapter
方法内
http.addFilterBefore(new MultiAuthModeSecurityFilter(
FirstSecurityFilter(),
SecondSecurityFilter(),
ThirdSecurityFilter()), RequestCacheAwareFilter.class);
所以MultiAuthModeSecurityFilter
知道我们所有的安全策略,并通过执行以下操作将请求发送到正确的过滤器:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
/*some actions to define the right authMethod to use*/
switch (authMethod) {
case FIRST:
firstFilter.doFilter(servletRequest, servletResponse, filterChain);
break;
case SECOND:
secondFilter.doFilter(servletRequest, servletResponse, filterChain);
break;
case THIRD:
thirdFilter.doFilter(servletRequest, servletResponse, filterChain);
break;
default:
/* throws exception */ break;
}
}
希望这会对你有帮助!