权限设计与登录流程

发布时间 2023-06-27 18:15:03作者: ylc0x01

已落地的权限模块设计与前后分离项目单点登录流程

权限设计

元素级资源及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
        }
    }
}
...

登录流程

前后端分离项目单点登录流程-(1)

相关伪代码

登录策略

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;