Spring security表单认证基础上,添加基本认证

451 阅读1分钟

引言

最近有一个需求,就是公开外部api,需要用到基本认证。但是本身已经使用了表单认证,那如何表单认证跟基本认证混合呢。

spring-security.xml中添加基本认证

如下。可以看到Spring security支持多个http标签,分别处理基本认证跟表单认证。添加http-basic,则自动配置基本认证策略。

<!--基本认证 -->
<security:http pattern="/basic/**" use-expressions="true">
    <security:intercept-url pattern="/basic/**" access="isAuthenticated()" />
    <security:http-basic />
</security:http>


<!--表单认证 -->
<security:http pattern="/**" auto-config="true" use-expressions="true">
	<security:csrf disabled="true" />
    <security:intercept-url pattern="/my-login.jsp" access="permitAll" />
    <security:intercept-url pattern="/loginfail.jsp" access="permitAll" />
    <security:intercept-url pattern="/indicator" access="permitAll" />
    <security:intercept-url pattern="/admin/**" access="hasAuthority('admin')"/>
    <security:intercept-url pattern="/**" access="isAuthenticated()" />
    <security:form-login login-page="/my-login.jsp"
    authentication-failure-handler-ref="authenticationFailureHandler"
    authentication-success-handler-ref="authenticationSuccessHandler" />
    <security:logout logout-url="/logout"/>
</security:http>

但是这里有个坑,就是http pattern="/basic/**"这个地方,必须指定pattern属性。

不指定则默认处理/**,也就是所有的url,导致表单认证无效。重启服务器会导致以下错误。


Caused by: java.lang.IllegalArgumentException: A universal match pattern ('/**') is defined before other patterns in the filter chain, causing them to be ignored. Please check the ordering in your namespace or FilterChainProxy bean configuration