一、解释流程
大体流程:
-
用户使用username和secret
登陆
,将sercret通过MD5加密,通过username
查询库
中是否有该条记录,并比较加密后的
密码是否相同
,
登陆成功
后利用
JWTutil生成带过期时间的token
,
以后发送请求
时都需要在header中添加Authorization字段
附加该token信息
; -
结合程序实现一个JWTutil,在其中实现利用
登陆信息生成token
,根据token获取username,token验证等方法; -
实现一个
JWTFilter
继承BasicHttpAuthenticationFilter类,该
拦截器需要拦截所有请求除(除登陆、注册等请求)
,用于
判断请求是否带有token
,并获
取token的值传递给shiro的登陆认证方法作为参数
,用于获取token; -
定义
ShiroRealm
继承AuthorizingRealm类,在其中
实现登陆验证
及
权限获取
的方法; -
定义
ShiroConfig配置类
,用于生成ShiroManage及将shiroRealm
交付给ShiroManage处理
,并将jwtFilter添加进
shiro的拦截器链
中 -
controller中可以使用**@RequiresPermissions来对用户权限进行拦截**;
-
数据库表设计(user、role、menu表)项目中页面、按钮需要在菜单控制中进行添加,包括对应的请求链接、权限控制代码,前端也需要对按钮进行权限限制,使用v-hasPermission,控制代码与配置需一致。
此流程
原文地址
二、 简要流程,
-
前端请求登录,
传入用户名和密码和令牌token
; -
后端进入
jwtFilter拦截
,
判断当前请求中是否是登录请求
-
如果是
登录
请求,
就不执行shiro认证和授权
,直接进入控制器进行帐号和密码
校验
,
校验成功生成token返回
; -
如果是
非登录
请求,jwtFilter执行
executeLogin
方法进入
自定义realm
进行
认证
doGetAuthenticationInfo(认证不通过,抛出
异常
,然后调用
异常处理
)和
授权
doGetAuthorizationInfo,都通过然后进入自己的
控制器
;感谢大佬的文章
原文地址