Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Acegi Logout Filter не работает


Автор: Nuru 25.1.2008, 12:26
Люди! Подскажите! Использую BasicProcessingFilter для авторазации. Всё работает прекрасно. Кроме LogoutFilter

Т.е. он работает ) Он прибиндился к нужному адресу (j_acegi_logout) и нормально редиректит на указаную страницу, как будто логаут прошёл, но сессия при этом не диспоузится =\ В чем может быть проблема?

Код самого логаут фильтра:
Код


    <bean id="logoutFilter"
        class="org.acegisecurity.ui.logout.LogoutFilter">
        <constructor-arg index="0" value="/index.htm" />
        <constructor-arg index="1">
            <list>
                <bean
                    class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
            </list>
        </constructor-arg>
    </bean>



Объявление ProxyChain: 

Код


    <!-- FilterChainProxy -->
    <bean id="filterChainProxy"
        class="org.acegisecurity.util.FilterChainProxy">
        <property name="filterInvocationDefinitionSource">
            <value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT
                 /**=httpSessionIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor
            </value>
        </property>
    </bean>

Автор: Llucas 25.1.2008, 18:21
Скорее всего ошибка в обяъвлении ProxyChain.


Код

<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
        <property name="filterInvocationDefinitionSource">
            <value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON                
                PATTERN_TYPE_APACHE_ANT
                /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor
            </value>
        </property>
    </bean>



Попробуй так.

Автор: Nuru 26.1.2008, 01:33
Неа ) та же история )

Автор: Zamuta 26.1.2008, 11:38
Nuru, показывай весь applicationContext.xml.

Автор: Nuru 26.1.2008, 18:04
mySpring-security.xml:

Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- #Acegi Security Start# -->

    <!-- Login Providers Manager -->

    <bean id="authenticationManager"
        class="org.acegisecurity.providers.ProviderManager">
        <property name="providers">
            <list>
                <ref bean="daoAuthenticationProvider" />
            </list>
        </property>
    </bean>

    <bean id="daoAuthenticationProvider"
        class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
        <property name="userDetailsService">
            <ref local="inMemoryDao" />
        </property>
    </bean>

    <bean id="inMemoryDao"
        class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
        <property name="userMap">
            <value>
                Nuru=pass,ROLE_PRESIDENT 
                Eng=pass,ROLE_DIRECTOR
            </value>
        </property>
    </bean>

    <!-- Access Decision Manager -->
    <bean id="accessDecisionManager"
        class="org.acegisecurity.vote.AffirmativeBased">
        <property name="decisionVoters">
            <list>
                <bean id="roleVoter"
                    class="org.acegisecurity.vote.RoleVoter">
                    <property name="rolePrefix">
                        <value>ROLE_</value>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

    <!-- FilterChainProxy -->
    <bean id="filterChainProxy"
        class="org.acegisecurity.util.FilterChainProxy">
        <property name="filterInvocationDefinitionSource">
            <value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT
                /**=httpSessionIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor
            </value>
        </property>
    </bean>

    <!-- =======================Filters======================= -->

    <!-- Session integration Filter -->
    <bean id="httpSessionIntegrationFilter"
        class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" />

    <bean id="logoutFilter"
        class="org.acegisecurity.ui.logout.LogoutFilter">
        <constructor-arg index="0" value="/index.htm" />
        <constructor-arg index="1">
            <list>
            <ref bean="rememberMeServices"/> 
                <bean
                    class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
            </list>
        </constructor-arg>
    </bean>
    
    <bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/>
    
    <!-- Authentication - processing filter -->
    <bean id="authenticationEntryPoint"
        class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
        <property name="realmName" value="GoreObsessed" />
    </bean>

    <bean id="authenticationProcessingFilter"
        class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">
        <property name="authenticationManager"
            ref="authenticationManager" />
        <property name="authenticationEntryPoint"
            ref="authenticationEntryPoint" />
    </bean>
    
    <!-- Anonymous processing filter -->
    <bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
        <property name="key" value="changeThis"/>
        <property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS"/>
    </bean>

    <!-- RememberMeServices -->
    <bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
        <property name="authenticationManager" ref="authenticationManager"/>
        <property name="rememberMeServices" ref="rememberMeServices"/>
    </bean>
    
    <bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
        <property name="userDetailsService" ref="inMemoryDao"/>
        <property name="key" value="changeThis"/>
    </bean>
    
    <!-- ExceptionTranslationFilter -->
    <bean id="exceptionTranslationFilter"
        class="org.acegisecurity.ui.ExceptionTranslationFilter">
        <property name="authenticationEntryPoint"
            ref="authenticationEntryPoint" />
        <property name="accessDeniedHandler">
            <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">        
            <property name="errorPage" value="/error.htm" />
            </bean>
        </property>
    </bean>

    <!-- Security Interceptor Filter -->
    <bean id="filterSecurityInterceptor"
        class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
        <property name="authenticationManager"
            ref="authenticationManager" />
        <property name="accessDecisionManager"
            ref="accessDecisionManager" />
        <property name="objectDefinitionSource">
            <value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT 
                /wizards/*=ROLE_PRESIDENT
                /**=ROLE_ANONYMOUS,ROLE_DIRECTOR
            </value>
        </property>
    </bean>


</beans>

Автор: Zamuta 26.1.2008, 21:41
Nuru, явной ошибки не нашёл. 

Попробуй поиграться с путями j_acegi_logout от корня. Если заходишь "внутрь", то это уже будет ../../j_acegi_logout. 
Попробуй настроить log4j. Сделай rootlogger = WARN и посмотри что пишет acegi, там много полезной информации.

И если всё равно не получится, попробуй сделать
Код

public String logout() {
        final HttpServletRequest request = getRequest();
        request.getSession(false).removeAttribute(HttpSessionContextIntegrationFilter.ACEGI_SECURITY_CONTEXT_KEY);
        SecurityContextHolder.clearContext();
        SecurityContextHolder.getContext().setAuthentication(null);
        request.getSession(false).invalidate();        
        return "logout";
    }


Сообщай о результатах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)