Spring Security认证:获得用户名不SPRING_SECURITY_LAST_USERN

2019-08-17 03:35发布

我在春天的新框架。 我创建了我的web应用程序的登录页面,我希望用户对应用程序的任何行动之前登录。 如果用户输入凭据好一切它的确定和工作,但如果进入坏的我想显示一条消息,并保持用户名的输入元素上。 显示一个消息是没有问题的,但我不能够保持用户名在我的JPS文件,而无需使用过时的变量SPRING_SECURITY_LAST_USERNAME。

希望有人能帮助我,我使用Spring 3。

UPDATE:要求说我不想显示的URL的用户名。

Answer 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}"/>"/>


Answer 2:

如果有人来这里谁是有Grails的春季安全这个问题。 现在,您可以使用以下各项

import grails.plugin.springsecurity.SpringSecurityUtils;

现在使用SpringSecurityUtils.SPRING_SECURITY_LAST_USERNAME_KEY这将工作,不会被弃用。



文章来源: Spring security authentication: get username without SPRING_SECURITY_LAST_USERNAME