2024年11月

来源:晓飞的算法工程笔记 公众号,转载请注明出处

论文: Agglomerative Token Clustering

创新点


  • 提出了层次
    token
    聚类(
    Agglomerative Token Clustering

    ATC
    ),这是一种新型的无参数层次合并的
    token
    减少方法。
  • 基于
    ATC
    ,在图像分类、图像合成,以及目标检测和分割任务上实现了最先进的性能,超越了所有其他
    token
    减少方法,包括基于合并的和基于修剪的
    token
    减少方法。
  • 在图像分类和目标检测与分割任务中,
    ATC
    可以在未经过任何微调的情况下(即开箱即用),达到与之前微调的最先进性能相当的效果。

内容概述


层次
token
聚类(
Agglomerative Token Clustering
,简称
ATC
)是一种新型的
token
合并方法,在图像分类、图像合成以及目标检测与分割任务中始终优于以往的
token
合并和修剪方法。
ATC
通过自下而上的层次聚类来合并簇,而无需引入额外的可学习参数。

在所有任务中,
ATC
都实现了最先进的性能。在不进行微调的情况下,甚至可以与之前的最先进技术相媲美。
ATC
在低保留率下尤其有效,此场景仅保留了少量的
token
,而保持任务性能尤其困难。

层次
token
聚类


与之前的
token
合并方法类似,
ATC
的目标是合并冗余
token
,同时保持或提升
ViT
模型的性能。在
ViT
块的自注意力和多层感知机(
MLP
)模块之间插入
token
合并操作,这与之前的基于合并的方法是一致的,比如
ToMe

层次聚类是一种经典的自下而上的层次聚类方法,其中每个元素最初都是其自身的聚类。通过根据某种连结函数和距离度量
\(D(\cdot)\)
迭代比较聚类,将两个最接近的聚类在每次迭代中合并。这一过程会持续进行,直到满足某个停止标准,例如所需聚类的数量(形成静态缩减方法),或者聚类之间的最小距离(形成动态缩减方法)。

论文考虑静态缩减场景,使用余弦距离作为距离度量
\(D(\cdot)\)
,并使用自注意力模块的键作为
token
特征。连结函数的选择对元素的聚类方式会有很大影响,主要有三种最常见的连结函数:单个,完整和平均。

\[\begin{equation}
D(I,J)^{\text{single}} = \min_{i\in I,\ j\in J} D(i,j)
\end{equation}
\]

\[\begin{equation}
D(I,J)^{\text{complete}} = \max_{i\in I,\ j\in J} D(i,j)
\end{equation}
\]

\[\begin{equation}
D(I,J)^{\text{average}} = \frac{1}{|I||J|}\sum_{i\in I}\sum_{j\in J}D(i,j)
\end{equation}
\]

其中
\(I\)

\(J\)
是包含元素
\(i \in I\)

\(j \in J\)
的聚类。

在达到停止标准之后,对每个聚类中的
token
进行平均,以获得更新的聚类表示。然而,随着
token
的合并,它们代表的不止一个输入图像块。为了更好地利用能够捕捉更大空间范围的
token
,使用加权平均作为聚类表示,并在自注意力模块中使用成比例的注意力。

主要实验




如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

work-life balance.

想要导出这样的表格

数据准备格式

附上源码

1 usingNPOI.HSSF.UserModel;2 usingNPOI.SS.UserModel;3 usingNPOI.SS.Util;4 usingSystem.Data;5 usingSystem.Text.RegularExpressions;6 
7 namespaceTestConsoleApp8 {9     /// <summary>
10     ///导出Excel11     /// </summary>
12     public static classExportHelper13 {14         public static voidExport()15 {16             var dt =CreteTable();17             var titles = GetExcelTitles(dt.Columns, out intmaxTitleLevel);18 
19             HSSFWorkbook workbook = newHSSFWorkbook();20             ISheet sheet = workbook.CreateSheet("Sheet1");21 
22             var allRowCount = dt.Rows.Count +maxTitleLevel;23             //创建所有单元格
24             for (int i = 0; i < allRowCount; i++)25 {26                 var row =sheet.CreateRow(i);27                 for (int j = 0; j < dt.Columns.Count; j++)28 {29 row.CreateCell(j);30 }31 }32 
33             //合并创建表头
34             foreach (var tit intitles)35 {36 sheet.GetRow(tit.StartRow).GetCell(tit.StartColumn).SetCellValue(tit.Title);37                 if (tit.MergeColumnCount + tit.MergeRowCount > 0)38 {39                     sheet.AddMergedRegion(new CellRangeAddress(tit.StartRow, tit.StartRow + tit.MergeRowCount, tit.StartColumn, tit.StartColumn +tit.MergeColumnCount));40 }41 }42 
43             //生成数据行
44             for (int i = 0; i < dt.Rows.Count; i++)45 {46                 for (int j = 0; j < dt.Columns.Count; j++)47 {48                     string cellValue =dt.Rows[i][j].ToString();49                    sheet.GetRow(maxTitleLevel +i).Cells[j].SetCellValue(cellValue);50 }51 }52 
53             using FileStream stm = File.OpenWrite(@"D:\Drivers\Merge.xls");54 workbook.Write(stm);55 }56 
57         private staticDataTable CreteTable()58 {59             DataTable dt = newDataTable();60             dt.Columns.Add("编号");61             dt.Columns.Add("收入-线上采购-数量");62             dt.Columns.Add("收入-线上采购-金额");63 
64             dt.Columns.Add("收入-线下采购-数量");65             dt.Columns.Add("收入-线下采购-金额");66 
67             dt.Columns.Add("回收-数量");68             dt.Columns.Add("回收-金额");69 
70             dt.Columns.Add("支出-测试01-数量");71             dt.Columns.Add("支出-测试01-金额");72 
73             dt.Columns.Add("支出-测试02-数量");74             dt.Columns.Add("支出-测试02-金额");75 
76             dt.Columns.Add("其它-数量");77             dt.Columns.Add("其它-金额");78 
79             dt.Columns.Add("备注");80 
81             for (int i = 1; i <= 100; i++)82 {83                 var row =dt.NewRow();84 
85                 row["编号"] = "编号" +i;86                 row["收入-线上采购-数量"] =i;87                 row["收入-线上采购-金额"] =i;88                 row["收入-线下采购-数量"] =i;89                 row["收入-线下采购-金额"] =i;90                 row["回收-数量"] =i;91                 row["回收-金额"] =i;92                 row["支出-测试01-数量"] =i;93                 row["支出-测试01-金额"] =i;94                 row["支出-测试02-数量"] =i;95                 row["支出-测试02-金额"] =i;96                 row["其它-数量"] =i;97                 row["其它-金额"] =i;98                 row["备注"] =i;99 dt.Rows.Add(row);100 }101 
102             returndt;103 }104 
105 
106         private static List<ExcelTitle> GetExcelTitles(DataColumnCollection columns, out intmaxTitleLevel)107 {108             maxTitleLevel = 0;109             List<LevelExcelTitle> levelExcelTitles = new List<LevelExcelTitle>();110 
111             for (var index = 0; index < columns.Count; index++)112 {113                 var column =columns[index].ToString();114 
115                 var arr = column.Split("-");116 
117 
118                 if (maxTitleLevel <arr.Length)119 {120                     maxTitleLevel =arr.Length;121 }122 
123                 for (int i = 0; i < arr.Length; i++)124 {125                     levelExcelTitles.Add(newLevelExcelTitle()126 {127                         Title =arr[i],128                         LevelCode = string.Join("-", arr[..(i + 1)]),129                         RowIndex =i,130                         ColumnIndex =index,131                         TotalLevel =arr.Length132 });133 }134 }135 
136             var titleLevel =maxTitleLevel;137             var excelTitles =levelExcelTitles138                 .GroupBy(b => new
139 {140 b.LevelCode,141 b.Title142 })143                .Select(b => newExcelTitle()144 {145                    Title =b.Key.Title,146                    StartRow = b.Min(c =>c.RowIndex),147                    MergeRowCount = b.Min(c => c.RowIndex) + 1 == b.Max(c => c.TotalLevel) ? titleLevel - b.Max(c => c.TotalLevel) : 0,148 
149                    StartColumn = b.Min(c =>c.ColumnIndex),150                    MergeColumnCount = b.Count() - 1,//排除自身
151 }).ToList();152 
153             returnexcelTitles;154 }155 }156 
157     public classExcelTitle158 {159         /// <summary>
160         ///标题161         /// </summary>
162         public string Title { get; set; }163 
164         /// <summary>
165         ///开始行166         /// </summary>
167         public int StartRow { get; set; }168 
169         /// <summary>
170         ///合并行171         /// </summary>
172         public int MergeRowCount { get; set; }173 
174 
175         /// <summary>
176         ///开始列177         /// </summary>
178         public int StartColumn { get; set; }179 
180         /// <summary>
181         ///合并列182         /// </summary>
183         public int MergeColumnCount { get; set; }184 }185 
186     public classLevelExcelTitle187 {188         /// <summary>
189         ///标题190         /// </summary>
191         public string Title { get; set; }192 
193         public string LevelCode { get; set; }194 
195         /// <summary>
196         ///第几行197         /// </summary>
198         public int RowIndex { get; set; }199 
200         /// <summary>
201         ///第几列202         /// </summary>
203         public int ColumnIndex { get; set; }204 
205         /// <summary>
206         ///总层207         /// </summary>
208         public int TotalLevel { get; set; }209 }210 }

