Spring ベースのアプリでユーザーの事前認証に問題があります。
これが私のシナリオです。従業員用と顧客用の 2 つの CustomUserDetailsServices があります。私のサーバーの前には、クライアント要求の Http ヘッダーに 2 つのヘッダー情報を追加するプロキシが実装されています。Header_A
theamと を呼び出しましょうHeader_B
。
その春のセキュリティに次の手順を実行してもらいたい:
- を取得して
Header_A
で使用しEmployeeUserDetailsService
、メソッドを呼び出しますloadUserByUsername(String name)
。ユーザーが見つかった場合は、認証してアプリへのアクセスを許可します。 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"/>
このことは次のことを行います。
- Header_A を受け取り、EmployeeUserDetailsService で使用します
- Header_B を受け取り、EmployeeUserDetailsService で使用します
- Header_A を受け取り、CustomerUserDetailsServie で使用します
- Header_B を受け取り、CustomerUserDetailsServie で使用します
私が行う回避策は、ヘッダーの長さを確認し (つまり修正します)、返すことです。1 つのヘッダーが間違った UserDetailsService にある場合