2

認証されていないユーザーによる、ローテーションされたリソースへのリクエストの後、login.jsp ページへのリダイレクトに問題があります。私の JSF 2 Web アプリは WAS 8.5 にデプロイされ、カスタム データベース レルムを使用してカスタム セキュリティ ドメインを設定し、Spring-Security フレームワークを使用した従来の preAuthenticated シナリオの下に立っています。JBoss 6.1.0 ではすべて正常に動作すると述べています!!! さて、私は古典的なフォームベースのログイン(j2ee標準)でアプリをセットアップしました:

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/loginError.jsp</form-error-page>
    </form-login-config>
</login-config>

Spring Securityガイドが示すように、従来のセキュリティ制約構成によるページの保護:

<security-constraint>
    <display-name>Access Agent Security</display-name>
    <web-resource-collection>
        <web-resource-name>Secured resource</web-resource-name>
        <url-pattern>/views/protected/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

私の Spring セキュリティは次のように表示されます。

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"/>

    <bean id="securityInfo" class="it.xxxxxx.common.security.SecurityInfo"/>

    <bean id="securityService" 
          class="org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean">
          <property name="jndiName" value="AccessAgent/SecurityServiceBean/remote"/>
          <property name="businessInterface" value="it.pegaso2000.access.service.bean.SecurityService"/>
    </bean> 

    <bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy">
        <sec:filter-chain-map path-type="ant">
            <sec:filter-chain pattern="/**" filters="sif,j2eePreAuthFilter,logoutFilter,etf,fsi"/>
        </sec:filter-chain-map>
    </bean>

    <bean id="sif" class="org.springframework.security.web.context.SecurityContextPersistenceFilter"/>

    <sec:authentication-manager alias="authenticationManager">
        <sec:authentication-provider ref='preAuthenticatedAuthenticationProvider'/>
    </sec:authentication-manager>

    <bean id="preAuthenticatedAuthenticationProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
        <property name="preAuthenticatedUserDetailsService" ref="preAuthenticatedUserDetailsService"/>
    </bean>


    <bean id="preAuthenticatedUserDetailsService"
            class="it.pegaso2000.access.web.security.auth.PreAuthenticatedUserDetailsService"/>

    <bean id="mappableRolesRetriever"
            class="it.pegaso2000.access.web.security.auth.preauth.j2ee.DatabaseMappableAttributesRetriever"/>



    <bean id="authenticationDetailsSource" class="org.springframework.security.web.authentication.preauth.websphere.WebSpherePreAuthenticatedWebAuthenticationDetailsSource">
        <property name="webSphereGroups2GrantedAuthoritiesMapper">
            <bean class="org.springframework.security.core.authority.mapping.SimpleAttributes2GrantedAuthoritiesMapper">
                <property name="convertAttributeToUpperCase" value="true"/>
            </bean>
        </property>
    </bean>




    <bean id="j2eePreAuthFilter" class="it.xxxxx.access.web.security.auth.preauth.websphere.WebSpherePreAuthenticatedProcessingFilter">
        <property name="authenticationManager" ref="authenticationManager"/>
        <property name="authenticationDetailsSource" ref="authenticationDetailsSource"/>
    </bean>





    <bean id="preAuthenticatedProcessingFilterEntryPoint"
            class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>

    <bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
        <constructor-arg value="/"/>
        <constructor-arg>
            <list>
                <bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>
            </list>
        </constructor-arg>
    </bean>

    <bean id="servletContext" class="org.springframework.web.context.support.ServletContextFactoryBean"/>

    <bean id="etf" class="org.springframework.security.web.access.ExceptionTranslationFilter">
        <property name="authenticationEntryPoint" ref="preAuthenticatedProcessingFilterEntryPoint"/>
    </bean>

    <bean id="httpRequestAccessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
        <property name="allowIfAllAbstainDecisions" value="false"/>
        <property name="decisionVoters">
            <list>
                <ref bean="roleVoter"/>
            </list>
        </property>
    </bean>

    <bean id="securityMetadataSource" class="it.xxxxx.access.web.security.auth.DatabaseFilterInvocationSecurityMetadataSource"/>

    <bean id="fsi" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
        <property name="authenticationManager" ref="authenticationManager"/>
        <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>

        <property name="securityMetadataSource" ref="securityMetadataSource"/>
    </bean>

    <bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter"/>

    <bean id="securityContextHolderAwareRequestFilter" class="org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter"/>

ご覧のとおり、 org.springframework.security.web.authentication.preauth.websphere.WebSpherePreAuthenticatedProcessingFilterをオーバーロードしました。これは、doAuthentication() メソッドが匿名リクエストの場合、WAS から「UNAUTHENTICATED」に等しいプリンシパル値を返し、Spring AbstractPreAuthenticatedProcessingFilter クラスがプリンシパルに一致することに注意したためです。次のようにnullで:

if (principal == null) {
            if (logger.isDebugEnabled()) {
                logger.debug("No pre-authenticated principal found in request");
            }
    enter code here
    return;
}

その結果、ユーザーが匿名の場合、return ステートメントは実行されません。

しかし、これは私の問題を解決しません...保護されたリソースに対して認証されていないユーザー要求が行われた場合、コンテナー (WAS) を login.jsp ページにリダイレクトしたいと思います。私の構成が欠けているのは何ですか?このシナリオは JBoss 6 で正常に動作します。

前もって感謝します !!

4

0 に答える 0