Manim
提供了一系列专为三维空间设计的对象,让创建三维数学动画变得更加轻松。

本篇开始介绍其中最简单的点和线相关对象,也就是
Dot3D
(三维的点),
Line3D
(三维的线)和
Arrow3D
(三维的箭头)。

  • Dot3D
    用于表示三维空间中的点,是构建其他复杂三维图形的基础,它适用于标记关键点、位置、向量起点等。
  • Line3D
    用于在三维空间中绘制线段,可以表示向量、路径、轨迹等。它适用于展示物体的运动轨迹、力的方向等。
  • Arrow3D

    Line3D
    的基础上添加了箭头,用于明确表示方向性的线段。它适用于表示矢量、力的方向、速度等。

1. 主要参数

Dot3D
的主要参数:

参数名称 类型 说明
point np.ndarray 点的位置,包含 x,y,z 3个值
radius float 点的半径
color Color 点的颜色
resolution tuple[int, int] 点的分辨率

Dot3D
本质上是个球形,所以有
radius
参数,控制点的大小;

resolution
参数设置的是点这个球形的分辨率,值越大,点看上去越圆滑,一般不需要设置这个参数,默认值就可以了。

Line3D
的主要参数:

参数名称 类型 说明
start np.ndarray 线段的起点坐标,包含 x,y,z 3个值
end np.ndarray 线段的终点坐标,包含 x,y,z 3个值
thickness float 线段的粗细
color Color 线段的颜色

Arrow3D
的主要参数:

参数名称 类型 说明
start np.ndarray 箭头的起点坐标,包含 x,y,z 3个值
end np.ndarray 箭头的终点坐标,包含 x,y,z 3个值
thickness float 箭头主体的粗细
height float 箭头尖部的高度
base_radius float 箭头尖部的底部半径
color Color 箭头的颜色

2. 主要方法

Dot3D

Arrow3D
没有什么特殊的方法,就是一些Manim对象常规的缩放,平移等方法。

但是,
Line3D
有几个自己特有的方法。

名称 说明
parallel_to 创建一条与给定线段平行的线段
perpendicular_to 创建一条与给定线段垂直的线段
pointify 获取表示对象中心的点

3. 使用示例

最后,还是通过示例来演示上面几个对象的重要参数和方法。

3.1. Dot3D的位置和颜色

在这个示例中,我们将创建个
Dot3D
对象。

第一个点具有默认的半径和颜色;而第二个点,我们将自定义其半径和颜色。

通过调整这些参数,我们可以清晰地看到两个点在三维空间中的位置和颜色差异。

# 使用默认参数
dot1 = Dot3D(point=axes.c2p(1, 2, 3))

# 自定义半径和颜色
dot2 = Dot3D(
    point=axes.c2p(2, 3, -1),
    radius=0.2,
    color=RED,
)

3.2. Line3D的长度和方向

此示例将展示如何使用Line3D对象在三维空间中绘制一条线段。

首先根据起点和终点设置一个线段,同时,调整线段的粗细和颜色来使其更加醒目。

然后,通过函数
parallel_to

perpendicular_to
分别绘制此线段的平行线(黄色)和垂线(红色)。

# 指定起点和终点 以及线段粗细
line = Line3D(
    start=LEFT + DOWN * 2 + IN,
    end=RIGHT + UP * 2 + OUT * 2,
    thickness=0.02,
    color=BLUE,
)

# 绘制line的平行线
Line3D.parallel_to(line, color=YELLOW)

# 绘制line的垂线
Line3D.perpendicular_to(line, color=RED)

3.3. Arrow3D的方向和样式

在这个示例中,我们使用
Arrow3D
对象来表示一个带箭头的线段,以强调方向性。

首先设置箭头的起点和终点,为了突出箭头,

