Table of contents
展开目录
前言
一个基本的 ACCESS CONTROL LIST 会基于 “用户”、“角色”、“权限”三个模型:
1.“用户”不直接获得“权限”,而是通过“用户”所属“角色”来继承该“角色”所拥有的“权限”;
2.“角色”直接获得“权限”。
用户(USER)
用户模型,仅仅用于 AUTH 认证,最常见的是“登录校验”这块。例如一个 CMS 管理系统后台,USER 最常见的字段有 username
、password
等等:
角色(ROLE)
角色模型,是系统为某个权限集合所定义的“权限集合”名称,你可以理解为“权限组”。
例如“运营员”,你可以将“增加商品”、“修改商品”、“查看商品”、“修改菜单”这四个“权限”作为一个“权限组”定义为“运营员”角色。然后将某个“用户”定义为“运营员”角色,则该“用户”即可继承“运营员”获得这三个“权限”。
再例如“仓库管理员”,你可以将订单相关的“权限组”定义为该角色等等。
有个特例是“超级管理员”,众所周知,这个角色,通常在系统中默认拥有全部权限,所以,这类角色,通常直接放在“用户”模型比较好。在程序中便可硬编码,判断该“用户”是否为超级管理,若为真则可不需要进行权限的判断了,在扩展方面会更好些。
权限(PERMISSION)
权限模型,是针对资源进行数据库操作时所定义的一些“操作名称”,例如对“商品”这个资源,常见的便是“增删改查”,更细化可以有“更换商品图片”等针对某些字段级别的资源操作。
用户 & 角色(Relation-Ship)
MANY-TO-MANY
角色 & 权限(Relation-Ship)
MANY-TO-MANY
模型 ER 图
模拟数据
- 用户
user_admin
为 admin
角色,该角色拥有四个权限:
- 用户
user_staff
为 staff
角色,该角色拥有三个权限:
- 用户
user_visitor
为 visitor
角色,该角色拥有一个权限:
Table Data
常见的“权限”校验方法:
-
硬编码在每一个视图或某个业务方法中;
-
写在中间件中,根据“权限”所属的资源,如路由等,来进行校验。
封装用户权限校验
硬编码
例如,当用户进行“删除或创建商品”操作时,可以直接在控制器方法中进行限制:
中间件
“硬编码”会因为路由的增加而使维护、扩展越来越麻烦,因此,通常将平行权限,或需要特定判断的业务才硬编码到视图逻辑中。
现在,我们往“权限”表中,加入路由字段,进行基于路由校验权限的扩展:
之后,我们便可在诸如Laravel 中间件、Codeigiter 钩子函数等,拦截请求,进行权限校验: