鉴权-RBAC模型

news2024/9/21 22:33:49

文章目录

    • 1.技术选型
        • 1.网址
        • 2.Sa-Token介绍
        • 3.[Sa-Token 功能一览](https://sa-token.cc/doc.html#/?id=sa-token-功能一览)
    • 2.鉴权数据模型设计
        • 1.数据模型图
        • 2.SQL
          • 1.用户信息表
          • 2.角色表
          • 3.用户角色表(关联表)
          • 4.权限表
          • 5.角色权限表(关联表)
        • 3.E-R图
    • 3.鉴权微服务架构设计
        • 1.新建一个鉴权模块
        • 2.架构图
        • 3.功能设计
          • 1.用户基础模块
          • 2.角色基础模块
          • 3.权限基础模块
          • 4.登录注册模块
            • 注册用户与验证
            • 登录功能
          • 5.踢人下线
          • 6.集成 redis
          • 7.自定义我们的 token 风格和前缀
          • 8.记住我
          • 9.网关统一鉴权

1.技术选型

1.网址

https://sa-token.cc/doc.html#/

2.Sa-Token介绍

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证权限认证单点登录OAuth2.0分布式Session会话微服务网关鉴权 等一系列权限相关问题。

3.Sa-Token 功能一览

Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。

  • 登录认证 —— 单端登录、多端登录、同端互斥登录、七天内免登录。
  • 权限认证 —— 权限认证、角色认证、会话二级认证。
  • 踢人下线 —— 根据账号id踢人下线、根据Token值踢人下线。
  • 注解式鉴权 —— 优雅的将鉴权与业务代码分离。
  • 路由拦截式鉴权 —— 根据路由拦截鉴权,可适配 restful 模式。
  • Session会话 —— 全端共享Session,单端独享Session,自定义Session,方便的存取值。
  • 持久层扩展 —— 可集成 Redis,重启数据不丢失。
  • 前后台分离 —— APP、小程序等不支持 Cookie 的终端也可以轻松鉴权。
  • Token风格定制 —— 内置六种 Token 风格,还可:自定义 Token 生成策略。
  • 记住我模式 —— 适配 [记住我] 模式,重启浏览器免验证。
  • 二级认证 —— 在已登录的基础上再次认证,保证安全性。
  • 模拟他人账号 —— 实时操作任意用户状态数据。
  • 临时身份切换 —— 将会话身份临时切换为其它账号。
  • 同端互斥登录 —— 像QQ一样手机电脑同时在线,但是两个手机上互斥登录。
  • 账号封禁 —— 登录封禁、按照业务分类封禁、按照处罚阶梯封禁。
  • 密码加密 —— 提供基础加密算法,可快速 MD5、SHA1、SHA256、AES 加密。
  • 会话查询 —— 提供方便灵活的会话查询接口。
  • Http Basic认证 —— 一行代码接入 Http Basic、Digest 认证。
  • 全局侦听器 —— 在用户登陆、注销、被踢下线等关键性操作时进行一些AOP操作。
  • 全局过滤器 —— 方便的处理跨域,全局设置安全响应头等操作。
  • 多账号体系认证 —— 一个系统多套账号分开鉴权(比如商城的 User 表和 Admin 表)
  • 单点登录 —— 内置三种单点登录模式:同域、跨域、同Redis、跨Redis、前后端分离等架构都可以搞定。
  • 单点注销 —— 任意子系统内发起注销,即可全端下线。
  • OAuth2.0认证 —— 轻松搭建 OAuth2.0 服务,支持openid模式 。
  • 分布式会话 —— 提供共享数据中心分布式会话方案。
  • 微服务网关鉴权 —— 适配Gateway、ShenYu、Zuul等常见网关的路由拦截认证。
  • RPC调用鉴权 —— 网关转发鉴权,RPC调用鉴权,让服务调用不再裸奔
  • 临时Token认证 —— 解决短时间的 Token 授权问题。
  • 独立Redis —— 将权限缓存与业务缓存分离。
  • Quick快速登录认证 —— 为项目零代码注入一个登录页面。
  • 标签方言 —— 提供 Thymeleaf 标签方言集成包,提供 beetl 集成示例。
  • jwt集成 —— 提供三种模式的 jwt 集成方案,提供 token 扩展参数能力。
  • RPC调用状态传递 —— 提供 dubbo、grpc 等集成包,在RPC调用时登录状态不丢失。
  • 参数签名 —— 提供跨系统API调用签名校验模块,防参数篡改,防请求重放。
  • 自动续签 —— 提供两种Token过期策略,灵活搭配使用,还可自动续签。
  • 开箱即用 —— 提供SpringMVC、WebFlux、Solon 等常见框架集成包,开箱即用。
  • 最新技术栈 —— 适配最新技术栈:支持 SpringBoot 3.x,jdk 17。

2.鉴权数据模型设计

1.数据模型图

image-20240601162447426

2.SQL
1.用户信息表
-- auto-generated definition
create table auth_user
(
    id           bigint auto_increment comment '主键'
        primary key,
    user_name    varchar(32)   null comment '用户名称/账号',
    nick_name    varchar(32)   null comment '昵称',
    email        varchar(32)   null comment '邮箱',
    phone        varchar(32)   null comment '手机号',
    password     varchar(64)   null comment '密码',
    sex          tinyint(2)    null comment '性别',
    avatar       varchar(255)  null comment '头像',
    status       tinyint(2)    null comment '状态 0启用 1禁用',
    introduce    varchar(255)  null comment '个人介绍',
    ext_json     varchar(255)  null comment '特殊字段',
    created_by   varchar(32)   null comment '创建人',
    created_time datetime      null comment '创建时间',
    update_by    varchar(32)   null comment '更新人',
    update_time  datetime      null comment '更新时间',
    is_deleted   int default 0 null comment '是否被删除 0未删除 1已删除'
)
    comment '用户信息表' charset = utf8;


2.角色表
-- auto-generated definition
create table auth_role
(
    id           bigint auto_increment
        primary key,
    role_name    varchar(32)   null comment '角色名称',
    role_key     varchar(64)   null comment '角色唯一标识',
    created_by   varchar(32)   null comment '创建人',
    created_time datetime      null comment '创建时间',
    update_by    varchar(32)   null comment '更新人',
    update_time  datetime      null comment '更新时间',
    is_deleted   int default 0 null comment '是否被删除 0未删除 1已删除'
)
    charset = utf8;

3.用户角色表(关联表)
-- auto-generated definition
create table auth_user_role
(
    id           bigint auto_increment comment '主键'
        primary key,
    user_id      bigint        null comment '用户id',
    role_id      bigint        null comment '角色id',
    created_by   varchar(32)   null comment '创建人',
    created_time datetime      null comment '创建时间',
    update_by    varchar(32)   null comment '更新人',
    update_time  datetime      null comment '更新时间',
    is_deleted   int default 0 null
)
    comment '用户角色表' charset = utf8;
    
4.权限表
-- auto-generated definition
create table auth_permission
(
    id             bigint auto_increment
        primary key,
    name           varchar(64)   null comment '权限名称',
    parent_id      bigint        null comment '父id',
    type           tinyint       null comment '权限类型 0菜单 1操作',
    menu_url       varchar(255)  null comment '菜单路由',
    status         tinyint(2)    null comment '状态 0启用 1禁用',
    `show`         tinyint(2)    null comment '展示状态 0展示 1隐藏',
    icon           varchar(128)  null comment '图标',
    permission_key varchar(64)   null comment '权限唯一标识',
    created_by     varchar(32)   null comment '创建人',
    created_time   datetime      null comment '创建时间',
    update_by      varchar(32)   null comment '更新人',
    update_time    datetime      null comment '更新时间',
    is_deleted     int default 0 null comment '是否被删除 0为删除 1已删除'
)
    charset = utf8;
5.角色权限表(关联表)
-- auto-generated definition
create table auth_role_permission
(
    id            bigint auto_increment
        primary key,
    role_id       bigint        null comment '角色id',
    permission_id bigint        null comment '权限id',
    created_by    varchar(32)   null comment '创建人',
    created_time  datetime      null comment '创建时间',
    update_by     varchar(32)   null comment '更新人',
    update_time   datetime      null comment '更新时间',
    is_deleted    int default 0 null
)
    comment '角色权限关联表' charset = utf8;
3.E-R图

image-20240601171104326

3.鉴权微服务架构设计

1.新建一个鉴权模块

image-20240601171506588

2.架构图

image-20240601172112409

3.功能设计
1.用户基础模块
  • 新增用户
  • 修改用户
  • 删除用户
  • 用户启用
  • 用户禁用
  • 用户密码加密
2.角色基础模块
  • 新增角色
  • 修改角色
  • 删除角色
  • 角色与用户的关联
3.权限基础模块
  • 新增权限
  • 修改权限
  • 删除权限
  • 权限禁用与启用
  • 权限的展示与隐藏
  • 权限与角色关联
4.登录注册模块
注册用户与验证

1、短信的方式,通过向手机号发送验证码,来实现用户的验证并登录(考虑的成本是短信的费用)

2、邮箱的注册登录。

用户注册的时候,留一个邮箱,我们往邮箱里通过邮箱服务器发送一个链接,用户点击之后,实现一个激活,激活成功之后就完成了注册。(0 成本,坏处这种发送的邮件很容易进垃圾箱)

3、个人公众号模式(个人开发者无公司的,比较适合使用,0 成本)

用户登录的时候,弹出我们的这个公众号的码。扫码后,用户输入我们提示的验证码。可以随机比如说 nadbuge,通过我们的公众号对接的回调。能拿到一定的信息,用户的 openId。进而记录用户的信息

4、企业的服务号(必须要有营业执照,自己玩的不上线的话,也可以用测试号)

好处就是不仅打通了各种回调,而且还能拿到用户的信息。

登录功能

传统的 pc 形式,都是登录之后,写入 cookie。前端再次请求的时候,带着 cookie 一个身份识别就可以完成认证。坏处是什么?小程序呀,app 呀,其实是没有 cookie 这个概念的。为了更好的扩展,我们就直接选择 token的模式。token 放入 header 来实现用户身份的识别与鉴权。

5.踢人下线

发现风险用户,可以通过后台直接把用户踢掉,禁止其再访问,token 也可以直接置为失效的形式。

6.集成 redis

如果说我们选择了 token,然后不做 token 的保存,服务重启呀,分布式微服务啊,数据是无法共享并且会产生丢失问题,所以用 redis 来存储一些信息,实现共享。

7.自定义我们的 token 风格和前缀
  • 比如正常的 token 可能是 uuid,我们可以选择其他形式
  • 然后就是 token 的前端的传递,也可以去定义前缀,固定前缀才生效。
8.记住我
  • 当我们去勾选记住我的时候,下次登录就自动实现了。
  • 前后端分离,没有 token 的时候,必然会产生无法实现的问题,我们就选择在前端的 localstorage 来做。
9.网关统一鉴权

校验权限,校验用户的角色等等的东西,我们就放在网关里面统一去做。

不放在网关,导致我们的每个微服务,全要引入的鉴权的框架,不断的去写重复的代码。

数据的权限获取产生问题:

1、网关直接对接数据库,实现查询

2、redis 中获取数据,获取不到的时候还是要像第一种一样去数据库里查。

3、redis 中获取缓存,没有的话,从 auth 服务里面获取相关的信息。

4、直接从 redis 读取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1518.换水问题

1.题目描述 超市正在促销,你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始,你一共购入了 numBottles 瓶水。 如果喝掉了水瓶中的水,那么水瓶就会变成空的。 给你两个整数 numBottles 和 numExchange ,返回你 最多 可以喝到…

辩论赛评委依据什么标准进行评分呢

在辩论赛中,评委依据什么标准进行对参赛个人和团队进行评分呢?下面对这两部分介绍一些常用评分标准。 一、 个人评分标准 语言表达 1、普通话标准、语速适中; 2、语调平仄合理; 3、口头、肢体语言和谐; 4、修辞得当、…

C基础项目(学生成绩管理系统)

目录 一、项目要求 二、完整代码实例 三、分文件编写代码实例 一、项目要求 1.系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令 2.开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提…

解决 Vue 页面中地址栏参数变更不刷新的问题

在一次Vue项目开发中,遇到了只改变路由中的参数,路由地址不改变页面数据不刷新的问题。造成这个问题的原因,是因为 vue-router 同一个页面地址栏参数改变(比如文章的发布和编辑是同一个页面),不会触发vue的…

cms-wordpress 漏洞

登录后台 一、后台改模板 点击外观,编辑, 找一个php文件,在最开头加入一句话木马; 点击更新,访问模板类路径下的这个文件(不知道默认模板路径可以搜) 使用工具连接 二、上传主题拿shell 点击外观,主题&am…

NeRF学习——基于Pytorch代码复现的笔记

代码复现的框架是基于:pengsida 的 Learning NeRF 源代码框架是基于 Linux 的,我在 Windows 上进行复现有些许 bug,Windows 上 bug 修复的框架版本:Learning NeRF 希望各位可以通过学习 NeRF-Pytorch 的源码来自己复现一下试试看…

Lanproxy开箱即用的内网穿透工服务!!

Lanproxy快速上手配置服务器转发到内网!! 本教程云服务器推荐使用的开发环境如下:服务器端配置配置端口登录Web界面 内网客户端配置下载客户端配置客户端端口 最终效果测试 本文主要记录了使用Lanproxy搭建内网穿透服务的过程,其中包括服务端和客户端的详…

使用redis缓存文章浏览量

效果展示 好处 首先初始化所有浏览量 访问文章后增加的浏览量**不直接修改数据库,先存到redis然后访问也是获取redis的浏览量,做个定时任务,后续自定义时间同步数据库**,好像也就是一个集中处理罢了 CommandLineRunner实现项目…

鸿蒙系统学习指南

🐟作者简介:一名大三在校生,喜欢编程🪴 🐡🐙个人主页🥇:Aic山鱼 🐠WeChat:z7010cyy 🦈系列专栏:🏞️ 前端-JS基础专栏✨前…

8月2日SpringBoot学习笔记

今日内容: AOP 面向切面 代理模式 springmvc 运行原理 拦截器 springmvc异常处理机制 代理模式 为其他对象提供一种代理以控制对这个对象的访问。想在访问一个类时做一些控制是使用。 静态代理 优点:便于理解 缺点: 1.代码冗余&…

Linux 内核源码分析---I/O 体系结构与访问设备

I/O 体系结构 与外设的通信通常称之为输入输出,一般都缩写为I/O。 在实现外设的I/O时,内核必须处理3个可能出现的问题: (1)必须根据具体的设备类型和模型,使用各种方法对硬件寻址; &#xff08…

java面试题Spring部分(四)

一、什么事spring的三级缓存 典型回答 在Spring的BeanFactory体系中,BeanFactory是Spring IOC容器的基础接口,其DefaultSingletonBeanRegistry类实现了BeanFactory接口,并维护了三级缓存: public class DefaultSingletonBeanRe…

如何在OpenHarmony 4.1R上设置系统默认不锁屏(修改系统锁屏应用)

本文介绍如何修改系统锁屏应用,从而实现在OpenHarmony 4.1R上设置系统默认不锁屏。 环境配置 1.DevEco Studio 4.1 Release,下载链接地址 API10 Full SDK,安装教程 步骤 1.首先下载4.1r分支的系统锁屏应用applications_screenlock 2.修改系统锁屏应…

【Plotly-驯化】一文画出漂亮的流量漏斗图:plotly.funnel函数使用技巧

【Plotly-驯化】一文画出漂亮的流量漏斗图:plotly.funnel函数使用技巧 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获…

HTML+CSS練習---空隙產生記錄

1.第一層和第二層之間的間隙&#xff1a;以為導航欄超過高度朝下擠下來了 2.第2層兩個div中的空隙 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><style>font-face {f…

ATTCK实战系列-红队评估 (一)Vulnstack三层网络域渗透

目录 一、搭建环境 1.靶场下载地址&#xff1a; 2、网络拓扑 3、环境配置 Win7&#xff08;外网服务器 &#xff09; Win2008&#xff08;域控&#xff09; Win2003&#xff08;域成员&#xff09; 4、启动环境 二、信息收集 1、端口扫描 2、目录扫描 三、漏洞利用…

IM即时通讯客服聊天系统源码(某站售8千)

即时通讯客服聊天系统已经成为企业提供卓越客户服务的不可或缺的工具。为了帮助您快速搭建强大的客服聊天系统&#xff0c;提供了一款全面的源码模板&#xff0c;基于Java和Spring Boot微服务架构构建&#xff0c;支持多种功能模块&#xff0c;以及消息加密、红包、消息撤回等功…

基于JSP的学生综合考评管理系统

你好&#xff0c;我是专注于教育信息化的开发者&#xff0c;很高兴为您介绍本系统。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#xff1a;Eclipse、MySQL数据库管理工具 系统展示 首页 管理员功能 教师功能 学生功能 摘要 本文…

笔记本怎么手动设置ip地址:一步步教你操作

在使用笔记本电脑连接网络时&#xff0c;有时候我们需要手动设置IP地址以满足特定的网络需求或解决网络问题。手动设置IP地址可以帮助我们更好地控制网络连接&#xff0c;确保设备在网络中的稳定性和安全性。然而&#xff0c;对于不熟悉网络设置的用户来说&#xff0c;手动设置…

EPLAN EDZ 文件太大导入很慢如何解决?

目前各个品牌都在提供 EPLAN EDZ部件库文件,但是一般都是一个总的EDZ文件,导入过程中,因为电脑配置和其他问题,导致导入过程中EPLAN会崩溃或者长时间不动。 我们分析下EDZ文件的构成,这是个压缩文件,换了个壳而已。用压缩软件把edz打开,这里不是解压,直接右键,用解压…