文章目录
一、AdminController
1、@RestController
-
@RestController这个注解相当于 @ResponseBody + @Controller
@ResponseBody:表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。
@Controller: 在一个类上添加@Controller注解,表明了这个类是一个控制器类。但想要让这个类成为一个处理请求的处理器光有@Controller注解是不够的,他还需要进一步修炼才能成为一个处理器。
2、@ApiOperation
- @ApiOperation不是spring自带的注解是swagger里的
- 有关@ApiOreration介绍
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缓存的刷新令牌。