在Linux环境下使用ThinkPHP进行权限控制,通常涉及以下几个方面:
用户认证(Authentication):
角色和权限管理:
访问控制列表(ACL):
中间件(Middleware):
以下是一个简单的示例,展示如何在ThinkPHP中实现基本的权限控制:
首先,确保用户已经登录。可以使用Session来管理用户会话。
// 在控制器中检查用户是否登录
public function checkLogin()
{
if (!$this->request->hasSession('user')) {
$this->error('请先登录', url('login'));
}
}
定义角色和权限,并在数据库中进行存储。
-- 创建用户表
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`role_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
-- 创建角色表
CREATE TABLE `roles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
-- 创建权限表
CREATE TABLE `permissions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
-- 创建角色权限关联表
CREATE TABLE `role_permissions` (
`role_id` int(11) NOT NULL,
`permission_id` int(11) NOT NULL,
PRIMARY KEY (`role_id`, `permission_id`)
);
在控制器中使用ACL来检查用户是否有权限访问某个资源。
// 在控制器中检查用户权限
public function checkPermission($permission)
{
$userId = $this->request->hasSession('user') ? $this->request->session('user.id') : null;
if (!$userId) {
$this->error('请先登录', url('login'));
}
// 查询用户的角色
$roleIds = Db::table('user_roles')->where('user_id', $userId)->column('role_id');
// 查询角色的权限
$permissions = Db::table('role_permissions')
->join('permissions', 'role_permissions.permission_id', '=', 'permissions.id')
->whereIn('role_permissions.role_id', $roleIds)
->column('permissions.name');
if (!in_array($permission, $permissions)) {
$this->error('没有权限访问此资源');
}
}
使用中间件来拦截请求,进行权限检查。
// 创建一个中间件
namespace app\middleware;
use think\Request;
use think\Response;
class AuthMiddleware
{
public function handle(Request $request, \Closure $next)
{
$permission = $request->route()->get('permission');
if ($permission) {
$this->checkPermission($permission);
}
return $next($request);
}
private function checkPermission($permission)
{
$userId = $this->request->hasSession('user') ? $this->request->session('user.id') : null;
if (!$userId) {
$this->error('请先登录', url('login'));
}
// 查询用户的角色
$roleIds = Db::table('user_roles')->where('user_id', $userId)->column('role_id');
// 查询角色的权限
$permissions = Db::table('role_permissions')
->join('permissions', 'role_permissions.permission_id', '=', 'permissions.id')
->whereIn('role_permissions.role_id', $roleIds)
->column('permissions.name');
if (!in_array($permission, $permissions)) {
$this->error('没有权限访问此资源');
}
}
}
在config/middleware.php中注册中间件:
return [
\app\middleware\AuthMiddleware::class,
];
在路由文件中配置需要权限控制的路由,并传递权限参数。
use think\Route;
Route::get('admin', 'admin/AdminController@index')->middleware(['auth:admin']);
Route::get('edit', 'admin/EditController@index')->middleware(['auth:edit']);
通过以上步骤,你可以在ThinkPHP中实现基本的权限控制。根据实际需求,你可以进一步扩展和优化权限控制系统。