security如何保存用户信息,如何获取用户信息(一)(含部分securityHolder源码分析)
先贴一段适应性高的代码
@Override
public UmsMember getCurrentMember() {
SecurityContext ctx = SecurityContextHolder.getContext();
Authentication auth = ctx.getAuthentication();
MemberDetails memberDetails = (MemberDetails) auth.getPrincipal();
return memberDetails.getUmsMember();
}
在AbstractAuthenticationToken之前,会经过SecurityContextPersistenceFilter 。
SecurityContextPersistenceFilter 先从HttpSession中读取SecurityContext出来,存入SecurityContextHolder以备后续使用,当请求离开SecurityContextPersistenceFilter的时候,获取最新的SecurityContext并存入HttpSession中,同时清空SecurityContextHolder中的登录信息
但对于我们的前后端分离的情况,一般都用jwt,
而spring security默认用httpSession来保存认证信息。
可以通过WebSecurityConfigurerAdapter#configure的httpSecurity来设置《无会话状态》
@Configuration
public class MySecurityConfiguration extends WebSecurityConfigurerAdapter {
// code...
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
//设置无状态,所有的值如下所示。
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
}
// code...
}
这里要提一下SecurityContextPersistenceFilter的源码,主要关注这一行SecurityContext contextBeforeChainExecution = this.repo.loadContext(holder);
SecurityContext contextBeforeChainExecution = this.repo.loadContext(holder);
try {
SecurityContextHolder.setContext(contextBeforeChainExecution);
if (contextBeforeChainExecution.getAuthentication() == null) {
logger.debug("Set SecurityContextHolder to empty SecurityContext");
}
else {
if (this.logger.isDebugEnabled()) {
this.logger
.debug(LogMessage.format("Set SecurityContextHolder to %s", contextBeforeChainExecution));
}
}
chain.doFilter(holder.getRequest(), holder.getResponse());
}
这个this.repo是一个
private SecurityContextRepository repo;
SecurityContextRepository是操作SecurityContext的mapper,security提供了俩种对SecurityContext的操作实现类(如图)
若开启session(默认),那么每次
- 先从HttpSession中读取SecurityContext出来,存入SecurityContextHolder以备后续使用,当请求离开SecurityContextPersistenceFilter的时候,获取最新的SecurityContext并存入HttpSession中,同时清空SecurityContextHolder中的登录信息
不开启session,那么每次
- 通过SecurityContextHolderStrategy的策略选择,去创建一个空context,存入holder