首页
直播
壁纸
友链
搜索
1
微信小程序支付全链路实战:JSAPI 下单、调起支付、回调验签与退款
266 阅读
2
微信小程序云开发实战:云函数、云数据库与云存储的正确使用姿势
256 阅读
3
微信小程序自定义 tabBar 实战:custom-tab-bar 从适配到深色模式
255 阅读
4
微信小程序 Skyline 渲染引擎实战:worklet 动画从原理到落地
253 阅读
5
微信小程序分包进阶:独立分包、预下载与分包异步化实战
246 阅读
服务器运维
后端技术
前端技术
梯子
数据库
小程序
登录
搜索
标签搜索
fastadmin
Redis
微信小程序
前端开发
RabbitMQ
Go
服务器
codex
buildadmin
小程序
mysql
Nginx
Docker
Vue3
Node.js
MySQL优化
Linux
TypeScript
JWT
PHP
沿途的风景
累计撰写
74
篇文章
累计收到
0
条评论
首页
栏目
服务器运维
后端技术
前端技术
梯子
数据库
小程序
页面
直播
壁纸
友链
搜索到
1
篇与
» RBAC
的结果
2026-03-26
FastAdmin 权限认证体系:RBAC 角色与菜单管理
前言FastAdmin 内置了完整的 RBAC(基于角色的访问控制)权限体系,支持细粒度的菜单管理、操作权限和数据权限控制。本文将深入讲解 FastAdmin 权限认证的工作原理和实际配置方法。一、RBAC 权限模型概述FastAdmin 的权限体系包含三个核心实体:管理员(Admin)──→ 角色组(Group)──→ 权限规则(Rule)实体数据表说明管理员fa_admin后台用户,每个用户属于一个或多个角色组角色组fa_group角色定义,每个角色关联一组权限规则权限规则fa_auth_rule权限节点,对应控制器的每个操作方法二、权限认证流程2.1 认证类 AuthFastAdmin 的权限认证由 application/common/library/Auth.php 实现:namespace app\common\library; use think\Session; use think\Cookie; use app\admin\model\Admin as AdminModel; class Auth { protected $logined = false; // 是否登录 protected $admin = null; // 当前管理员信息 protected $error = ''; // 错误信息 protected $requestUri = ''; // 当前请求 URL // 检查是否已登录 public function isLogin() { if ($this->logined) { return true; } $admin = Session::get('admin'); if (!$admin) { return false; } // 验证管理员状态 $this->admin = AdminModel::get($admin['id']); if (!$this->admin || $this->admin['status'] != 'normal') { return false; } $this->logined = true; return true; } // 检查权限 public function check($name = '') { if (!$this->isLogin()) { return false; } // 超级管理员直接通过 if ($this->admin['id'] == 1) { return true; } // 获取当前用户的所有权限规则 $rules = $this->getRuleList(); if (!$name) { $name = strtolower($this->request->module() . '/' . $this->request->controller() . '/' . $this->request->action()); } $name = strtolower($name); // 检查是否有匹配的权限 foreach ($rules as $rule) { if ($this->checkRule($rule, $name)) { return true; } } return false; } }2.2 权限检查链路请求进入 → Backend 控制器初始化 → Auth::check() 检查当前 URL 是否有权限 → 无权限 → 返回 403 / 跳转登录 → 有权限 → 继续执行2.3 控制器中的权限注解FastAdmin 通过注解方式声明权限节点:// application/admin/controller/content/Article.php namespace app\admin\controller\content; use app\common\controller\Backend; class Article extends Backend { // 默认不需要登录的方法 protected $noNeedLogin = []; // 默认不需要权限验证的方法 protected $noNeedRight = []; /** * 文章列表 */ public function index() { return parent::index(); } /** * 添加文章 */ public function add() { return parent::add(); } /** * 编辑文章 */ public function edit($ids = null) { return parent::edit($ids); } /** * 删除文章 */ public function del($ids = null) { return parent::del($ids); } }每个 public 方法自动注册为一个权限节点,格式为 content/article/index。三、菜单管理3.1 菜单结构菜单存储在 fa_auth_rule 表中,采用树形结构:-- 查看菜单结构 SELECT id, pid, name, title, type FROM fa_auth_rule ORDER BY weigh DESC;字段说明id节点 IDpid父节点 ID(0 为顶级)name权限规则名(URL 路径)title菜单显示名称type类型:menu=菜单,file=操作节点icon菜单图标(FontAwesome)ismenu是否在左侧菜单显示(1=显示)3.2 命令行生成菜单# 根据控制器自动生成菜单 php think menu -c content/article # 强制覆盖 php think menu -c content/article -f 13.3 后台手动管理菜单进入 后台 → 权限管理 → 菜单规则,可以:添加/编辑/删除菜单节点拖拽排序设置菜单图标控制菜单是否显示3.4 菜单与权限的关系菜单规则(fa_auth_rule) ├── 内容管理 (ismenu=1, type=menu) │ ├── 文章管理 (ismenu=1, type=menu) │ │ ├── 查看 (ismenu=0, type=file) → content/article/index │ │ ├── 添加 (ismenu=0, type=file) → content/article/add │ │ ├── 编辑 (ismenu=0, type=file) → content/article/edit │ │ └── 删除 (ismenu=0, type=file) → content/article/delismenu=1 的节点显示在左侧导航栏,ismenu=0 的是操作按钮权限。四、角色组管理4.1 创建角色组进入 后台 → 权限管理 → 角色组:点击"添加"填写角色名称(如"内容编辑")勾选该角色拥有的权限保存4.2 角色权限继承角色组支持树形结构,子角色自动继承父角色的所有权限:超级管理员(id=1,拥有所有权限) ├── 内容主管(拥有内容管理全部权限) │ ├── 内容编辑(拥有文章增改权限,无删除权限) │ └── 内容审核(拥有文章审核权限) └── 系统管理员(拥有系统设置权限)4.3 数据权限FastAdmin 支持基于角色组的数据隔离:// 在控制器中启用数据权限 public function index() { // 只能查看自己创建的数据 $this->dataLimit = 'personal'; // 只能查看本角色组的数据 $this->dataLimit = 'auth'; // 自定义数据限制字段 $this->dataLimitField = 'admin_id'; return parent::index(); }数据权限模式说明:模式说明null不限制,可查看所有数据personal只能查看自己创建的数据auth只能查看本角色组及子角色组的数据五、API Token 认证除了后台 Session 认证,FastAdmin 的 API 模块支持 Token 认证:5.1 Token 生成// application/api/controller/User.php namespace app\api\controller; use app\common\controller\Api; use app\common\library\Token; class User extends Api { // 登录获取 Token public function login() { $username = $this->request->post('username'); $password = $this->request->post('password'); $admin = \app\admin\model\Admin::get(['username' => $username]); if (!$admin || $admin->password != md5(md5($password) . $admin->salt)) { $this->error('用户名或密码错误'); } // 生成 Token $token = Token::create($admin['id'], 'admin', 86400 * 7); $this->success('登录成功', [ 'token' => $token, 'admin' => $admin, ]); } }5.2 Token 验证中间件// API 请求头携带 Token // Authorization: Bearer xxx-xxx-xxx // 在 API 控制器中验证 namespace app\api\controller; class Order extends Api { // 需要登录的方法 protected $noNeedLogin = []; public function list() { // $this->auth 已自动初始化 $adminId = $this->auth->id; $orders = model('Order')->where('admin_id', $adminId)->select(); $this->success('获取成功', $orders); } }六、安全加固建议6.1 密码安全// FastAdmin 使用双重 MD5 加盐 // password = md5(md5(明文密码) . salt) // 自定义更安全的加密方式 \app\admin\model\Admin::event('before_insert', function ($admin) { $admin->salt = \fast\Random::alnum(8); $admin->password = password_hash($admin->password, PASSWORD_BCRYPT); });6.2 登录失败限制FastAdmin 默认 5 次登录失败后锁定 15 分钟,可在配置中调整:// application/extra/site.php 'login_failure_retry' => 5, // 最大失败次数 'login_failure_lock' => 900, // 锁定时间(秒)6.3 操作日志所有后台操作自动记录到 fa_admin_log 表:// 手动记录日志 \app\admin\model\AdminLog::record([ 'title' => '手动操作文章', 'content' => '修改了文章ID:' . $id, ]);总结FastAdmin 的权限体系基于标准 RBAC 模型,通过菜单规则表实现细粒度权限控制。核心要点:权限规则对应控制器的每个方法,自动注册角色组支持树形继承,子角色继承父角色权限数据权限支持 personal 和 auth 两种模式API 模块通过 Token 实现无状态认证
2026年03月26日
7 阅读
0 评论
0 点赞
0:00