3

Spring ベースのアプリでユーザーの事前認証に問題があります。

これが私のシナリオです。従業員用と顧客用の 2 つの CustomUserDetailsS​​ervices があります。私のサーバーの前には、クライアント要求の Http ヘッダーに 2 つのヘッダー情報を追加するプロキシが実装されています。Header_Atheamと を呼び出しましょうHeader_B

その春のセキュリティに次の手順を実行してもらいたい:

  1. を取得してHeader_Aで使用しEmployeeUserDetailsService、メソッドを呼び出しますloadUserByUsername(String name)。ユーザーが見つかった場合は、認証してアプリへのアクセスを許可します。
  2. Header_Bユーザーが見つからない場合(従業員として識別されない場合)、そのセキュリティに を取得してで使用してもらいたいCustomerUserDetailsServiceです。

私は次のことを試しましたが、うまくいきますが、回避策があります(回避策を実行したくありません):

<sec:http use-expressions="true" access-denied-page="/denied.jsp" entry-point-ref="http403EntryPoint">
    <sec:intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 
    <sec:custom-filter after="PRE_AUTH_FILTER" ref="customerFilter" />
    <sec:custom-filter position="PRE_AUTH_FILTER" ref="employeeFilter" />
    <sec:logout delete-cookies="true" invalidate-session="true" logout-success-url="/" />
</sec:http>
<bean id="employeeFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
    <property name="principalRequestHeader" value="Header_A"/>
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="exceptionIfHeaderMissing" value="false"/>
</bean> 
<bean id="customerFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
    <property name="principalRequestHeader" value="Header_B"/>
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="exceptionIfHeaderMissing" value="false"/>
</bean>
<bean id="employeePreAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
    <property name="throwExceptionWhenTokenRejected" value="false" />
    <property name="preAuthenticatedUserDetailsService">
        <bean id="userDetailsServiceWrapper"  class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
            <property name="userDetailsService" ref="employeeUserDetailsService"/>
        </bean>
    </property>
</bean>
<bean id="customerPreAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
    <property name="throwExceptionWhenTokenRejected" value="false" />
    <property name="preAuthenticatedUserDetailsService">
        <bean id="userDetailsServiceWrapper"  class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
            <property name="userDetailsService" ref="customerUserDetailsService"/>
        </bean>
    </property>
</bean>
<sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider ref="employeePreAuthProvider" />
    <sec:authentication-provider ref="customerPreAuthProvider" />
</sec:authentication-manager>    
<bean id="customerUserDetailsService" class="xxx.CustomerUserDetailsService"/>
<bean id="employeeUserDetailsService" class="xxx.EmployeeUserDetailsService"/>

このことは次のことを行います。

  1. Header_A を受け取り、EmployeeUserDetailsS​​ervice で使用します
  2. Header_B を受け取り、EmployeeUserDetailsS​​ervice で使用します
  3. Header_A を受け取り、CustomerUserDetailsS​​ervie で使用します
  4. Header_B を受け取り、CustomerUserDetailsS​​ervie で使用します

私が行う回避策は、ヘッダーの長さを確認し (つまり修正します)、返すことです。1 つのヘッダーが間違った UserDetailsS​​ervice にある場合

4

1 に答える 1