SpringBoot+Shiro前后端分离项目通过JWT实现自动登录

由于前后端分离不能用session,且有的浏览器禁用cookie,且项目有时候需要进行负载均衡,所以通过http请求头来携带加密的token来进行信息的传输并登陆和权限控制是比较好的方案。这里具体怎么建项目和maven引入就不讲了,最后会放出源码地址。

1.技术归纳

开发工具 idea2018

springboot web框架

shiro 安全框架

jwt 加密token

redis 缓存

数据库 mysql

2.配置
(1) shiro config
这里自定义一个filter,由于我这个是演示用的,所以添加了一些静态资源过滤,如果是完全前后端分离,只要登录那个不走自定义过滤器,其余的都走自己定义的过滤器。这里自定义过滤器不能用@bean注入,由于spring的机制,注入的话上面定义的anon的资源也全部要走一遍自定义过滤器,也就是说走一遍anon过滤器,还会走自定义过滤器,也就是走两边,那我们anon就相当于失效了,所以这里用new。
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第1张图片

关闭session,shiro框架有两个session,一个是shiro自带的session,一个是httpsession,这里关闭的是httpsession,也就是登陆以后不会把登录信息保存到和浏览器打交道的httpsession,这样你会造成每一个url访问都需要重新登录,而重新登录的信息就保存在token里面。
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第2张图片

(2) shiro filter
自定义filter继承BasicHttpAuthenticationFilter
在这里插入图片描述
这里从请求头中获取token,解密出用户信息,再进行登录。如果解密失败,会被全局异常捕获到并返回相应的数据,说明没有访问的权限。
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第3张图片

(3)yml配置说明

这里配置了公钥和私钥名称还有密钥,具体加密的的方法是现在指定路径生成公钥和密钥文件,然后将用户信息通过私钥文件和密钥进行加密生成一个token字符串,然后解密的时候通过公钥来解密出用户信息。这里的公钥和私钥在项目创建的时候会生成,具体查看RsaUtils类。
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第4张图片
(4)统一异常处理
定义一个统一异常处理来处理各种异常
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第5张图片

(5) realm
realm用来处理登录和授权
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(6)缓存
由于是每次url访问都需要登录和查询授权,如果每次都访问数据库,数据库压力会非常大,所以这里使用redis缓存。如果用户信息修改了则需要清空相应的缓存,系统登出也需要清除相应的缓存。
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第6张图片
(7)前后端json传输
定义一个返回类
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第7张图片
信息处理类,最终返回的就是result。
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第8张图片
(8)登录处理
登录的时候,返回里面携带token
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第9张图片
前端将我传递的token保存起来,这里前端用什么技术不用管,当然如果公司没有真正的前后端分离,这里我演示用的是jquery
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第10张图片
(9)通过url访问某信息的时候,请求头中添加这个token
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第11张图片
(10) 日志 log4j2
在这里插入图片描述

(11) nginx 负载均衡

我们通过nginx进行负载均衡,我这里启动两个程序,端口为8888和9999,
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第12张图片
访问test url 分别返回shiro1和shiro2,book.html接收这个信息。
在这里插入图片描述
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第13张图片

(12) 测试
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第14张图片
SpringBoot+Shiro前后端分离项目通过JWT实现自动登录_第15张图片

(13) 参考文献

链接: https://pan.baidu.com/s/1BCVColL8oZLBaR3EGusf8A 提取码: fp87(源码)

https://www.sundayfine.com/shiro-jwt/

https://yq.aliyun.com/articles/646440

你可能感兴趣的:(java学习)