signes/acl

此包已被废弃,不再维护。未建议替代包。

Laravel 高级 ACL

2.1.0 2015-07-04 18:59 UTC

This package is not auto-updated.

Last update: 2022-08-02 17:03:30 UTC


README

#Laravel 5 ACL#

Latest Stable Version Build Status Circle CI Total Downloads License

###对于 Laravel 4,请使用laravel4分支。请注意,此版本(Laravel 4)已不再维护。###

使用此包,您将能够详细控制对 Laravel 网站上任何资源的访问。此机制灵感来源于框架 FuelPHP 中使用的惊人的OrmAuth解决方案。

您获得了强大的管理访问级别的机制,包括

  • 每个用户可能有一个组,
  • 每个用户可能有多个角色,
  • 每个用户可能有多个权限,
  • 每个组可能有多个角色,
  • 每个组可能有多个权限,
  • 每个角色可能有多个权限,
  • 每个角色可能有特殊的权限过滤器,这授予对一切的全球访问权限,拒绝访问一切或拒绝之前授予的访问,
  • 每个权限可能由zonepermission和多个actions组成

要求

  • Laravel ~5.1
  • PHP >= 5.5

推荐

###数据库模式### alt Laravel ACL Schema

##安装##

  • 在 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"

结果我们得到truefalse

如果我们请求了多个操作,我们只有在用户有权访问这些操作中的每一个时才会得到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)
删除现有权限。您可以删除整个 zonezone.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 组。用户角色权限 相关联。

我们希望创建如下连接

alt Laravel ACL example

在这个例子中 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 文件中查看代码。

##致谢##