Почему я не получаю сообщения об ошибках входа в Spring Security? - PullRequest
4 голосов
/ 07 октября 2010

Используя Spring Security 3 вместе со Struts 2 и Tiles 2, у меня есть страница входа в систему, которая появляется, когда она должна, и выполняет вход в систему, как ожидается, однако, когда я ввожу неверные учетные данные пользователя, я возвращаюсь на страницу входа снет информации о том, что пошло не так.Я проверил все свои параметры конфигурации и не вижу, в чем проблема.

Моя конфигурация Spring Security XML выглядит следующим образом:

 <http auto-config="true" use-expressions="true">
    <intercept-url pattern="/" access="permitAll" />
    <intercept-url pattern="/css/**" access="permitAll" />
    <intercept-url pattern="/images/**" access="permitAll" />
    <intercept-url pattern="/js/**" access="permitAll" />
    <intercept-url pattern="/public/**" access="permitAll" />
    <intercept-url pattern="/home/**" access="permitAll" />
    <intercept-url pattern="/user/**" access="hasRole('AUTH_MANAGE_USERS')" />
    <intercept-url pattern="/group/**" access="hasRole('AUTH_MANAGE_USERS')" />
    <intercept-url pattern="/**" access="isAuthenticated()" />
    <access-denied-handler error-page="/403.html"/>
    <form-login  login-page="/public/login.do" always-use-default-target="false"/>
    <logout invalidate-session="true" logout-success-url="/public/home.do"/>
</http>

Мое действие Struts выглядит следующим образом:

<package name="public" namespace="/public" extends="secure">
    <action name="login">
        <result name="success" type="tiles">tiles.login.panel</result>
        <result name="input" type="tiles">tiles.login.panel</result>
        <result name="error">/WEB-INF/jsp/error.jsp</result>
    </action>
    <action name="logout">
        <result name="success" type="redirect">/j_spring_security_logout</result>
    </action>
</package>

И страница login.jsp (часть тайла) ищет исключение из Spring Security ...

<c:if test="${not empty param.login_error}">
   <span class="actionError">
   Your login attempt was not successful, try again.<br/><br/>
        Reason: <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}"/>.
  </span>
</c:if>
<form id="loginForm" name="loginForm" action="/j_spring_security_check" method="post">
  ...
</form>

Может кто-нибудь сказать мне, что мне не хватает?Заранее благодарим за любые / все ответы.

Ответы [ 2 ]

7 голосов
/ 07 октября 2010

Spring Security не устанавливает param.login_error автоматически. Вы должны сделать это вручную следующим образом:

<form-login  
    login-page="/public/login.do" 
    authentication-failure-url = "/public/login.do?login_error=1"
    always-use-default-target="false"/>
1 голос
/ 26 апреля 2013

Одним из предложений по преобразованию сообщений об ошибках, как в последнем комментарии, является использование AuthenticationFailureHandler для сопоставления различных типов исключений с различными кодами ошибок, для которых код пользовательского уровня может искать уникальные сообщения. Похоже:

<security:form-login login-page="/login" 
    authentication-failure-handler-ref="authenticationFailureHandler"/>

<bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
    <property name="defaultFailureUrl" value="/login?reason=login_error"/>
    <property name="exceptionMappings">
        <map>
        <entry><key><value>org.springframework.security.authentication.LockedException</value></key>
            <value>/login?reason=user_locked</value></entry>

            <entry><key><value>org.springframework.security.authentication.DisabledException</value></key>
            <value>/login?reason=user_disabled</value></entry>

            <entry><key><value>org.springframework.security.authentication.AuthenticationServiceException</value></key>
            <value>/login?reason=connection</value></entry>
        </map>
    </property>
</bean>
...