在php项目开发中,基于角色的访问控制是管理用户权限的常用方案,通过给用户分配不同角色,再给角色绑定对应权限,能灵活控制不同用户的操作范围。Leaf Auth是一款轻量易用的php认证库,内置了用户认证、角色管理、权限校验等核心功能,非常适合快速搭建访问控制认证系统。

环境准备与Leaf Auth安装
首先确保服务器环境满足php7.4及以上版本,并且已经安装composer依赖管理工具。在项目根目录执行以下命令安装Leaf Auth:
composer require leafs/auth
安装完成后,需要初始化Leaf Auth的配置,设置数据库连接信息和基础认证参数,示例代码如下:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use LeafAuth;
// 初始化数据库连接,这里使用PDO连接mysql
$db = new PDO('mysql:host=127.0.0.1;dbname=test_auth;charset=utf8', 'root', '123456');
Auth::init([
'db' => $db,
'user_table' => 'users', // 用户表名
'role_table' => 'roles', // 角色表名
'permission_table' => 'permissions', // 权限表名
'user_role_table' => 'user_roles', // 用户角色关联表名
'role_permission_table' => 'role_permissions' // 角色权限关联表名
]);
数据库表结构设计
要实现基于角色的访问控制,需要提前设计好五张核心表,结构如下:
| 表名 | 核心字段 | 说明 |
|---|---|---|
| users | id, username, password, created_at | 存储用户基础信息,password字段存储加密后的密码 |
| roles | id, role_name, description, created_at | 存储角色信息,比如管理员、普通用户等 |
| permissions | id, permission_name, description, created_at | 存储权限标识,比如article:add、user:delete等 |
| user_roles | id, user_id, role_id | 用户和角色的关联表,一个用户可以对应多个角色 |
| role_permissions | id, role_id, permission_id | 角色和权限的关联表,一个角色可以对应多个权限 |
实现用户注册与登录
使用Leaf Auth提供的自带方法可以快速实现用户注册和登录功能,注册时自动对密码进行加密存储,登录时验证账号密码并返回认证令牌。
用户注册
<?php
// 用户注册接口
$data = [
'username' => 'test_user',
'password' => '123456'
];
$result = Auth::register($data);
if ($result) {
echo '注册成功,用户ID:' . $result['id'];
} else {
echo '注册失败:' . Auth::errors()[0];
}
用户登录
<?php
// 用户登录接口
$loginData = [
'username' => 'test_user',
'password' => '123456'
];
$user = Auth::login($loginData);
if ($user) {
// 登录成功,返回用户信息,包含用户绑定的角色
echo '登录成功,用户名:' . $user['username'];
// 可以将用户登录状态存储到session或者返回jwt令牌
session_start();
$_SESSION['user'] = $user;
} else {
echo '登录失败:' . Auth::errors()[0];
}
角色与权限的分配管理
完成用户认证后,需要给用户分配角色,给角色绑定对应的权限,Leaf Auth提供了对应的方法操作关联数据。
给用户分配角色
<?php
// 给用户ID为1的用户分配管理员角色,假设管理员角色ID为1
$assignResult = Auth::assignRole(1, 1);
if ($assignResult) {
echo '角色分配成功';
} else {
echo '角色分配失败:' . Auth::errors()[0];
}
给角色分配权限
<?php
// 给管理员角色ID为1分配文章添加权限,假设权限ID为1
$permissionResult = Auth::assignPermission(1, 1);
if ($permissionResult) {
echo '权限分配成功';
} else {
echo '权限分配失败:' . Auth::errors()[0];
}
接口权限校验实现
在需要权限控制的接口中,通过Leaf Auth的权限校验方法判断当前登录用户是否拥有对应的操作权限,没有权限则返回错误提示。
<?php
session_start();
// 校验当前登录用户是否有article:add权限
if (Auth::userCan($_SESSION['user']['id'], 'article:add')) {
echo '你拥有添加文章的权限,可以执行添加操作';
// 执行添加文章的业务逻辑
} else {
echo '你没有添加文章的权限,操作被拒绝';
http_response_code(403);
}
常见问题说明
- 如果用户拥有多个角色,Leaf Auth会自动合并所有角色的权限,只要有一个角色拥有对应权限就校验通过
- 密码加密默认使用php的password_hash函数,验证时使用password_verify,无需手动处理加密逻辑
- 如果需要自定义认证逻辑,可以继承Leaf Auth的核心类重写对应方法,满足个性化需求
注意:生产环境中不要将数据库密码、敏感配置直接写在代码里,建议使用环境变量或者配置文件单独管理,避免敏感信息泄露。