# 实现认证授权
# 登录
如下所示:
public SimpleSession login(SysUserVO param) {
if (StrUtils.isBlank(param.getUsername()) || StrUtils.isBlank(param.getPassword())) {
throw new HeimdallException("用户名或者密码不能为空");
}
//看看数据库里有没有这个用户
final SysUserEntity sysUserEntityByUsername = sysUserRepository.findSysUserEntityByUsername(param.getUsername());
if (null == sysUserEntityByUsername) {
throw new HeimdallException("用户名或者密码错误:None");
}
//看看密码对不对
if (!BCrypt.checkpw(param.getPassword(), sysUserEntityByUsername.getPassword())) {
throw new HeimdallException("密码错误");
}
//转成 DTO
final SysUserDTO sysUserDTO = sysUserMapper.toDto(sysUserEntityByUsername);
//把角色信息置空,免得数据太大,反正缓存也用不上。
sysUserDTO.setRoles(null);
//信息校验完毕,开始提交 Heimdall 进行认证。
//构造登录信息
AppUserDetails userDetails = new AppUserDetails(sysUserDTO);
//登录
return authenticationManager.login(userDetails);
}
Heimdall 框架并不会对用户信息是否正确进行验证,需要用户系统自己实现判断和处理。
当用户校验完毕后,构造userDetails实现,然后通过authenticationManager进行 login 认证。
简单来说,Heimdall 只负责维护认证状态,不会进行用户信息校验。
# 注销
public SimpleSession logout() {
return authenticationManager.logout();
}
注销,本质上是 Heimdall 框架将缓存的用户认证和授权相关信息从缓存中删除的操作。
注销成功后,会将注销 Session 实体返回。此 Session 此时已经是未认证状态。
# 在线用户管理
public Collection<SimpleSession> onlineUsers() {
return sessionDAO.getActiveSessions();
}
对于内存缓存,比如 Caffeine,在线用户列表数据会一次性全部返回。如果同时在线用户数据量比较多的情况下,可以考虑选择 Heimdall Redis 缓存实现。
Redis 缓存实现支持以分页方式获取在线用户列表。 如下:
public Page<SimpleSession> onlineUsers() {
//page:页码
//size:每页数量
return sessionDAO.getActiveSessions(page,size);
}
# 踢出在线用户
Heimdall 框架支持通过 SessionId 和 Principal 踢出在线用户。
SessionId 可通过查看在线用户列表获得。
Principal由 UserDetails 具体定义。对应到本例中就是AppUserDetails.getPrincipal();
- 以 SessionId 踢出在线用户
public boolean kickOutSession(String sessionId) {
return authenticationManager.kickOutSession(sessionId);
}
- 以 Principal 踢出在线用户
public boolean kickOutPrincipal(String principal) {
return authenticationManager.kickOutPrincipal(principal);
}
本章,我们实现了系统登录、注销以及在线用户管理功能,下一章,我们将演示如何进行系统权限的动态授权。