使用Spring Security进行预身份验证/单点登录

cit*_*ess 3 spring-security single-sign-on pre-authentication

我正在开发两个Web应用程序,其中一个是服务器应用程序,另一个是客户端应用程序,两者都使用Spring Security.我的用例是这样的,用户登录服务器应用程序后,用户可以从服务器应用程序内的链接访问客户端应用程序.由于用户在点击这些链接(我的部分要求)时不必再次登录,因此我决定使用类似于Single SignOn的策略,以便将其身份验证信息从服务器应用转发到客户端应用.

在客户端应用程序上,我使用Spring Security RequestHeaderAuthenticationFilter来查找由服务器应用程序设置的自定义请求标头.

  1. 如果找到此自定义标头,是否必须进一步验证此请求是否值得信任?在Spring的预身份验证文档中, RequestHeaderAuthenticationFilter不执行任何身份验证,并假定请求来自SM_USER属性中指定的用户.我如何确保请求是真实的?

  2. 如何使用http请求中的自定义标头将用户从一个应用程序发送到另一个应用程序?重定向请求不起作用,因为标头信息将丢失.转发不起作用,因为转发的请求不通过客户端应用程序上配置的Spring Security过滤器,因此请求永远不会"经过身份验证",也不会创建会话.

cit*_*ess 5

由于我没有收到任何回复,我稍微改变了我的方法,以实现相同的SSO行为.我在这里回答我自己的问题来解决这个问题.

RequestHeaderAuthenticationFilter我没有使用它,而是AbstractPreAuthenticatedProcessingFilter继承了从HttpRequest中检索Principal和Credentials的Spring .然后我实现了一个自定义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>
Run Code Online (Sandbox Code Playgroud)