signes / acl
Laravel 高级 ACL
Requires
- php: >=5.4.0
- illuminate/container: ^5.0.0
- illuminate/database: ^5.0.0
- illuminate/events: ^5.0.0
- illuminate/support: ^5.0.0
This package is not auto-updated.
Last update: 2022-08-02 17:03:30 UTC
README
#Laravel 5 ACL#
###对于 Laravel 4,请使用laravel4分支。请注意,此版本(Laravel 4)已不再维护。###
使用此包,您将能够详细控制对 Laravel 网站上任何资源的访问。此机制灵感来源于框架 FuelPHP 中使用的惊人的OrmAuth解决方案。
您获得了强大的管理访问级别的机制,包括
- 每个用户可能有一个组,
- 每个用户可能有多个角色,
- 每个用户可能有多个权限,
- 每个组可能有多个角色,
- 每个组可能有多个权限,
- 每个角色可能有多个权限,
- 每个角色可能有特殊的权限过滤器,这授予对一切的全球访问权限,拒绝访问一切或拒绝之前授予的访问,
- 每个权限可能由
zone
、permission
和多个actions
组成
要求
- Laravel ~5.1
- PHP >= 5.5
推荐
##安装##
- 在 composer 中将此包作为必需项添加
"signes/acl": "^2.0.0"
- 添加服务提供者和外观。为此,编辑您的
app.php
文件并添加
'providers' => [ ... Signes\Acl\AclServiceProvider::class, ... ];
'aliases' => [ ... 'Acl' => Signes\Acl\Facades\Acl::class, ... ];
- 将迁移和模型移动到您的项目中
php artisan vendor:publish --provider="Signes\Acl\AclServiceProvider"
此命令将复制文件
-
vendor/signes/acl/src/Acl/Publish/Migrations
->database/migrations
-
vendor/signes/acl/src/Acl/Publish/Models
->app/Models
-
迁移数据库
php artisan migrate
###应用程序名称### 在 Laravel 5 中,您可以设置自己的应用程序名称。如果您已这样做,并且默认的namespace
不是"App",则必须手动更改新模型中的命名空间。请记住,还要更新此模型中的$namespace
变量以获取正确的关联。
您还必须让 ACL 了解您使用的命名空间。您可以通过\Acl::setSiteNamespace('MyNamespace');
来完成此操作。
##用法## 您可以检查用户是否有权限访问资源。这是通过\Acl::isAllow($resource, UserInterface $user = null)
完成的。对于当前登录用户,我们检查他对在变量$resource
中定义的资源的访问权限。我们可以用几种方式描述资源
$resource_A = "zoneA.permissionA|actionA1.actionA2" $resource_A = "zoneB.permissionB|actionB1" $resource_B = "zoneC.permissionC"
结果我们得到true
或false
。
如果我们请求了多个操作,我们只有在用户有权访问这些操作中的每一个时才会得到true
结果。
您可以将$user
传递给每个\Acl::isAllowed()
方法,或者通过\Acl::setUser(UserInterface $user)
在 Acl 中仅设置一次用户。如果您不设置任何用户,默认情况下将采用访客账户,这意味着:User::find(1);
。
####特殊过滤器####
角色可以包含特殊的过滤器,如
A
- 允许访问一切D
- 拒绝访问一切R
- 撤销对资源的访问
您可以使用 $role->setFilter($filter)
来设置它。
####可用方法####
注意 所有接口(如 UserInterface
)都来自包,请确保完整命名空间。我省略了完整的命名空间描述,以使代码更易于阅读。
\Acl::setSiteNamespace($namespace)
为模型设置新的命名空间。当您更改应用程序命名空间时是必需的。
\Acl::isAllow($resource, UserInterface $user = null)
检查当前用户是否有权访问 $resource
。
\Acl::createPermission($area, $permission, array $actions = null, $description = '')
创建新的权限。 $actions
可以包含字符串或访问的数组。
\Acl::deletePermission($area, $permission = null, $actions = null)
删除现有权限。您可以删除整个 zone
、zone.permission
,或者 zone.permission
集中的单个操作。
\Acl::grantUserPermission(PermissionInterface $permission, UserInterface $user, $actions = [], $overwrite = false)
向用户授予带有操作的权限。如果 $action
是空数组,则无法访问任何操作(例如,zone.permission|action
)。只能访问全局权限(例如,zone.permission
)。如果 $action
是 true,则将授予所有权限访问。使用 $overwrite
属性,您可以决定是否覆盖现有的用户-权限关系。默认情况下,如果此关系存在并且您尝试再次设置它,将抛出异常。
\Acl::grantGroupPermission(PermissionInterface $permission, GroupInterface $group, $actions = [])
与 \Acl::grantUserPermission
的工作方式类似。
\Acl::grantRolePermission(PermissionInterface $permission, RoleInterface $role, $actions = [])
与 \Acl::grantUserPermission
的工作方式类似。
\Acl::revokeUserPermission(PermissionInterface $permission, UserInterface $user)
用户将失去对权限的访问权。关系将被删除。这仅适用于用户对象,而不是其他拥有权限的方式(例如,组或角色)。如果您想撤销特定用户的访问权限,但又不想影响其他用户的权限,您应该考虑具有 R
过滤器的特殊角色。
\Acl::revokeGroupPermission(PermissionInterface $permission, GroupInterface $group)
组将失去对权限的访问权。
\Acl::revokeRolePermission(PermissionInterface $permission, RoleInterface $role)
角色将失去对权限的访问权。
\Acl::grantUserRole(RoleInterface $role, UserInterface $user)
将用户与角色连接并授予与此角色关联的所有权限。
\Acl::grantGroupRole(RoleInterface $role, GroupInterface $group)
将用户与组连接并授予与此组关联的所有权限。
\Acl::revokeUserRole(RoleInterface $role, UserInterface $user)
断开用户与角色的连接并撤销与此角色关联的所有权限。
\Acl::revokeGroupRole(RoleInterface $role, GroupInterface $group)
断开用户与组的连接并撤销与此组关联的所有权限。
中间件##
如果您想使用中间件,您可以在 app/Http/Kernel.php
中注册它。
protected $routeMiddleware = [ ... 'acl' => \Signes\Acl\AclMiddleware::class ... ];
// Routes Route::get('/', ['middleware' => ['acl:zone.permission|action1.action2'], function () { // Controller $this->middleware('acl:zone.permission|action1.action2');
默认情况下,当用户没有访问资源时,将抛出 \Signes\Acl\Exception\AclAccessException
异常。当然,您可以创建自己的中间件并将其注册为具有自定义逻辑。
##高级示例## 最简单的方法是给出一个实际示例 ;) 让我们以一个示例用户 user1 为例,该用户属于 myGroup 组。用户 和 组 与 角色 和 权限 相关联。
我们希望创建如下连接
在这个例子中 user1 可以访问以下权限
zone1.access1|act1.act2.act3
zone2.access2|act1.act3
zone3.access3|act1
以下是实现该功能的代码
/** * Create and Save example Group */ $group = new \App\Models\Acl\Group(); $group->setName('MyGroup1')->save(); /** * Create and save example Roles */ $role1 = new \App\Models\Acl\Role(); $role1->setName('My Role 1')->save(); $role2 = new \App\Models\Acl\Role(); $role2->setName('My Role 2')->save(); $role3 = new \App\Models\Acl\Role(); $role3->setName('My Role 3')->setFilter('R')->save(); /** * Create and save example permissions */ $permission1 = \Acl::createPermission('zone1', 'access1', ['act1', 'act2', 'act3'], 'Zone 1'); $permission2 = \Acl::createPermission('zone2', 'access2', ['act1', 'act2', 'act3'], 'Zone 2'); $permission3 = \Acl::createPermission('zone3', 'access3', ['act1', 'act2', 'act3'], 'Zone 3'); /** * When we have ready entity lets connect them */ $guestUser = \App\Models\Acl\User::find(1); $guestUser->setGroup($group)->save() // Connect user with permissions \Acl::grantUserPermission($permission1, $guestUser, ['act1']); \Acl::grantUserPermission($permission2, $guestUser, ['act1', 'act2', 'act3']); // Connect group with permissions \Acl::grantGroupPermission($permission1, $group, ['act3']); // Connect roles with permissions \Acl::grantRolePermission($permission3, $role1, ['act1']); \Acl::grantRolePermission($permission1, $role2, ['act2']); \Acl::grantRolePermission($permission2, $role3, ['act2']); // Connect user with roles \Acl::grantUserRole($role2, $guestUser); \Acl::grantUserRole($role3, $guestUser); // Connect group with roles \Acl::grantGroupRole($role1, $group); \Acl::grantGroupRole($role2, $group);
##用户对象## 在 ACL 中,最重要的对象是用户表示,它由 \App\Models\Acl\User
对象提供。有关更多信息,您可以查看 app/Models/Acl/User.php
文件。
当然,您也可以创建自己的用户对象,只需确保您的类扩展了 \App\Models\Acl\User
。
用户对象上的可用方法
$user->getGroup
$user->setGroup(\Signes\Acl\GroupInterface $group)
$user->getRoles
$user->getPermissions
##创建自己的提供者## 默认情况下,\Signes\Acl
提供了准备好的模型和所需的方法来进行工作。但有时您可能希望将 ACL 与您自己的、现有的 User
对象集成。您可以设计自己的提供者,只需记住实现所需接口(UserInterface,GroupInterface,PermissionInterface,RoleInterface)。
\Signes\Acl
使用自己的提供者来获取数据。您可以在 Signes/Acl/Repository/SignesAclRepository.php
文件中查看代码。
##致谢##
- Pawel Grzesiecki - 开发者 (http://signes.pl/) MIT 许可证