Spring аутентификация безопасности: получите имя пользователя без SPRING_SECURITY_LAST_USERNAME

Я новичок в spring. Я создаю страницу входа для своего webapp, и я хочу, чтобы пользователь заходил в систему перед любыми действиями в приложении. Если пользователь вводит хорошие учетные данные, все это нормально и работает, но если вы входите в плохие, я хочу отобразить сообщение и сохранить имя пользователя в элементе ввода. Отображение сообщения не является проблемой, но я не могу сохранить имя пользователя в своем jps файле без использования устаревшей переменной SPRING_SECURITY_LAST_USERNAME.

Надеюсь, кто-то может мне помочь, я использую spring 3.

UPDATE: требования говорят, что я не хочу отображать имя пользователя на URL.

Ответ 1

Документация устаревшей константы сообщает точно, что вы должны делать:

/**
 * @deprecated If you want to retain the username, cache it in a customized {@code AuthenticationFailureHandler}
 */
@Deprecated
public static final String SPRING_SECURITY_LAST_USERNAME_KEY =
           "SPRING_SECURITY_LAST_USERNAME";

Что-то вроде этого:

public class UserNameCachingAuthenticationFailureHandler
    extends SimpleUrlAuthenticationFailureHandler {

    public static final String LAST_USERNAME_KEY = "LAST_USERNAME";

    @Autowired
    private UsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter;

    @Override
    public void onAuthenticationFailure(
            HttpServletRequest request, HttpServletResponse response,
            AuthenticationException exception)
            throws IOException, ServletException {

        super.onAuthenticationFailure(request, response, exception);

        String usernameParameter =
            usernamePasswordAuthenticationFilter.getUsernameParameter();
        String lastUserName = request.getParameter(usernameParameter);

        HttpSession session = request.getSession(false);
        if (session != null || isAllowSessionCreation()) {
            request.getSession().setAttribute(LAST_USERNAME_KEY, lastUserName);
        }
    }
}

В вашей конфигурации безопасности:

<security:http ...>
    ...
    <security:form-login
        authentication-failure-handler-ref="userNameCachingAuthenticationFailureHandler"
    ...
    />
</security:http>

<bean 
    id="userNameCachingAuthenticationFailureHandler"
    class="so.UserNameCachingAuthenticationFailureHandler">
    <property name="defaultFailureUrl" value="/url/to/login?error=true"/>
</bean>

В вашем login.jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="true" %>

...

<%--in the login form definition--%>
<input id="j_username" name="j_username" type="text" 
    value="<c:out value="${sessionScope.LAST_USERNAME}"/>"/>

Ответ 2

Если кто-то приходит сюда, у кого эта проблема возникает в безопасности Grails Spring. Теперь вы можете использовать следующее -

import grails.plugin.springsecurity.SpringSecurityUtils;

Теперь используйте SpringSecurityUtils.SPRING_SECURITY_LAST_USERNAME_KEY, это будет работать и не устарело.