Spring 安全认证:获取没有 SPRING_SECURITY_LAST_USERNAME 的用户名
Posted
技术标签:
【中文标题】Spring 安全认证:获取没有 SPRING_SECURITY_LAST_USERNAME 的用户名【英文标题】:Spring security authentication: get username without SPRING_SECURITY_LAST_USERNAME 【发布时间】:2013-02-09 18:19:54 【问题描述】:我是 Spring 框架的新手。我正在为我的 web 应用程序创建一个登录页面,并且我希望用户在对应用程序进行任何操作之前登录。如果用户输入了良好的凭据,一切都可以正常工作,但如果输入错误的凭据,我想显示一条消息并将用户名保留在输入元素上。显示消息不是问题,但如果不使用已弃用的变量 SPRING_SECURITY_LAST_USERNAME,我无法将用户名保留在我的 jps 文件中。
希望有人可以帮助我,我正在使用 Spring 3。
更新:要求说我不想在 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"/>"/>
【讨论】:
没问题。请注意,在某些方面还有改进的空间。例如。在 .jsp 中硬编码会话属性的名称并不优雅。理想情况下,它应该引用UserNameCachingAuthenticationFailureHandler
中定义的常量。 (我必须管理我不知道如何实现这种间接性。)
我不知道这可以实现!但现在这就是我所需要的,这不是安全性,而是让用户生活更美好的一个小技巧!令人难以置信的是,我在任何地方都找不到像这样的简单解决方案! ;)
只是我,还是只是为了将用户名输入保留在表单上而编写的一大堆代码?
request.getParameter("j_username")
也可以从RedirectStrategy.sendRedirect()
方法中成功调用,如果您将其实现为自定义bean(实际上这个bean 是AuthenticationFailureHandler
类/bean 的成员变量/字段)。
usernamePasswordAuthenticationFilter 为空。 Spring Security 4. 我该如何解决这个问题?【参考方案2】:
如果有人来到这里遇到 Grails Spring 安全问题。您现在可以使用以下内容-
import grails.plugin.springsecurity.SpringSecurityUtils;
现在使用SpringSecurityUtils.SPRING_SECURITY_LAST_USERNAME_KEY
这将起作用并且不会被弃用。
【讨论】:
以上是关于Spring 安全认证:获取没有 SPRING_SECURITY_LAST_USERNAME 的用户名的主要内容,如果未能解决你的问题,请参考以下文章
Spring 安全重定向到登录页面以获取经过身份验证的 url