再调整其粗细(
thickness
参数)、箭头尖部的高度(
height
参数)和底部半径(
base_radius
参数)。

# 指定起点和终点 以及箭头样式参数
arrow = Arrow3D(
    start=[-1, -1, -2],
    end=[1, 2, 2],
    thickness=0.05,
    height=0.2,
    base_radius=0.1,
    color=GREEN,
)

3.4. 综合使用Dot3D, Line3D和Arrow3D

在这个综合示例中,我们结合使用
Dot3D

Line3D

Arrow3D
来创建一个更复杂的三维场景。

首先,在场景中放置一个
Dot3D
对象作为起点。

然后,我们将使用
Line3D
对象从该点绘制一条线段到另一个位置,表示路径或轨迹。

最后,我们将在线段的终点处添加一个
Arrow3D
对象。

通过调整这些对象的参数(如位置、颜色、粗细等),可以创建一个既清晰又富有表现力的三维图形,用于演示、教学或科学研究等多种目的。

# 创建Dot3D对象作为起点
dot = Dot3D(point=[-1, -1, -1], color=BLUE)

# 创建Line3D对象连接起点和另一个点
line = Line3D(
    start=[-1, -1, -1],
    end=[2, 2, 2],
    thickness=0.05,
    color=YELLOW,
)

# 创建Arrow3D对象在终点处指示方向
arrow = Arrow3D(
    start=[2, 2, 2],
    end=[1, 2, -1],
    thickness=0.05,
    height=0.2,
    base_radius=0.1,
    color=RED,
)

4. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(
dot_line.py
),

下载地址:
完整代码
(访问密码: 6872)

前言

推荐一款强大的企业级工具 — SSCMS 内容管理系统。

SSCMS 为企业级客户设计,完全开源免费,适用于商业用途且无需支付任何产品或授权费用。

本文将详细介绍 SSCMS 系统的功能、用户界面及使用注意事项等内容。

项目介绍

SSCMS 基于 .NET Core 开发,无论是在 Windows、Linux、Mac 还是 Docker 环境下,SSCMS 都能以最低的成本和最少的人力投入,迅速搭建功能齐全且易于维护的网站平台。

项目特点

  • 跨平台、分布式部署

SSCMS 支持 Windows、Linux、Mac 及 Docker,兼容多种数据库。

  • 网站群管理

SSCMS 可管理多个网站,支持按站点与栏目分配权限,实现多管理员协作。

  • 多终端发布

SSCMS 支持 PC、手机 App、微信、平板等多种终端内容发布。

  • 功能插件

SSCMS 提供丰富的插件,如投票、评论、在线支付等,并支持定制开发。

  • 内容模型

SSCMS 支持多种内容类型,如文章、产品、视频,并可自定义内容模型。

  • 权限控制

SSCMS 支持按站点、操作权限和栏目进行权限分配。

  • 安全机制

SSCMS 有多层安全防护,并支持内外网分离部署。

  • 二次开发

SSCMS 支持通过标签、API 接口等方式进行扩展和定制。

功能清单

1、站群管理

对包括网站及微信公众号在内的站点进行新增、修改、删除等操作,管理站点部署方式及访问地址、站点内容表以及其他操作。

2、栏目管理

支持无限个栏目、子栏目的创建,对栏目进行新增、修改、删除、排序、导入、导出以及转移等操作。

3、内容管理

左侧以树状导航组织切换栏目,支持从 Word 文件导入内容、批量导入导出内容、新增、编辑、删除、审核、排序、分组、整理等操作。

4、素材管理

管理素材,素材默认按站点分组,站点之间共享素材。

5、微信公众号

实现微信公众号与站点集成,实现绑定微信公众号、自动回复、自定义公众号菜单、消息管理、用户管理以及群发消息等功能。

6、显示管理

管理站点显示样式,实现模板管理,资源文件管理,专题页面,模板匹配等功能。

7、设置管理

统一管理站点相关设置,管理内容组、栏目组、内容标签、栏目字段、内容字段、跨站转发、生成设置、上传设置及图片水印等。

8、生成管理

统一管理站点生成功能,一键生成整站、查看生成进度。

9、插件管理

安装插件、卸载插件、配置插件选项以及升级系统插件。

10、管理员管理

对管理员、角色、权限、API 密钥以及管理员设置进行管理

11、用户管理

对用户、用户组、用户字段以及注册登录选项进行管理

12、统计图表

以图表形式展现管理员登录、站点内容以及用户相关统计数据。

13、运行日志

统一查看系统各类日志信息

