为什么我基于 Acegi 的登陆没反应?
在下是一 Acegi 菜鸟,刚学习没多久。仿照网上的资料做了一个 Acegi 登陆的测试页面,但好像不起作用,对要保护的资源确实进行了过滤,不经登陆不能访问,但是我现在登陆不了,输入登陆信息后总是被返回到登陆页面。大家能否帮忙看看究竟是哪里出了问题?
我的 Acegi 配置信息如下:
- XML code
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"> <property name="authenticationManager" ref="authenticationManager" /> <property name="authenticationFailureUrl" value="/login.html" /> <property name="defaultTargetUrl" value="/admin/admin.html" /> <property name="filterProcessesUrl" value="j_acegi_security_check" /> </bean> <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"> <property name="providers"> <list> <ref local="daoAuthenticationProvider" /> </list> </property> </bean> <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="inMemoryDaoImpl" /> </bean> <bean id="inMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl"> <property name="userMap"> <value> demo=demo,ROLE_USER user=user,ROLE_USER admin=admin,ROLE_SUPERVISOR </value> </property> </bean> <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"> <property name="authenticationEntryPoint"> <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"> <property name="loginFormUrl" value="/login.html" /> <property name="forceHttps" value="false" /> </bean> </property> <property name="accessDeniedHandler"> <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl"> <property name="errorPage" value="/accessDenied.html" /> </bean> </property> </bean> <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 /admin/** = ROLE_SUPERVISOR </value> </property> </bean> <bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased"> <property name="allowIfAllAbstainDecisions" value="false" /> <property name="decisionVoters"> <list> <bean class="org.acegisecurity.vote.RoleVoter" /> </list> </property> </bean> <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /** = authenticationProcessingFilter, exceptionTranslationFilter, filterSecurityInterceptor </value> </property> </bean> </beans>
尝试登陆之后好像没什么反应,并没有任何异常,但仍然返回登陆页面, Console 打印的信息如下:
2008-01-01 14:23:34,093 DEBUG [PathBasedFilterInvocationDefinitionMap.java:100] - Converted URL to lowercase, from: '/j_acegi_security_check'; to: '/j_acegi_security_check'
2008-01-01 14:23:34,093 DEBUG [PathBasedFilterInvocationDefinitionMap.java:112] - Candidate is: '/j_acegi_security_check'; pattern is /** ; matched=true
2008-01-01 14:23:34,093 DEBUG [AbstractBeanFactory.java:203] - Returning cached instance of singleton bean 'authenticationProcessingFilter'
2008-01-01 14:23:34,109 DEBUG [AbstractBeanFactory.java:203] - Returning cached instance of singleton bean 'exceptionTranslationFilter'
2008-01-01 14:23:34,109 DEBUG [AbstractBeanFactory.java:203] - Returning cached instance of singleton bean 'filterSecurityInterceptor'
2008-01-01 14:23:34,109 DEBUG [FilterChainProxy.java:270] - /j_acegi_security_check at position 1 of 3 in additional filter chain; firing Filter: 'org.acegisecurity.ui.webapp.AuthenticationProcessingFilter@7ee46a'
2008-01-01 14:23:34,109 DEBUG [FilterChainProxy.java:270] - /j_acegi_security_check at position 2 of 3 in additional filter chain; firing Filter: 'org.acegisecurity.ui.ExceptionTranslationFilter@c62c07'
2008-01-01 14:23:34,109 DEBUG [FilterChainProxy.java:270] - /j_acegi_security_check at position 3 of 3 in additional filter chain; firing Filter: 'org.acegisecurity.intercept.web.FilterSecurityInterceptor@749ebc'
2008-01-01 14:23:34,109 DEBUG [PathBasedFilterInvocationDefinitionMap.java:100] - Converted URL to lowercase, from: '/j_acegi_security_check'; to: '/j_acegi_security_check'
2008-01-01 14:23:34,109 DEBUG [PathBasedFilterInvocationDefinitionMap.java:112] - Candidate is: '/j_acegi_security_check'; pattern is /admin/** ; matched=false
2008-01-01 14:23:34,109 DEBUG [AbstractSecurityInterceptor.java:247] - Public object - authentication not attempted
2008-01-01 14:23:34,140 DEBUG [AbstractApplicationContext.java:244] - Publishing event in context [org.springframework.web.context.support.XmlWebApplicationContext@e0f0ad]: org.acegisecurity.event.authorization.PublicInvocationEvent[source=FilterInvocation: URL: /j_acegi_security_check]
2008-01-01 14:23:34,140 DEBUG [FilterChainProxy.java:261] - /j_acegi_security_check reached end of additional filter chain; proceeding with original chain
2008-01-01 14:23:34,140 DEBUG [ExceptionTranslationFilter.java:113] - Chain processed normally
这是什么原因造成的呢?
[解决办法]
你的配置文件中有两处将跳回到登录界面:
<property name="authenticationFailureUrl" value="/login.html" />
<property name="loginFormUrl" value="/login.html" />
最好把你的异常得到才能知道为什么无法登陆。你可以参考以下示例:
- HTML code
<c:if test="${not empty param.login_error}"> <font color="red"> 登录失败, 再试一次.<BR><BR> 原因:<%= ((AuthenticationException) session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage() %> </font> </c:if>