重零搭建SpringSecurity +JWT

1、前期工作(创建父工程,导入依赖)

重零搭建SpringSecurity +JWT_第1张图片

 2、创建启动类

重零搭建SpringSecurity +JWT_第2张图片

3、测试项目,启动后访问8080端口、hello看有没有页面

重零搭建SpringSecurity +JWT_第3张图片

 4、引入springSecurity依赖(重新启动,再访问/hello,会跳转到登录页面,用户名是 user,密码在控制台上)

 重零搭建SpringSecurity +JWT_第4张图片

 重零搭建SpringSecurity +JWT_第5张图片

重零搭建SpringSecurity +JWT_第6张图片

 

重零搭建SpringSecurity +JWT_第7张图片

重零搭建SpringSecurity +JWT_第8张图片

重零搭建SpringSecurity +JWT_第9张图片

重零搭建SpringSecurity +JWT_第10张图片

重零搭建SpringSecurity +JWT_第11张图片 

 重零搭建SpringSecurity +JWT_第12张图片

 

 重零搭建SpringSecurity +JWT_第13张图片

 redis相关配置

1、序列化器(redis使用FastJson序列化)

2、Redis配置

3、Redis工具类

JWT配置

1、JWT工具类

 数据

User类

数据库表

mybatis-plus引入及相关配置

  下面进入正戏

1、原版给的是 重内存中查找用户信息,我们是要重数据库中查找,所以主要就是要替换这个类(创建一个UserDetailService的实现类,重写loadUserByUsername()方法)

 重零搭建SpringSecurity +JWT_第14张图片 这个方法内的主要工作(查询用户信息、查询对应的权限信息,用UserDetails返回)

 重零搭建SpringSecurity +JWT_第15张图片

 2、在securityConfig中定义一个加密算法

3、重零搭建SpringSecurity +JWT_第16张图片

 登录实现类

重零搭建SpringSecurity +JWT_第17张图片

 第一步在SecurityConfig中重写(alt+insert,然后选择重写方法,并加入@Bean注解)

重零搭建SpringSecurity +JWT_第18张图片

 

 后面还有个user.getPassword()

重零搭建SpringSecurity +JWT_第19张图片

 上面这个认证方法最终就回去调用下面这个方法到数据库中进行认证重零搭建SpringSecurity +JWT_第20张图片

 第二步 判断是不是为null

重零搭建SpringSecurity +JWT_第21张图片

然后去 SecurityConfig中进行配置,就是把那个放行相关那个方法复制进去,然后对登录接口去放行

第三步 使用userId生成jwt

重零搭建SpringSecurity +JWT_第22张图片

 第四步,将用户信息写入redis中

 重零搭建SpringSecurity +JWT_第23张图片

第五步,把JWT的作为token,返回给用户

 重零搭建SpringSecurity +JWT_第24张图片

 第六步 JWT校验

重零搭建SpringSecurity +JWT_第25张图片

 (1)写一个过滤器类,然后获取token(为什么要return; 因为如果不加还会)

重零搭建SpringSecurity +JWT_第26张图片

 解释:如果token为空,让他去走下面的过滤器(后面的过滤器会做认证),然过滤器自动给它返回相应的异常,同时也要用return;不然还会走下面token不为空的代码。重零搭建SpringSecurity +JWT_第27张图片

(2)解析token,获得userId

重零搭建SpringSecurity +JWT_第28张图片

 (3)从redis中获取用户信息

重零搭建SpringSecurity +JWT_第29张图片

 (4)存入SecurityContextHolder(UsernamePasswordAuthenticationToken(用户名,密码,是否已认证状态)类 这次用三个参数)

 (5)放行

 第七步 把上面写的过滤器配置到下方箭头这个位置重零搭建SpringSecurity +JWT_第30张图片

 重零搭建SpringSecurity +JWT_第31张图片重零搭建SpringSecurity +JWT_第32张图片

 

 第八步 退出登录(只需定义一个登录接口,然后获取SecurityContextHolder的认证信息,删除redis中的对应数据即可)

重零搭建SpringSecurity +JWT_第33张图片

 重零搭建SpringSecurity +JWT_第34张图片

 获得userId,然后在redis中删除重零搭建SpringSecurity +JWT_第35张图片

 第九步 授权(不同用户可以使用不同的功能,权限)

重零搭建SpringSecurity +JWT_第36张图片

 (1)限制资源访问权限(用注解完成)

重零搭建SpringSecurity +JWT_第37张图片

 先去配置类中开启注解重零搭建SpringSecurity +JWT_第38张图片

api上增加权限注解(现在需要有权限才能访问/hello这个api了)

 重零搭建SpringSecurity +JWT_第39张图片

 (2)封装权限信息

增加一个权限字段和有参构造方法 

重零搭建SpringSecurity +JWT_第40张图片

 重写getAuthorities()方法

写法1

 写法2重零搭建SpringSecurity +JWT_第41张图片

 优化(第一次访问才需要转换,之后如果不为空,就不用转换) 

重零搭建SpringSecurity +JWT_第42张图片

有一个小细节(redis为了安全考虑不会把SimpleGrantAuthority进行序列化,所以不把它序列化到redis中,因为有permissions,所以之后可以再转换)

重零搭建SpringSecurity +JWT_第43张图片

 登录时候查询对应的权限信息重零搭建SpringSecurity +JWT_第44张图片

 校验的时候也需要获取权限

重零搭建SpringSecurity +JWT_第45张图片

(3)改进(从数据库中查询权限信息)

重零搭建SpringSecurity +JWT_第46张图片

(用户表,权限表,角色表(一个角色有一组权限,用角色权限表关联,多对多关系),角色和权限关联的表,用户和角色关联表(也是多对多)) 

 重零搭建SpringSecurity +JWT_第47张图片

 

 (通过用户角色表获取用户角色,获得角色的信息,再通过角色与角色和权限关联表,获得角色关联的权限id,最后从权限表中获得权限信息,得去重)(2到时候替换成动态的就行)

重零搭建SpringSecurity +JWT_第48张图片

 select就是上面这个sql,查到用户的权限信息集

重零搭建SpringSecurity +JWT_第49张图片

 (4)自定义失败处理

认证失败处理类

重零搭建SpringSecurity +JWT_第50张图片

 重零搭建SpringSecurity +JWT_第51张图片

(2) 权限失败处理

重零搭建SpringSecurity +JWT_第52张图片

 (3)去配置文件配置

重零搭建SpringSecurity +JWT_第53张图片

 重零搭建SpringSecurity +JWT_第54张图片

 第十步 跨域(前后端部署在不同的服务器上,会不同源) 

重零搭建SpringSecurity +JWT_第55张图片重零搭建SpringSecurity +JWT_第56张图片

 springSecurity配置重零搭建SpringSecurity +JWT_第57张图片

 结束

你可能感兴趣的:(spring)