1. 开始之前
1.1 技术选型
选用SpringBoot+Shiro+JWT
实现登录认证,结合Redis
服务实现token
的续签,前端选用Vue
动态构造路由及更细粒度的操作权限控制。
- 前后端分离项目中,我们一般采用的是无状态登录:服务端不保存任何客户端请求者信息,客户端需要自己携带着信息去访问服务端,并且携带的信息可以被服务端辨认。
- 而
Shiro
默认的拦截跳转都是跳转url
页面,拦截校验机制恰恰使用的session
;而前后端分离后,后端并无权干涉页面跳转。 - 因此前后端分离项目中使用
Shiro
就需要对其进行改造,我们可以在整合Shiro
的基础上自定义登录校验,继续整合JWT
(或者 oauth2.0 等),使其成为支持服务端无状态登录,即token
登录。 - 在
Vue
项目中,只需要根据登录用户的权限信息动态的加载路由列表就可以动态的构造出访问菜单。
1.2 整体流程
- 首次通过
post
请求将用户名与密码到login
进行登入,登录成功后返回token
; - 每次请求,客户端需通过
header
将token
带回服务器做JWT Token
的校验; - 服务端负责
token
生命周期的刷新,用户权限的校验;
2. SpringBoot 整合 Shiro+JWT
这里贴出主要逻辑,源码请移步文章末尾获取。
- 数据表
1 | /** 系统用户表 */ |
- pom.xml
1 | <!-- JWT --> |
shiro
配置类:构建securityManager
环境,及配置shiroFilter
并将jwtFilter
添加进shiro
的拦截器链中,放行登录注册请求。
1 |
|
- 自定义
Realm
:继承AuthorizingRealm
类,在其中实现登陆验证及权限获取的方法。
1 |
|
- 鉴权登录过滤器:继承
BasicHttpAuthenticationFilter
类,该拦截器需要拦截所有请求除(除登陆、注册等请求),用于判断请求是否带有token
,并获取token
的值传递给shiro
的登陆认证方法作为参数,用于获取token
;
1 |
|
JwtToken
1 | public class JwtToken implements AuthenticationToken { |
JWT
工具类:利用登陆信息生成token
,根据token
获取username
,token
验证等方法。
1 | public class JwtUtil { |
- MD5 加密工具类
1 | public class Md5Util { |
3. 注册与登录主要逻辑
这里只贴出主要逻辑,DAO
和Mapper
映射可查看源码,源码请移步文章末尾获取。
- 登录
Controller
1 |
|
- Service
1 | public interface SysService { |
- 统一接口返回格式
1 | public class ResponseVo<T> { |
注:这里的登录认证逻辑在
github
源码tag
的V1.0
中,后续版本再加入Token
续签和shiro
前后端权限管理等。
源码地址: https://github.com/chaooo/springboot-vue-shiro.git
仅下载认证逻辑源码:git clone --branch V1.0 https://github.com/chaooo/springboot-vue-shiro.git