1、前期工作(创建父工程,导入依赖)
2、创建启动类
3、测试项目,启动后访问8080端口、hello看有没有页面
4、引入springSecurity依赖(重新启动,再访问/hello,会跳转到登录页面,用户名是 user,密码在控制台上)
redis相关配置
1、序列化器(redis使用FastJson序列化)
2、Redis配置
3、Redis工具类
JWT配置
1、JWT工具类
数据
User类
数据库表
mybatis-plus引入及相关配置
下面进入正戏
1、原版给的是 重内存中查找用户信息,我们是要重数据库中查找,所以主要就是要替换这个类(创建一个UserDetailService的实现类,重写loadUserByUsername()方法)
这个方法内的主要工作(查询用户信息、查询对应的权限信息,用UserDetails返回)
2、在securityConfig中定义一个加密算法
3、
登录实现类
第一步在SecurityConfig中重写(alt+insert,然后选择重写方法,并加入@Bean注解)
后面还有个user.getPassword()
上面这个认证方法最终就回去调用下面这个方法到数据库中进行认证
第二步 判断是不是为null
然后去 SecurityConfig中进行配置,就是把那个放行相关那个方法复制进去,然后对登录接口去放行
第三步 使用userId生成jwt
第四步,将用户信息写入redis中
第五步,把JWT的作为token,返回给用户
第六步 JWT校验
(1)写一个过滤器类,然后获取token(为什么要return; 因为如果不加还会)
解释:如果token为空,让他去走下面的过滤器(后面的过滤器会做认证),然过滤器自动给它返回相应的异常,同时也要用return;不然还会走下面token不为空的代码。
(2)解析token,获得userId
(3)从redis中获取用户信息
(4)存入SecurityContextHolder(UsernamePasswordAuthenticationToken(用户名,密码,是否已认证状态)类 这次用三个参数)
(5)放行
第七步 把上面写的过滤器配置到下方箭头这个位置
第八步 退出登录(只需定义一个登录接口,然后获取SecurityContextHolder的认证信息,删除redis中的对应数据即可)
获得userId,然后在redis中删除
第九步 授权(不同用户可以使用不同的功能,权限)
(1)限制资源访问权限(用注解完成)
先去配置类中开启注解
api上增加权限注解(现在需要有权限才能访问/hello这个api了)
(2)封装权限信息
增加一个权限字段和有参构造方法
重写getAuthorities()方法
写法1
写法2
优化(第一次访问才需要转换,之后如果不为空,就不用转换)
有一个小细节(redis为了安全考虑不会把SimpleGrantAuthority进行序列化,所以不把它序列化到redis中,因为有permissions,所以之后可以再转换)
登录时候查询对应的权限信息
校验的时候也需要获取权限
(3)改进(从数据库中查询权限信息)
(用户表,权限表,角色表(一个角色有一组权限,用角色权限表关联,多对多关系),角色和权限关联的表,用户和角色关联表(也是多对多))
(通过用户角色表获取用户角色,获得角色的信息,再通过角色与角色和权限关联表,获得角色关联的权限id,最后从权限表中获得权限信息,得去重)(2到时候替换成动态的就行)
select就是上面这个sql,查到用户的权限信息集
(4)自定义失败处理
认证失败处理类
(2) 权限失败处理
(3)去配置文件配置
第十步 跨域(前后端部署在不同的服务器上,会不同源)
springSecurity配置
结束