springboot中使用security进行登录及权限控制可以查看之前的文章,springboot中使用spring-security进行登陆控制
此篇主要介绍在已经使用springsecuriy的项目中如何集成springsession,并利用redis进行session管理。
添加springsession的依赖:
org.springframework.session
spring-session-data-redis
${spring.boot.version}
由于我application.yml中有使用jetcache进行远程redis连接配置,此处使用@value注解直接获取redis端口号等配置信息。进行jedis连接配置,还可以进行一些最大连接数的配置,这里我没有添加,使用默认的就好。
@Configuration
@EnableRedisHttpSession
public class SessionConfig {
@Value("${jetcache.remote.default.host}")
private String redisHost;
@Value("${jetcache.remote.default.port}")
private int redisPort;
@Value("${jetcache.remote.default.password}")
private String redisPwd;
@Bean
public JedisConnectionFactory connectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(redisHost);
redisStandaloneConfiguration.setDatabase(0);
redisStandaloneConfiguration.setPassword(RedisPassword.of(redisPwd));
redisStandaloneConfiguration.setPort(redisPort);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
}
此处主要是将上面的redis配置添加到springsession中,使用刚才添加的redis进行sessino管理。
public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {
public SecurityInitializer() {
super(SessionConfig.class, Config.class);
}
}
进行了以上的配置之后springsession就会将springsecurity的当前用户信息存放到redis中。
默认的ttl时间是2100s,即35分钟。
按照之前操作redis的惯例,我们需要一个key从redis中获取value,这里要获取的value就是之前我们存放在redis中的用户信息。那么这个key是什么呢?
我们不需要自己去拿key到redis中查询用户信息,security框架会根据sessionId帮我们去redis中取。我们要做的就是获取securityContext对象中
public void getCurrentUser() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
Object myUser = (auth != null) ? auth.getPrincipal() : null;
if (myUser instanceof UserVO) {
UserVO user = (UserVO) myUser;
return user;
} else {
log.error("当前用户不存在,请重新登录");
throw new UsernameNotFoundException("当前用户不存在!");
}
}
这里的userVo对象需要是之前实现了UserDetails接口的对象:
/**
* @Description spring-security的user对象
* @Author LiuYue
* @Date 2019/3/6
* @Version 1.0
*/
@Data
public class UserVO implements UserDetails {
/**
* 用户ID
*/
private String userId;
/**
* 用户账号
*/
private String user;
/**
* 用户名
*/
private String userName;
/**
* 密码
*/
private String password;
/**
* 是否为回收站,0表示不是,1表示是
*/
private String isRecycle;
/**
* 是否可用。Y表示可用,N表示不可用
*/
private String isEnable;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新人
*/
private String updateBy;
/**
* 更新时间
*/
private Date updateTime;
/**
* 备注
*/
private String comment;
/**
* 用户角色
**/
private List roles;
@Override
public Collection extends GrantedAuthority> getAuthorities() {
List authorities = new ArrayList<>();
for (TtRole role : roles) {
authorities.add(new SimpleGrantedAuthority("ROLE_"+role.getRole()));
}
return authorities;
}
@Override
public String getUsername() {
return userName;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return "y".equals(isEnable) ;
}
}
以上就是springsession与springsecurity结合使用,并使用redis管理session的全部内容了。
用redis管理session的好处就是多个模块之间可以实现session共享。在其他模块我们也可以使用这种方式获取当前的用户信息。