如何使用Spring Security手动验证用户的方法示例
1.概述
在这篇快速文章中,我们将 重点介绍如何以编程方式在spring security和spring mvc中设置经过身份验证的用户 。
2. spring security
简而言之, spring security在threadlocal中保存每个经过身份验证的用户的主要信息 - 保存的是authentication对象 。
为了构造和设置此authentication对象, 通常我们需要使用spring security在标准身份验证上构建对象的相 同方法。
要让我们手动触发身份验证, 然后将生成的身份验证对象设置为框架用来保存当前登录用户的当前securitycontext :
usernamepasswordauthenticationtoken authreq = new usernamepasswordauthenticationtoken(user, pass); authentication auth = authmanager.authenticate(authreq); securitycontext sc = securitycontextholder.getcontext(); securitycontext.setauthentication(auth);
在上下文中设置身 份验证后,我们现在可以使用securitycontext.getauthentication()。isauthenticated()检查当前用户是否经过身份验证 。
3. spring mvc
默认情况下,spring security 在spring security过滤器链中添加了一个额外的过滤器。它能够持久化security 上下 文(securitycontextpersistencefilter类)。
反过来, 它将security上下文的持久性委托给securitycontextrepository的实例,默认为httpsessionsecuritycontextrepository 类。
因此,为了 在请求上设置身份验证并因此使其可用于来自客户端的所有后续请求,我们需要在http会话中手动设置包含身份验证的securitycontext :
public void login(httpservletrequest req, string user, string pass) { usernamepasswordauthenticationtoken authreq = new usernamepasswordauthenticationtoken(user, pass); authentication auth = authmanager.authenticate(authreq); securitycontext sc = securitycontextholder.getcontext(); sc.setauthentication(auth); httpsession session = req.getsession(true); session.setattribute(spring_security_context_key, sc); }
spring_security_context_key是静态导入的httpsessionsecuritycontextrepository.spring_security_context_key。
应该注意 的是,我们不能直接使用httpsessionsecuritycontextrepository - 因为它与securitycontextpersistencefilter一起 使用。
这是因为过滤 器使用存储库来加载和存储security上下文在前,在链中执行其余已定义的过滤器在后,但是它在传递给链的响应上使用自定义 包装器。。
因此,在这种情况下,您应该知道所使用的包装器的类类型,并将其传递给存储库中的相应save方法。
4.总结
在这个快速教程中,我们讨论了如何在spring security上下文中手动设置用户身份验证以及如何使其可用于spring mvc的目标。专注于代码示例,说明实现它的最简单 方法。
与往常一样,可以 在github上找到代码 示例。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。