1. 为什么你需要一个权限系统?
如果你正在开发一个后台管理系统、一个内部运营平台,或者任何一个需要区分不同用户能干什么、不能干什么的Web应用,那么“权限”就是你绕不开的一道坎。想象一下,你公司的财务系统,普通员工只能查看自己的工资条,部门经理能看到整个部门的,而HR和财务总监则拥有所有的操作权限。如果没做好权限控制,那后果简直不敢想。
我见过不少项目初期为了赶进度,把权限校验的逻辑硬编码在Controller的方法里,满屏的 if-else 判断用户角色。代码又臭又长,维护起来简直是噩梦。每次新增一个功能点,都要小心翼翼地找到所有相关的地方去添加判断,生怕漏掉一个导致权限漏洞。后来项目越做越大,团队来了新人,根本不敢动这块祖传代码。
所以,一个清晰、可维护、易于扩展的权限系统,绝不是“锦上添花”,而是保障应用安全与健康的“基础设施”。而RBAC(Role-Based Access Control,基于角色的访问控制)模型,就是构建这套基础设施最经典、最实用的蓝图。它的核心思想很简单:用户关联角色,角色关联权限。给用户分配角色,而不是直接分配一堆零散的权限。这样,当员工的岗位变动时,你只需要调整他的角色,所有权限自动更新,管理成本大大降低。
今天,我就带你用 SaToken 这个框架,从零开始,手把手搭建一个RBAC权限系统。SaToken我用过很多次,它最大的特点就是“轻量”和“优雅”,几行配置和注解就能搞定复杂的权限逻辑,对新手非常友好。咱们不搞理论空谈,直接上代码,用最实在的例子,让你在30分钟内摸清门道。
2. 五分钟理解RBAC核心:五张表的故事
任何坚固的建筑都需要好的地基,RBAC系统的地基就是数据库表设计。别看RBAC听起来高大上,它的数据模型用五张表就能清晰地表达出来。我们一步步来看,这五张表是如何环环相扣的。
首先,我们得有用户(Users)。这很好理解,就是系统里一个个具体的操作者,表里至少存着用户ID、用户名、密码等基本信息。
接着是角色(Role)。角色是权限的集合,是用户和权限之间的桥梁。比如“管理员”、“普通用户”、“访客”都是角色。角色表会记录角色ID和角色编码(如admin、user)等信息。
用户和角色是多对多的关系。一个用户(比如部门主管)可能同时拥有“项目经理”和“技术评审”两个角色;同样,一个“管理员”角色也可以分配给多个用户。这就需要一张用户-角色关联表(User_Role),里面就两列:用户ID和角色ID,用来记录这种多对多的绑定关系。
然后是权限(Permission)。权限是系统中最细粒度的操作许可,通常用一个字符串编码来表示,比如 user:add(添加用户)、order:query(查询订单)。权限表记录权限ID和权限编码。
角色和权限也是多对多的关系。一个“管理员”角色可能拥有所有权限,而“普通用户”角色可能只有查看权限。这就需要角色-权限关联表(Role_Permission) 来记录角色拥有哪些权限。
让我用一个更生活的例子来串一下:假设你是一家图书馆的管理软件。Users表就是所有的读者和馆员。Role表定义了“读者”、“图书管理员”、“系统管理员”等角色。User_Role表决定了张三既是“读者”也是“图书管理员”。Permission表定义了“借书”、“还书”、“录入新书”、“设置借阅规则”等具体操作。最后,Role_Permission表规定了“图书管理员”角色拥有“借书”、“还书”、“录入新书”的权限,而“系统管理员”则拥有所有权限。
通过这五张表,任何用户的权限都可以通过两次查询轻松得出:先查他有哪些角色,再查这些角色对应哪些权限。这种设计将变化隔离了:修改权限点,只需要更新Role_Permission表;调整用户权限,只需要更新User_Role表。业务逻辑变得非常清晰和稳定。
3. 项目初始化:引入SaToken依赖与配置
理论说完了,咱们动真格的。首先,你需要一个Spring Boot项目。如果你还没有,可以用Spring Initializr快速生成一个,记得勾选Web依赖。
第一步,把SaToken请进我们的项目。打开pom.xml文件,添加以下依赖。我习惯用最新的稳定版,你可以去SaToken的官网或Maven中央仓库查看最新版本号。
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.38.0</version>
</dependency>
就这一条依赖,SaToken的核心功能就全进来了,非常干净。接下来,我们需要对SaToken进行一些基础配置,让它适应我们的项目。在application.yml(或application.properties)里添加如下配置:
sa-token:
# token的名称,同时也是Cookie的名称,就叫satoken挺好
token-name: satoken
# token的有效期,单位是秒。这里设了30天(30*24*3600)。-1代表永久有效,但生产环境不建议。
timeout: 2592000
# token活跃有效期,-1代表不限制。比如设为1800,那么用户如果30分钟没有任何操作,token就会失效。
active-timeout: -1
# 是否允许同一账号同时在多地登录。true为允许,false则新登
92



被折叠的 条评论
为什么被折叠?



