# 实现认证授权

# 登录

如下所示:

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);
    }

本章,我们实现了系统登录、注销以及在线用户管理功能,下一章,我们将演示如何进行系统权限的动态授权。

上次更新:: 1/25/2021, 4:26:40 PM