一、解释流程
大体流程:
-
用户使用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,都通过然后进入自己的控制器;
感谢大佬的文章 原文地址