14、系统设置

设置系统配置选项

15、实用工具

系统工具类应用

项目源码

系统代码组织框架结构,如下所示:

项目部署

在 Docker 中运行 SSCMS,拉取最新版本的 SSCMS 镜像

docker pull sscms/core:latest

运行 SSCMS 容器

docker run -d \--name my-sscms \-p 80:80\--restart=always \-v volume-sscms:/app/wwwroot \-e SSCMS_SECURITY_KEY=e2a3d303-ac9b-41ff-9154-930710af0845 \-e SSCMS_DATABASE_TYPE=SQLite \
sscms
/core

项目使用

1、安装完成后直接登录

SSCMS 在产品安装完成后,会出现进入后台的链接,如下图所示:

2、安装完成后进入后台

安装 SSCMS 后,会显示进入后台的链接。点击该链接即可进入 SSCMS 管理员登录界面,输入安装时设置的用户名和密码即可登录。

3、直接输入地址登录

通常会选择直接访问后台。SSCMS 的后台访问地址为 访问域名 +
/ss-admin/

  • 如果在服务器安装且设置了访问域名,后台访问地址通常为
    http://www.abc.com/ss-admin/
    (将
    http://www.abc.com
    替换为实际站点的访问域名)。

  • 如果在服务器安装但未设置访问域名,可以通过 IP 地址访问后台,如
    http://134.125.23.53/ss-admin/
    (将
    134.125.23.53
    替换为服务器的实际 IP 地址)。

  • 如果在本机安装,后台访问地址通常为
    http://localhost/ss-admin/

项目效果

1、创建空站点


2、进入首页

3、内容审核

4、显示管理

项目文档

项目提供了详细的文档说明,包括了多个方面以及常见问题解答。大家可以访问相关页面进行查阅。

项目总结

本文展示了部分功能和内容,如有需求访问项目地址获取详细信息。希望本文能在CMS系统开发方面为各位提供有益的帮助。期待大家在评论区留言交流,分享您的宝贵经验和建议。

项目地址

GitHub:
https://github.com/siteserver/cms

Gitee:
https://gitee.com/siteserver/cms

下载地址

https://gitee.com/siteserver/cms/releases/tag/sscms-v7.3.1

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号
[DotNet技术匠]
社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!

大家好,我是汤师爷~

什么是权限?

权限,简单来说,是系统中控制用户行为的一套规则和机制,用来限制每个用户在系统中可以访问的页面、功能和查看的信息。

权限系统通过设定不同的用户角色,并将权限分配给这些角色,来控制用户在系统中可使用的功能和可查看的信息。这是企业进行权限管理的有效工具。

权限的设置通常基于用户的角色和职责。例如,在新零售 SaaS 系统中,运营人员需要管理商品和订单,但他们不需要也不应该访问财务数据。相反,财务人员需要查看交易和财务报表,但不需要操作商品、库存。

通过权限控制,系统确保每个用户只能在其职责范围内操作,既提高了工作效率,又保护了敏感信息。

为什么需要权限系统

在 SaaS 系统中,如果没有权限管理,所有用户都可以随意访问和修改系统中的数据,这将导致混乱和安全隐患。

企业的数据通常包含财务报表、客户资料、商业机密等敏感信息。如果所有员工都能访问这些数据,可能会导致信息泄露,甚至被出售给商家的竞争对手,给企业带来严重后果。

权限系统有助于规范业务流程,提高员工工作效率。不同岗位有不同的职责和权限,例如,财务人员需要查看和处理财务数据,而销售人员则需要管理客户信息。如果没有明确的权限划分,员工可能会接触到与自身职责无关的工作,导致职责不清,影响工作效率。

权限系统还便于审计和追责。当出现问题时,企业可以通过权限日志追踪到具体的操作人员,明确责任归属。

总的来说,权限系统是企业信息安全和规范管理的重要保障。它确保不同岗位的员工只能在授权范围内操作,既提高了工作效率,又保护了企业的核心利益。

因此,构建一个完善的权限系统对于任何注重安全和效率的企业来说都至关重要。

权限模型方案

设计权限系统时,我们可以借鉴多种技术模型,每种模型都有其独特的特点和适用场景。

常见的权限模型包括
ACL
(访问控制列表)、
RBAC
(基于角色的访问控制)等。这些模型各有优劣,适用于不同规模和复杂程度的系统。

在实际应用中,我们需要深入分析业务需求,权衡各种模型的利弊,并根据系统的具体情况灵活设计和调整。接下来,让我们一起探讨几种常见的权限模型。

