3

SpringSecurityは初めてです。URLベースの認証を行う必要があります。この場合、URLのパラメーターとして毎回送信される一意の参照に基づいて、ユーザーを認証する必要があります。この参照をWebサービスに渡し、必要なデータを取得してから、ユーザーを認証します(そしてロールを設定します)。認証と承認の部分は正常に機能しています。

ただし、アプリケーションに再度アクセスしようとすると(URLに別の参照が含まれているため)、「SecurityContextHolderには匿名トークンが既に含まれているため...が入力されていません」と表示され、前のリクエストの詳細が表示されます。SecurityContextHolder.getContext()。setAuthentication(null)とSecurityContextHolder.clearContext()を使用してセキュリティコンテキストをクリアしようとしました。

この後、私はアプリケーションに複数回アクセスすることができました。ただし、同僚のマシンから同時にアプリケーションにアクセスしようとすると、空白のページが表示されます。ログを確認すると、「SecurityContextHolderに匿名トークンが入力されていません...」というメッセージが表示されます。私もセッションを設定しようとしましたが、どこでトラックを失っているのかわかりません。

以下は私のweb.xmlです(春のセキュリティ部分のみ):

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
<listener-class>
          org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<listener>
    <listener-class>
          org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>

<session-config>
<session-timeout>30</session-timeout>
</session-config>

spring-security.xml:

<http use-expressions="true" auto-config="false" entry-point-                   
                            ref="http403ForbiddenEntryPoint">
<intercept-url pattern="/paymentPortalInternal.*" access="hasRole('Internal')"/>
<intercept-url pattern="/paymentPortalExternal.*" access="hasRole('External')"/>

<custom-filter position="PRE_AUTH_FILTER" ref="customAuthenticationFilter"/>
<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
<session-management session-authentication-strategy-ref="sas"/>
</http>

<beans:bean id="concurrencyFilter"
class="org.springframework.security.web.session.ConcurrentSessionFilter">
<beans:property name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="expiredUrl" value="/session-expired.htm" />
</beans:bean>

<beans:bean id="http403ForbiddenEntryPoint"
  class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>
<beans:bean id="customAuthenticationFilter"
  class="com.xxx.xxx.xxxxx.security.CustomAuthenticationFilter">
      <beans:property name="sessionAuthenticationStrategy" ref="sas" />
  <beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>

<beans:bean id="sas" 
              class="org.springframework.security.web.authentication.session.
                                               ConcurrentSessionControlStrategy">
<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="maximumSessions" value="1" />
<beans:property name="exceptionIfMaximumExceeded" value="true" />
</beans:bean>

<beans:bean id="sessionRegistry"    
class="org.springframework.security.core.session.SessionRegistryImpl" />

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="preauthAuthProvider" />
</authentication-manager>

<beans:bean id="preauthAuthProvider" 
                class="org.springframework.security.web.authentication.preauth.
                                       PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService">
    <beans:bean class="com.XXX.XXXX.XXX.UserServiceImpl" />
    </beans:property>
</beans:bean>

さらに情報が必要な場合はお知らせください。

編集:ログの追加。

最初のリクエストの場合:

2013-02-07 17:27:38,834 DEBUG [http-8081-2] [org.springframework.security.web.context.HttpSessionSecurityContextRepository.readSecurityContextFromSession(127)]-現在HttpSessionは存在しません2013-02-07 17:27: 38,834 DEBUG [http-8081-2] [org.springframework.security.web.context.HttpSessionSecurityContextRepository.loadContext(85)]-HttpSessionから使用できるSecurityContextがありません:null。新しいものが作成されます。

2番目のリクエストの場合(セキュリティコンテキストの詳細は最初のリクエストの詳細であることに注意してください):

2013-02-07 17:27:54,272 DEBUG [http-8081-2] [org.springframework.security.web.context.HttpSessionSecurityContextRepository.readSecurityContextFromSession(158)]-SPRING_SECURITY_CONTEXTから有効なSecurityContextを取得しました:'org.springframework.security .core.context.SecurityContextImpl @ 1017293c:認証:org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken @ 1017293c:プリンシパル:org.springframework.security.core.userdetails.User@35cd3811:ユーザー名:Internal @ 55881e6e1-7e61 -41bb-9257-b3c1acb96519; 守られたパスワード]; 有効:true; AccountNonExpired:true; 資格情報NonExpired:true; AccountNonLocked:true; 付与された権限:内部; クレデンシャル:[保護]; 認証済み:true; 詳細:org.springframework.security.web.authentication.WebAuthenticationDetails@ffffc434:RemoteIpAddress:10.188。182.107; SessionId:null; 付与された権限:内部 '

私の理解では、セキュリティコンテキストホルダーはすべてのユーザーの詳細を保存します。しかし、この場合、別のタブ/ブラウザからアプリケーションを起動することはできません。

4

2 に答える 2

1

CustomAuthenticationFilterが拡張されている場合はAbstractPreAuthenticatedProcessingFilter、次の2つのプロパティから洞察を得ることができます。1.2 checkForPrincipalChangesinvalidateSessionOnPrincipalChange

于 2013-02-07T16:16:42.943 に答える
1

デフォルトのフィルターチェーン(フィルターチェーンプロキシを使用)をオーバーライドし、必要なフィルターのみを呼び出すことで、この問題を修正することができました。LukeTaylorとKetanに提案してくれてありがとう。同じ問題が発生した場合はお知らせください。XMLやその他のものを投稿できます。

于 2013-02-18T10:00:00.033 に答える