2022年2月14日 昨天忘记上传代码了。今天只能看视频 运行mj老师的代码啦。
Aip升级
老师用过的 jdk 比我高 有个一个方法 是 List.of 我这边没有就用代替方案
new ArrayList 存放token
下载最新JDK
项目配置里
最好重启关闭一下 idea 重新加载一遍 似乎并没有解决 😄
Filter 检验是否携带Token
这个已经老了 😄
Shiro 检验是否携带Token
Shiro 是Apache 推出的 Shiro 要带日志系统
- 认证
- 授权
授权
SecurityManager:安全管理器
Subject:需要进行认证和授权的主体,比如用户
Authenticator:认证器
Authrizer:授权器
Realm:相当于数据源
先搞个Java的小项目验证Shiro
- .ini 文件
- 安全管理器、设置安全管理器、设置Realm
- 主体 .get
- 登陆
- 判断授权能力
- 封装
CustomRealm 【认证 doGetAuthenticationInfo / 授权 doGetAuthorizationInfo】
流程
/*
认证流程:
1、Subject.login(token)
2、SecurityManager -> Authenticator -> Realm【AuthorizingRealm】
3、info = AuthorizingRealm.doGetAuthenticationInfo(token),根据token信息查询对应的用户信息(比如去数据库中查找)
4、CredentialsMatcher.doCredentialsMatch(token, info),判断token、info的Credentials是否匹配
CredentialsMatcher:专门用来判断Credentials是否正确
判断权限、角色流程:
1、Subject.isPermitted(permission)、Subject.hasRole(role)
2、SecurityManager -> Authorizer -> Realm【AuthorizingRealm】
3、info = AuthorizingRealm.doGetAuthorizationInfo(principal的集合),根据principal查询对应的角色、权限信息
4、根据返回的info信息判断权限、角色是否正确
*/
应用到项目中
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.7.0</version>
</dependency>
引入bean
shiroFilterFactoryBean
- 创建
ShiroFilterFactoryBean名字必须是这个单词哦 不然报错 - 安全管理器
- 添加一些自定义的Filter
- 设置URL如何拦截 anon 匿名访问
自己写
TokenFilter
Map<String, Filter> filters = new HashMap<>();
filters.put("token", new TokenFilter());
filterBean.setFilters(filters);
然后 其他请求 用token Filter
urlMap.put("/**", "token");
LinkedHashMap 有顺序的 保存url拦截 有顺序吧 越靠前设置拦截 越优先
61视频 内容开始
swagger 记得放开哦 设置 anon
// swagger
urlMap.put("/swagger*/**", "anon");
urlMap.put("/v2/api-docs/**", "anon");
TokenFilter
isAccessAllowed
flase : 走 onAccessDenied
true: 走下一个链条 (Filter,拦截器,控制器 等)
onAccessDenied
true: 走下一个链条 (Filter,拦截器,控制器 等)
flase : 不允许访问
主要就是这个方法的拦截
SwaggerCgf、SysUserController 替换 “Token“ 为 常量定义
onAccessDenied
- 取出token 判断
暂时 做到 token存在就拦截什么权限
ErrorFilter 创建ErrorController 配置url拦截
public static final String ERROR_URI = "/handleError";
WebCfg 配合ErrorFitler
@Bean
public FilterRegistrationBean<Filter> filterRegistrationBean() {
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
// 设置Filter
bean.setFilter(new ErrorFilter());
bean.addUrlPatterns("/*");
// 最高权限
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
JsonVos异常处理拿到 CommonExceptionHandler
servletException 修正
处理异常还是拿到 CommonExceptionHandler 里面吧 然后优化 CommonExceptionHandler 的一些代码
题外话:双Token 方案
accessToken:7天
refreshToken:30天 拿refreshToken 获取accessToken
鉴权 TokenRealm
login 触发 doGetAuthorizationInfo、doGetAuthenticationInfo
然后判断权限
Token TokenMatcher 配合 TokenRealm
密码可以不传 但是别搞空 不然报错 随便传吧 没有验证 为了dogetAuthrizationInfo方法拿到
RequiresPermissions导致控制器接口404
62 视频开始 资源模块
debug 调试到com.mj.jk
数据导入 (直接把备课代码拷贝过来的)
SysResource
- listParents 接口 查询所有父资源
- 树状 数据格式返回
SysResourceTreeVo 查询所有 树状结构
ListTree接口 自己处理组装 sql升序 + map 保存 处理
登录界面接口
SysUserController saveUser 改成save (重新save)不用起名字了
SysRoleController save方法编写
63视频 权限控制 逻辑删除
Constants 常量
logical.AND
重写save 加权限 权限在子控制器里面加就好
如果一个控制器用作2个方面 可以拆开
多查表 尽可能 拆开 笛卡尔系数
关联role roleResource、user userResource
hashset去重
SysUserDto 保存内容缓存多一些东西
缓存里面用户信息用不过期, token过期删除用户关系
TokenCacheListener
ehcanche。xml 新增 异步回调 create remove 等等11ddd
更改角色 角色用户都要踢下线,重新登陆。
逻辑删除
- 物理删除: 真正删了 永久消失
- 逻辑删除:假删除 数据库还在留在数据库中,只是用户来说 数据被删除
半个可以删库跑路数据
增加一个字段标识 是否删除 本项目没有逻辑删除 老师搞的是一个demo
Mybaitis-plus 自带功能
软删除全局配置
最后一个视频啦 兄弟们 64 文件上传 终于熬完 其实啥也不懂 😄 还得自己写一遍才行
图片保存
ExamPlaceCourse 的save方法 写文件上传 文件配置到 yml文件中 jkpropertis 引入 uploads 文件
JkPeroperties 引入到容器中
静态变量 通过容器内获取
然后ExamPalceCourseServiceImpl.java 里面写上传图片 save 方法和流程
千万别传空串 不然全部删了
RequstBody、请求提是一个jsoon
加 @requstbody 注解 用来接受 客户端传来的json 普通post就是query
打包部署
看一下 删除逻辑下面的build 和ppt里面有