驾考项目7-Shiro

167 阅读3分钟

2022年2月14日 昨天忘记上传代码了。今天只能看视频 运行mj老师的代码啦。

Aip升级

老师用过的 jdk 比我高 有个一个方法 是 List.of 我这边没有就用代替方案

new ArrayList 存放token

image.png

下载最新JDK

项目配置里

image.png

image.png

最好重启关闭一下 idea 重新加载一遍 似乎并没有解决 😄

Filter 检验是否携带Token

这个已经老了 😄

Shiro 检验是否携带Token

Shiro 是Apache 推出的 Shiro 要带日志系统

  • 认证
  • 授权

image.png

授权

image.png

SecurityManager:安全管理器

Subject:需要进行认证和授权的主体,比如用户

Authenticator:认证器

Authrizer:授权器

Realm:相当于数据源

先搞个Java的小项目验证Shiro

  • .ini 文件

image.png

  • 安全管理器、设置安全管理器、设置Realm

image.png

  • 主体 .get

image.png

  • 登陆

image.png

  • 判断授权能力

image.png

  • 封装

CustomRealm 【认证 doGetAuthenticationInfo / 授权 doGetAuthorizationInfo】

image.png

image.png

流程

/*
认证流程:
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

image.png

image.png

image.png

shiroFilterFactoryBean

  • 创建 ShiroFilterFactoryBean 名字必须是这个单词哦 不然报错
  • 安全管理器
  • 添加一些自定义的Filter
  • 设置URL如何拦截 anon 匿名访问

image.png 自己写 TokenFilter

Map<String, Filter> filters = new HashMap<>();
filters.put("token", new TokenFilter());
filterBean.setFilters(filters);

然后 其他请求 用token Filter

urlMap.put("/**", "token");
LinkedHashMap 有顺序的 保存url拦截 有顺序吧 越靠前设置拦截 越优先

image.png

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 的一些代码

image.png

题外话:双Token 方案

accessToken:7天

refreshToken:30天 拿refreshToken 获取accessToken

鉴权 TokenRealm

login 触发 doGetAuthorizationInfo、doGetAuthenticationInfo

然后判断权限 image.png

Token TokenMatcher 配合 TokenRealm

密码可以不传 但是别搞空 不然报错 随便传吧 没有验证 为了dogetAuthrizationInfo方法拿到 image.png

image.png

image.png

RequiresPermissions导致控制器接口404

image.png

62 视频开始 资源模块

debug 调试到com.mj.jk

image.png

数据导入 (直接把备课代码拷贝过来的)

SysResource

  • listParents 接口 查询所有父资源
  • 树状 数据格式返回

SysResourceTreeVo 查询所有 树状结构

ListTree接口 自己处理组装 sql升序 + map 保存 处理

登录界面接口

image.png

SysUserController saveUser 改成save (重新save)不用起名字了

SysRoleController save方法编写

63视频 权限控制 逻辑删除

Constants 常量

image.png

logical.AND

重写save 加权限 权限在子控制器里面加就好

如果一个控制器用作2个方面 可以拆开

多查表 尽可能 拆开 笛卡尔系数

关联role roleResource、user userResource

hashset去重

SysUserDto 保存内容缓存多一些东西

缓存里面用户信息用不过期, token过期删除用户关系

TokenCacheListener

ehcanche。xml 新增 异步回调 create remove 等等11ddd

更改角色 角色用户都要踢下线,重新登陆。

逻辑删除

  • 物理删除: 真正删了 永久消失
  • 逻辑删除:假删除 数据库还在留在数据库中,只是用户来说 数据被删除

半个可以删库跑路数据

增加一个字段标识 是否删除 本项目没有逻辑删除 老师搞的是一个demo

Mybaitis-plus 自带功能

image.png

image.png

软删除全局配置

image.png

image.png

最后一个视频啦 兄弟们 64 文件上传 终于熬完 其实啥也不懂 😄 还得自己写一遍才行

图片保存

ExamPlaceCourse 的save方法 写文件上传 文件配置到 yml文件中 jkpropertis 引入 uploads 文件

JkPeroperties 引入到容器中

静态变量 通过容器内获取

image.png

然后ExamPalceCourseServiceImpl.java 里面写上传图片 save 方法和流程

千万别传空串 不然全部删了

image.png

RequstBody、请求提是一个jsoon

加 @requstbody 注解 用来接受 客户端传来的json 普通post就是query

打包部署

看一下 删除逻辑下面的build 和ppt里面有

image.png

image.png