由于我没有收到任何响应,因此我稍微改变了方法以实现相同的 SSO 行为。我在这里回答我自己的问题以结束这个问题。
我没有使用 ,而是对RequestHeaderAuthenticationFilter
Spring 进行了子类化AbstractPreAuthenticatedProcessingFilter
,它从 HttpRequest 中检索 Principal 和 Credentials。然后我实现了一个自定义preAuthenticatedUserDetailsService
,它将在加载 UserDetails 之前使用服务器应用程序验证凭据。
至于 #2,我不再在初始预认证登录请求中使用自定义标头。我只是将主体(用户名)和凭据作为 url 参数附加到客户端应用程序的初始预身份验证“登录”请求。由于两个应用程序之间的通信是通过 SSL 保护的,我认为这应该是安全的。
这是我的安全配置现在的样子:
<b:bean id="http403EntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" />
<b:bean id="navigatorPreAuthFilter" class="com.example.NavigatorPreAuthenticatedProcessingFilter">
<b:property name="authenticationManager" ref="authenticationManager" />
</b:bean>
<http auto-config="false" entry-point-ref="http403EntryPoint">
<custom-filter position="PRE_AUTH_FILTER" ref="navigatorPreAuthFilter" />
<session-management session-fixation-protection="newSession" />
<logout logout-success-url="/logout" delete-cookies="JSESSIONID" />
<intercept-url pattern="/index.jsp" access="ROLE_QUESTIONNAIRE_ASSIGNEE"/>
</http>
<b:bean id="preAuthenticatedUserDetailsService" class="com.example.NavigatorPreAuthenticatedUserDetailsService" />
<b:bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<b:property name="preAuthenticatedUserDetailsService" ref="preAuthenticatedUserDetailsService" />
</b:bean>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="preauthAuthProvider"/>
</authentication-manager>