已落地的权限模块设计与前后分离项目单点登录流程
权限设计
元素级资源及url访问管控
模型设计
conf_info_dataauth
:数据资源conf_info_element
:元素资源conf_info_menu
:目录/菜单资源conf_info_panel
:面板资源conf_info_privilege
:权限配置conf_info_role
:角色配置conf_info_system
:系统配置conf_info_user
:用户配置priv_conf_url
:URL资源priv_conf_visit
:资源与访问关系配置priv_map_priv_res
:权限与资源映射priv_map_priv_role
:权限与角色映射priv_map_role_dataauth
:数据资源与角色映射priv_map_role_menu
:菜单/目录资源与角色映射priv_map_role_panel
:面板与角色映射priv_map_role_visit
:访问与角色映射priv_map_user_role
:用户与角色映射priv_map_visit_role
:访问与角色映射
模型关系
前后分离项目单点登录流程
nginx配置
...
http {
server {
listen bbbb;
server_name x.x.x.x;
location /res {
proxy_pass http://x.x.x.x:xxxx;
proxy_set_header Host $http_host;
}
location /sso/login {
proxy_pass http://a.a.a.a:aaaa;
proxy_set_header Host $http_host;
}
location / {
root /usr/frontend/dist/;
index index.html
}
}
}
...
登录流程
相关伪代码
登录策略
public class AuthTokenLoginServiceImpl {
...
public String sessionLoginCache(_, _, _){
// 查询登录用户信息
// 转出UserAgent对象
// 获取浏览器名称
// 获取系统名称
// 浏览器版本
// 构建用户登录对象
// 获取用户角色数据
// 获取用户资源权限数据
// 获取用户访问权限数据
// 生成用户令牌
String token = this.generateToken();
// 删除Redis中数据
// 入库Redis缓存
return token;
}
...
private String generateToken(_){
// 用户信息
// 加盐,加密
return "";
}
...
}
登录拦截器
public class LoginFilter implements Filter {
...
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
...
// 判断sso是否登录
...
// 判断请求白名单
...
// 判断服务是否登录
...
// 未登录,重定向到登录页面
}
...
}
授权拦截器
public class PermissionsAuthFilter implements Filter {
...
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
...
// 登录接口、登出接口放过
...
// 判断登录类型
switch (...){
case USER:// 用户鉴权
// 判断是否登录,没有登录跳转登录页面
...
// 判断当前用户访问是否已授权
...
// 判断是否超管
...
// 判断url白名单
...
break;
case SYSTEM: // 系统鉴权
// 判断系统白名单
...
// 判断当前系统访问是否已授权
...
break;
default:
// 不能识别,跳转登录页面
}
// 跳转登录页面
}
...
}
前端拦截器
import axios from "axios";
// 创建服务
const service = axios.create({
// 前端超时
timeout: 1000
});
// 请求拦截器
axios.interceptors.request.use(
function (config) {
...
// 从cookie中拿到token放入header中,方便后面用
...
return config;
},
function (error) {
return Promise.reject(error);
}
);
// 响应拦截器
axios.interceptors.response.use(
// 正常响应
function (response) {
// 业务异常判断,统一处理
...
// 流失异常判断,统一处理
...
// 未登录,重定向
...
return Promise.reject(response);
},
// 异常响应
function (error) {
...
return Promise.reject(error);
}
);
export default service;