奇怪的一个,
我正在使用带有 siteminder 的 spring security,它工作正常。但是我想要一个不受保护的 url - 我们的 loadBalancer 需要在应用程序本身内有一个“healthCheck” url。这个 url 没有被 siteminder 拦截,但是 spring security 似乎无论如何都对其应用了 preauth ..
如果我使用简单的基于表单的安全配置在本地运行它,则以下工作(不包括过滤器):
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/html/healthCheck.html" filters="none" />
<intercept-url pattern="/css/**" filters="none" />
<intercept-url pattern="/images/**" filters="none" />
<intercept-url pattern="/js/**" filters="none" />
<intercept-url pattern="/login" filters="none" />
<intercept-url pattern="/favicon.ico" filters="none" />
<intercept-url pattern="/*" access="hasAnyRole('ROLE_USER')" />
<form-login login-page="/login" default-target-url="/" authentication-failure-url="/loginfailed" />
<logout logout-success-url="/logout" />
</http>
在这种情况下,我可以浏览到 localhost/myApp/resources/html/healthCheck.html 而不会遇到授权问题,但任何其他 url 都会显示登录表单。到目前为止一切都很好!
但是,当我部署到服务器时,我使用以下配置:
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/html/healthCheck.html" filters="none" />
<intercept-url pattern="/css/**" filters="none" />
<intercept-url pattern="/images/**" filters="none" />
<intercept-url pattern="/js/**" filters="none" />
<intercept-url pattern="/login" filters="none" />
<intercept-url pattern="/favicon.ico" filters="none" />
<intercept-url pattern="/*" access="hasAnyRole('ROLE_USER')" />
<custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
</http>
当我浏览到: server/myapp/resources/html/healthCheck.html 我收到以下错误:
java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor
org.springframework.security.core.userdetails.User.<init>(User.java:94)
com.myApp.security.SecuritySBSUserDetailsService.loadUserByUsername(SecuritySBSUserDetailsService.java:119)
org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper.loadUserDetails(UserDetailsByNameServiceWrapper.java:53)
我认为这是由于 UserDetailsService 在没有任何 SM_USER 的情况下被实例化引起的。然而 filters=none 已经到位..并且在使用表单身份验证时工作..知道是什么可能导致这种情况,或者更好的解决方法吗?
顺便说一下,我的 userdetails 服务配置如下:
<beans:bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<beans:property name="principalRequestHeader" value="SM_USER" />
<beans:property name="exceptionIfHeaderMissing" value="false" />
<beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>
即我已将 exceptionIfHeaderMissing 设置为 false,如果这有帮助..