halo登录,退出解读(六)

一、AdminController

1、@RestController

  • @RestController这个注解相当于 @ResponseBody + @Controller

    @ResponseBody:表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。

    @Controller: 在一个类上添加@Controller注解,表明了这个类是一个控制器类。但想要让这个类成为一个处理请求的处理器光有@Controller注解是不够的,他还需要进一步修炼才能成为一个处理器。

    有关@RestController的介绍

2、@ApiOperation

3、auth()方法 --》 验证用户登录

  • 这里用到了Validator 类,字段验证器。
  • ReUtil类,正则相关工具类。
  • PatternPool类,常用正则表达式集合,这里汇总了绝大多数我们想要,而又无法匹配出的正则表达式。

1、ApplicationEventPublisher接口 和 LogEvent方法

ApplicationEventPublisher: 封装事件发布功能的接口。

LogEvent: 自定义类,用户管理日志。

2、mustNotExpire() --> 判断时间过期方法

mustNotExpire(): 用户过期时间判断。

Date系统自带类中的after()判断时间,

HaloUtils.timeFormat(seconds): 通过这个方法将时间格式化,这里的知识点有点干货哦!

里面还有这个pluralize()方法,使用time标签格式多元化。学到了哈哈!

3、Bcrypt 系统自带类

checkpw():检查明文密码文本是否匹配加密后的文本。

BCrypt加密算法实现。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。

4、SecurityContextHolder类

SecurityContextHolder.getContext().isAuthenticated()

这段代码信息量太大了,内容也很深,有点复杂,看了半点,还设有有点不清楚。

首先,作者定义了一个SecurityContextHolder类,我就有疑问,这个类是干嘛?

然后继续看,里面创建了一个ThreadLocal,ThreadLocal类: 提供线程局部变量。

static SecurityContext getContext()

这个方法是用来干什么?应该是获取上下文。

SecurityContext接口: 安全上下文接口(自定义的,后面的笔记,只要是没有提JKD自带,就是自己定义的)。

通过ThreadLocal等一系列操作,拿到当前上下文内容。

isAuthenticated()

这个方法属实给我整懵逼了。进去一看,这个方法在SecurityContext接口中。

方法中有个getAuthentication()方法,这方法还是在SecurityContext中,那么我就想,肯定在实现类中具体实现。

那么接下来看实现类,实现类中的getAuthentication方法返回了一个Authentication类型的变量。

那么Authentication这个又是啥?进入一看,又是个接口,心态有点崩了呀。

继续看实现类AuthenticationImpl,发现构造方法中放入UserDetail的内容,但是这和前面getAuthentication方法返回Authentication接口有什么关系呢?这里到底是拿到什么?

我只能猜想是AuthenticationImpl中注入了UserDetail的内容,然后Authentication获取到了AuthenticationImpl中的内容?有这方面经验的大佬路过的话,希望指教一下,确实不是很懂。

@NoArgsConstructor
@AllArgsConstructor

后面注意到在AuthenticationImpl类上的注解,发现这两个注解,帮我解决的上面的困惑。

@NoArgsConstructor : 会生产一个无参构造方法。
@AllArgsConstructor: 会生产一个包含所有变量的构造方法。

这样就验证了上面的猜想是对的。

5、buildAuthToken() --> 构建身份认证令牌

AuthToken token = new AuthToken();

        token.setAccessToken(HaloUtils.randomUUIDWithoutDash());
        token.setExpiredIn(ACCESS_TOKEN_EXPIRED_SECONDS);
        token.setRefreshToken(HaloUtils.randomUUIDWithoutDash());

        // Cache those tokens, just for clearing
        cacheStore.putAny(SecurityUtils.buildAccessTokenKey(user), token.getAccessToken(), ACCESS_TOKEN_EXPIRED_SECONDS, TimeUnit.SECONDS);
        cacheStore.putAny(SecurityUtils.buildRefreshTokenKey(user), token.getRefreshToken(), REFRESH_TOKEN_EXPIRED_DAYS, TimeUnit.DAYS);

        // Cache those tokens with user id
        cacheStore.putAny(SecurityUtils.buildTokenAccessKey(token.getAccessToken()), user.getId(), ACCESS_TOKEN_EXPIRED_SECONDS, TimeUnit.SECONDS);
        cacheStore.putAny(SecurityUtils.buildTokenRefreshKey(token.getRefreshToken()), user.getId(), REFRESH_TOKEN_EXPIRED_DAYS, TimeUnit.DAYS);

构建用户身份访问令牌,缓存这些令牌,只是为了方便清除。

缓存访问令牌,刷新令牌,

用用户id缓存访问令牌,刷新令牌

4、logout() 用户退出

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

检测当前是否在登录,没有登录抛出异常。如果登录了

User user = authentication.getDetail().getUser();

获取当前用户。清除访问令牌

cacheStore.getAny(SecurityUtils.buildAccessTokenKey(u\ass)
		.ifPresent(accessToken -> {
            // Delete token
            cacheStore.delete(SecurityUtils.buildTokenAccessKey(accessToken));
            cacheStore.delete(SecurityUtils.buildAccessTokenKey(user));
        });

首先,SecurityUtils安全工具类,通过buildTokenAccessKey方法拿到访问令牌,然后从缓存中删除。

然后通过buildAccessTokenKey获取用用户id缓存的令牌,然后删除。

cacheStore.getAny(SecurityUtils.buildRefreshTokenKey(user),String.class)、						.ifPresent(refreshToken -> {
            cacheStore.delete(SecurityUtils.buildTokenRefreshKey(refreshToken));
            cacheStore.delete(SecurityUtils.buildRefreshTokenKey(user));
        });

同样,也是删除缓存中的刷新令牌,删除用用户id缓存的刷新令牌。

猜你喜欢

转载自blog.csdn.net/qq_40749830/article/details/105498407