vi-kon / laravel-auth
Laravel 5.2 的基于角色权限的认证器
Requires
- php: >=5.5.9
- illuminate/auth: ~5.2
- illuminate/config: ~5.2
- illuminate/container: ~5.2
- illuminate/database: ~5.2
- illuminate/routing: ~5.2
- illuminate/support: ~5.2
- vi-kon/laravel-support: ~1.0
This package is not auto-updated.
Last update: 2021-03-05 21:53:39 UTC
README
这是一个用于基于角色权限认证的 Laravel 5 包。
目录
特性
- 基于权限的访问
- 权限分组(角色)
- 通过单独的权限或角色限制路由访问
- 允许使用相同的用户名,并分别属于不同的命名空间(每个命名空间都需要单独的登录界面或指定命名空间的登录选项)
待办事项
- 修复传入的错误
- 完成文档
- 编写测试
- 缓存元数据
安装
Composer
有多种方式可以通过 composer 安装此包
-
将以下行添加到您的
composer.json
文件中// to your "require" object "vi-kon/laravel-auth": "^3.0"
-
或者在项目根目录中运行以下命令
composer require vi-kon/laravel-auth
此命令将在您的 composer.json 文件中添加上述行并下载所需的包文件。
设置
在您的 Laravel 5.1 项目中,将以下行添加到 config/app.php
// to providers array \ViKon\Auth\AuthServiceProvider::class,
别名
您可以可选地将别名添加回 app.php
// to aliases array 'RouterAuth' => \ViKon\Auth\Facades\RouterAuth::class,
中间件
不需要将简写键分配给 App\Http\Kernel
的 routeMiddleware
属性,因为 AuthServiceProvider
会自动完成。这些中间件包括:
具有访问权限的中间件
具有访问权限的中间件可以附加到组或路由。此中间件检查路由是否分配了权限,以及当前用户是否有权访问该路由。
用法
部分 routes.php
// Single route Route::get('/', [ 'middleware' => 'auth.has-access', 'permission' => 'access.some.controller', 'uses' => 'SomeController@index', ]); // Multiple routes in group Route::group(['middleware' => 'auth.has-access'], function () { // ... Route::get('/', [ 'permission' => 'access.some.controller', 'uses' => 'SomeController@index', ]); // ... });
登录重定向中间件
此中间件允许将用户(如果未认证)重定向到自定义登录页面。如果用户被分隔到不同的命名空间,并且某些路由属于第一个命名空间,而其他路由属于第二个命名空间,则非常有用。
权限中间件
权限中间件从其参数中获取权限,如果用户没有权限访问该路由,则限制用户。
模型
所有模型都具有可配置的数据库名称。这些数据库名称位于 table.*
配置值下。在此简短介绍中使用默认表名称。该包包含以下模型:
模型使用枢纽表来实现多对多关系:rel__role__group
,rel__user__role
,rel__user__group
。
注意:所有表名称,即使是枢纽表名称,都可以通过配置文件进行配置。
警告:如果数据库已经迁移,则不建议更改表名称,因为迁移下方法将尝试在错误的表上执行。
用户模型
代表模型,实现 AuthenticatableContract
和 CanResetPasswordContract
接口,并使用 Authenticatable
和 CanResetPassword
特性。
命名空间: ViKon\Auth\Model
数据库表: users
读/写属性
类型 | 名称 | 描述 | 默认 | 数据库 |
---|---|---|---|---|
integer | id |
唯一的用户标识符 | - | 主键,自增 |
string | username |
用户名 | - | |
string | password |
用户密码 | - | 长度 255 |
string | email |
用户电子邮件地址 | - | 长度 255 |
string | remember_token |
"记住我"的记住令牌 | null | 可空 |
string | package |
包名 | "system" | 长度 255 |
string | home |
用户主页路由名称 | null | 可空 |
boolean | blocked |
检查用户是否被阻止 | false | |
boolean | static |
不允许在 GUI 上删除 | false | |
boolean | hidden |
不允许在 GUI 上显示 | false |
username
和 package
列有合同唯一索引。
读属性(关系)
类型 | 名称 | 描述 | 默认 | 数据库 |
---|---|---|---|---|
\ViKon\Auth\Model\Role[] | roles |
角色集合 | - | 与 user_roles 表的多对多关系 |
\ViKon\Auth\Model\Permission[] | permissions |
权限集合 | - | 与 user_permissions 表的多对多关系 |
\ViKon\Auth\Model\Reminder[] | reminders |
提醒集合 | - | 与 user_password_reminders 表的多对多关系 |
方法(关系)
Laravel 查询构建器的关联。
类型 | 名称 | 描述 | 数据库 |
---|---|---|---|
BelongsToMany | roles() |
查询构建器的用户关系 | 与 user_roles 表的多对多关系 |
BelongsToMany | permissions() |
查询构建器的权限关系 | 与 user_permissions 表的多对多关系 |
BelongsToMany | reminders() |
查询构建器的提醒关系 | 与 user_password_reminders 表的多对多关系 |
HasOne | profile() |
返回附加的用户个人资料 | 与 user_profile 表的一对一关系(此表可以通过自定义个人资料模型进行自定义) |
角色模型
角色用于管理用户权限作为集合。因此,这是一个将多个权限添加到用户的辅助工具。每个角色可以包含多个权限。
命名空间: ViKon\Auth\Model
数据库表: user_roles
读/写属性
类型 | 名称 | 描述 | 默认 | 数据库 |
---|---|---|---|---|
integer | id |
唯一的角色标识符 | - | 主键,自增 |
string | token |
唯一的角色名称(令牌) | null | 唯一,可空 |
boolean | static |
不允许在 GUI 上删除 | false | |
boolean | hidden |
不允许在 GUI 上显示 | false |
读属性(关系)
类型 | 名称 | 描述 | 默认 | 数据库 |
---|---|---|---|---|
\ViKon\Auth\Model\User[] | users |
用户集合 | - | 与 users 表的多对多关系 |
\ViKon\Auth\Model\Permission[] | permissions |
权限集合 | - | 与 user_permissions 表的多对多关系 |
方法(关系)
Laravel 查询构建器的关联。
类型 | 名称 | 描述 | 数据库 |
---|---|---|---|
BelongsToMany | users() |
查询构建器的用户关系 | 与 users 表的多对多关系 |
BelongsToMany | permissions() |
查询构建器的角色关系 | 与 user_permissions 表的多对多关系 |
权限模型
权限用于授予用户某些访问权限,如访问路径或特定操作。每个操作都应该有单独的权限。
例如,在REST控制器中,应该为单个操作具有{操作名称}.index
、{操作名称}.show
、{操作名称}.create
、{操作名称}.edit
和{操作名称}.destroy
权限。
命名空间: ViKon\Auth\Model
数据库表: user_permissions
读写属性
类型 | 名称 | 描述 | 默认 | 数据库 |
---|---|---|---|---|
integer | id |
唯一的权限标识符 | - | 主键,自增 |
string | token |
唯一的权限令牌 | - | 唯一 |
读取属性(关系)
类型 | 名称 | 描述 | 默认 | 数据库 |
---|---|---|---|---|
\ViKon\Auth\Model\User[] | users |
用户集合 | - | 与 users 表的多对多关系 |
\ViKon\Auth\Model\Role[] | roles |
角色集合 | - | 与 user_roles 表的多对多关系 |
方法(关系)
Laravel 查询构建器的关联。
类型 | 名称 | 描述 | 数据库 |
---|---|---|---|
BelongsToMany | users() |
查询构建器的用户关系 | 与 users 表的多对多关系 |
BelongsToMany | roles() |
查询构建器的角色关系 | 与 user_roles 表的多对多关系 |
UserPasswordReminder模型
存储带有存储时间的密码提醒令牌。
命名空间: ViKon\Auth\Model
数据库表: user_password_reminders
读写属性
类型 | 名称 | 描述 | 默认 | 数据库 |
---|---|---|---|---|
integer | id |
唯一的提醒标识符 | - | 主键,自增 |
integer | user_id |
用户ID | - | 索引 |
string | token |
密码令牌 | - | |
Carbon | created_at |
创建时间 | - |
读取属性(关系)
类型 | 名称 | 描述 | 默认 | 数据库 |
---|---|---|---|---|
\ViKon\Auth\Model\User | 用户 |
用户模型 | - | 与users 表的多对一关系 |
方法(关系)
Laravel 查询构建器的关联。
类型 | 名称 | 描述 | 数据库 |
---|---|---|---|
BelongsTo | user() |
查询构建器的用户关系 | 与 users 表的多对多关系 |
Profile模型
Profile模型在此包中未实现。这仅用于支持通过单个一对一关系向用户添加自定义数据。在配置中使用profile
选项可以自定义Profile模型的位置。
Profile模型只有一个限制。需要有一个user_id
列,该列指向用户模型id
列。
Profile迁移文件的简短示例
class CreateProfileTable extends Migration { public function up() { Schema::create('user_profile', function (Blueprint $table) { $table->engine = 'InnoDB'; $table->increments('id'); // Foreign connection to user table $table->unsignedInteger('user_id') ->unique(); $table->foreign('user_id') ->references('id') ->on('users') ->onUpdate('cascade') ->onDelete('cascade'); }); } public function down() { Schema::drop('user_profile'); } }
辅助类
Guard类
Guard
类扩展了Laravel的默认Guard
类,以授予新功能的访问权限。这些功能允许获取当前用户的权限,检查用户是否被阻止。
方法
一些方法不是新实现的,只是被覆盖了。
- attempt - 使用凭据尝试认证用户(如果设置了默认角色包,则自动注入凭据)
- hasPermission - 检查认证用户是否具有特定权限
- hasPermissions - 检查认证用户是否同时具有多个权限
- isBlocked - 检查认证用户是否被阻止
- user - 获取认证用户
待办事项:方法描述
RouterAuth类
RouterAuth
类允许从路由中获取认证信息。
方法
- hasAccess - 获取命名路由的角色
- isPublic - 检查当前用户是否有访问命名路由的权限
- getPermissions - 检查路由是否为公开(路由没有权限)
待办事项:方法描述
中间件
中间件类允许通过附加的权限来过滤单个路由。
- HasAccessMiddleware - 检查认证用户是否对当前路由有单一或多项权限
- HasAccessMiddleware - 检查认证用户是否对当前路由有单一权限
注意:这些中间件之间的区别仅在于语法。
PermissionMiddleware 中间件
注意:路由无法从该中间件获取参数。
HasAccessMiddleware 中间件
检查认证用户是否拥有访问当前路由的所有权限。要向路由添加权限,只需将具有正确权限的 permissions
键添加到路由选项中。
Router::get('/', [ 'permissions' => 'permission.name', ]);
或者如果传递了多个权限(认证用户必须拥有所有权限才能访问路由)
Router::get('/', [ 'permissions' => [ 'permission.first.name', 'permission.second.name', ], ]);
注意:如果当前路由的
permissions
键为空或不存在,则路由将被标记为公开,不会进行路由限制。
配置
使用 php artisan vendor:publish --provider="ViKon\Auth\AuthServiceProvider" --tag="config"
命令可以将所有配置文件发布到 vi-kon/auth.php
。
在此文件中,有多种选项。以下选项可用
- login.route - 登录屏幕路由名称
- error-403.route - 如果用户已经认证但无权访问路由的路由名称
如果用户未认证且路由不为公开,则中间件将用户重定向到存储在 login.route
配置值中的命名路由。
如果用户已认证但未获得足够的权限访问路由,则中间件将用户重定向到存储在 error-403.route
配置值中的命名路由。
否则,中间件允许访问路由。
注意:
login.route
和error-403.route
存储的是路由名称。
在 403 错误期间,以下参数将在重定向时闪存到会话中
- route-request-uri - 带完整 URL
- route-roles - 需要由路由列表的数组
用法
// check if user have "admin" role $options = [ 'middleware' => 'auth.role', 'permissions' => 'admin', ]; Route::get('URL', $options); // check if user have "admin" and "superadmin" roles $options = [ 'middleware' => 'auth.role', 'permissions' => ['admin', 'superadmin'], ]; Route::get('URL', $options);
命名空间
命名空间对于将用户分组到单独的登录组非常有用。在每个命名空间中,用户名是唯一的,但在其他命名空间中,使用相同的用户名是允许的。
默认包是 system
。所有用户都存储在这个包中。
认证
对于默认命名空间的用户认证很简单,只需像往常一样调用 attempt
方法即可
if (Auth::attempt(['email' => $email, 'password' => $password])) { return redirect()->intended('dashboard'); }
对于自定义命名空间的认证,需要提供命名空间名称
if (Auth::attempt(['email' => $email, 'password' => $password, 'namespace' => $namespace])) { return redirect()->intended('dashboard'); }
许可协议
此软件包受 MIT 许可协议许可