RBAC角色权限
用户
角色
权限
菜单权限
资源权限(接口)
岗位表
角色组织表
角色权限表
用户角色关联表
组织(部门)
认证流程
用户通过前端系统发送登录请求,请求中携带账号、密码、验证码等信息。
前端登录请求首先请求到网关服务,网关服务将请求路由到权限微服务。
权限微服务进行认证操作,如果认证通过则生成wt token返回给前端,同时将用户拥有的资源权限使用userld作为key保存到缓存中。
注:缓存中保存的用户资源权限是由pd_auth_resource资源表中的method和urI两个字段的值拼接成的。
例如,某个用户拥有删除日志的权限,在表中除日志权限对应一亲数据,其中method的值为DELETE,urT
的值为/optLog,那么缓存中保存的用户拥有的资源权限为:DELETE/optLog。
鉴权流程
用户认证后访问其他功能时将jwttoken放在请求头中,首先经过网关服务处理。
在网关服务的过滤器中获取请求头中的token并进行解析,将解析出的用户相关数据放在zuul的header中。(注:之所以要将用户相关数据放在zuu]的neader中,是因为在后续的网关AccessFi1ter过滤器和权限服务中都会使用到这些数据。)
在网关服务的过滤器中进行鉴权相关处理。
- 第1步:判断当前请求ur1是否需要忽略
- 第2步:获取当前请求的请求方式和uri,拼接成GET/user/page这种形式,称为权限标识符
- 第3步:从缓存中获取所有需要进行鉴权的资源(同样是由资源表的method字段值+ur1字段值拼接成),如果没有获取到则通过Feign调用权限服务获取并放入缓存中
- 第4步:判断这些资源是否包含当前请求的权限标识符,如果不包含当前请求的权限标识符,则返回未经授权错误提示
- 第5步:如果包含当前的权限标识符,则从zuu1 header中取出用户d,根据用户id取出缓存中的用户拥有的权限,如果没有取到则通过Feign调用权限服务获取并放入缓存,判断用户拥有的权限是否包含当前请求的极限标识符
- 第6步:如果用户拥有的权限包含当前请求的权限标识符则说明当前用户拥有权限,直接放行
- 第7步:如果用户拥有的权限不包含当前请求的权限标识符则说明当前用户设有权限,返回未经授权错误提示