ACL 模型

首先,让我们探讨一下
ACL
模型,全称为
Access Control List
,即访问控制列表。这是一种直接而简洁的权限管理方式。ACL模型主要包含两个关键元素:

  • 用户(User)
    :系统的实际使用者,可以是个人、组织或系统实体。
  • 权限(Permission)
    :明确定义用户可以执行的操作或访问的资源,如查看报表、编辑文档等。

ACL模型特别适合权限需求相对简单、直接的系统环境。当系统功能点较少,用户与权限之间可以建立清晰、直接的对应关系时,ACL模型能够提供高效、易于管理的权限控制方案。

RBAC0 模型

接下来,介绍一下
RBAC0
模型。作为角色权限控制的基础模型,RBAC 代表
Role-Based Access Control
,即基于角色的访问控制。这种模型通过引入"角色"的概念,巧妙地解决了用户与权限之间的复杂关系。

在 RBAC0 模型中,我们不再直接将权限赋予用户,而是通过角色这个中间层来实现权限分配。这种设计带来了极大的灵活性和可管理性。

例如,当一个新员工加入企业时,我们只需要为其分配适当的角色,而不必逐一设置权限。同样,当某个角色的权限需要调整时,我们只需修改该角色的权限设置,所有拥有该角色的用户都会自动更新权限。RBAC0 模型的核心组成元素:

  • 用户(User)
    :系统的实际使用者,可以是个人、组织或系统实体。
  • 角色(Role)
    :角色是一系列权限的集合,它像一座桥梁,连接了用户和权限。系统管理员可以根据业务需求创建不同的角色,如"运营经理"、"门店店长"等。一个角色可以拥有多种权限,而一个用户也可以被赋予多个角色,这种多对多的关系大大增强了系统的灵活性。
  • 权限(Permission)
    :定义了用户可以在系统中执行的具体操作。权限可以是粗粒度的,如访问某个模块的权限;也可以是细粒度的,如对某条数据的增删改查权限。权限的设计需要充分考虑业务需求和安全性,既要保证用户能够高效工作,又要防止越权操作。常见的权限类型包括页面访问权限、功能操作权限、数据查看权限等。

RBAC1 模型

RBAC1 模型是 RBAC0 模型的进阶版本,引入了角色继承这一关键概念。这一扩展为权限系统带来了更高的灵活性和效率。

RBAC1 模型允许角色之间建立层级关系。在这种结构中,高级角色不仅拥有自身的特定权限,还能自动继承低级角色的所有权限。

这种设计模拟了现实世界中的组织结构,使得权限系统更贴近实际需求。

RBAC2 模型

RBAC2模型在RBAC0模型的基础上引入了角色约束控制机制,增加了责任分离关系。

这种模型规定了在分配权限给角色、将角色赋予用户,以及用户激活某个角色时必须遵守的强制性规则。RBAC2模型主要包含以下三种约束:

1、互斥关系角色

这种约束确保同一用户不能同时拥有相互制约的角色。例如,在运营部门中,用户运营和渠道运营可能被设置为互斥角色。

一个用户只能被分配其中一个角色,不能同时担任两者。这种设置体现了职责分离的原则,有助于防止权力过度集中和潜在的利益冲突。

2、基数约束

这种约束限制了角色分配的数量和范围。它可以限制一个角色可以分配给的用户数量,控制单个用户可以拥有的角色数目,以及一个角色可以拥有的权限数量。

通过这种方式,系统可以有效地控制高级权限的分配,防止权限过度扩散,从而增强系统的安全性和可管理性。

3、先决条件角色

这种约束建立了角色之间的依赖关系。如果用户想要获得某个高级角色,必须先获得其下级角色。这种设计确保了用户在获得更高权限之前,已经具备了必要的经验和资格。

总体来说,不同的权限模型有不同的适用场景:

  • ACL 模型:适用于小型、简单的系统,权限需求不复杂。
  • RBAC0 模型:引入角色,方便管理,适用于一般的权限需求。
  • RBAC1 模型:增加角色继承,适用于权限层级分明的系统。
  • RBAC2 模型:增加角色约束控制,适用于对权限管理要求高的系统。

选择合适的权限模型,需要根据系统的规模、复杂程度和安全需求来决定。

本文已收录于,我的技术网站:
tangshiye.cn
里面有,算法Leetcode详解,面试八股文、BAT面试真题、简历模版、架构设计,等经验分享。