Laravel ACL Kodeine权限slug功能

时间:2016-11-16 06:16:44

标签: laravel laravel-5

当我的项目仍然是Laravel 4时,我之前使用Entrust控制Laravel中的ACL,现在使用Laravel 5.2 Entrust不再有效,特别是在路由过滤中。

然后我发现这个包并尝试使用它,但仍然有很多问题,所以为了使它更简单,我将在使用委托时解释我的用例:

首先,我想为文章创建,查看,更新和删除权限,在Entrust中,我将创建create_article,view_article,update_article和delete_article等权限。 但是现在我在Kodeine创建权限时会出现“slug”,所以我试着这样做,就像在文档中说的那样

 $permUser = $permission->create([ 
        'name'        => 'article',
        'slug'        => [          // pass an array of permissions.
            'create'     => true,
            'view'       => true,
            'update'     => true,
            'delete'     => true
        ],
        'description' => 'Manange article'
    ]);

因此,根据我的阅读,它只是将我的所有文章权限分组到一个地方,并且每个参数视图都有一个slug,创建,更新,删除。

我看到的问题是,如果我想让我的用户只能查看文章,如何根据我在那里创建的权限来做到这一点?

因为从文档到assignPermission只给出了权限名称,这意味着它将包含所有slug,并且它将全部成立?

因此,如果我想让用户只能查看我需要创建类似

的文章
 $permUser = $permission->create([ 
        'name'        => 'article_view',
        'slug'        => [          // pass an array of permissions.
            'view'       => true,
        ],
        'description' => 'view article'
    ]);

如果我想让用户只能创建文章,那么我的意思是我需要创建

 $permUser = $permission->create([ 
        'name'        => 'article_create',
        'slug'        => [          // pass an array of permissions.
            'create'     => true,
        ],
        'description' => 'create article'
    ]);
那么slug的重点是什么 - 它与角色几乎相同但是在slug中有参数吗?

2 个答案:

答案 0 :(得分:1)

正如我在你的github问题中所写的那样,我建议你保留所有文章权限,因为你已经拥有了它,在一个大组中,但所有这些都设置为false(请记住,你可能需要更改你的&# 39;你的acl配置文件中的most_permissive_wins'变量)。你可以创建一个孩子"使用Inheritance为您的用户设置角色权限,将用户所需的所有权限设置为true。然后,您可以将该子组设置为您的用户角色(不是大用户),用户角色将触及您的特定用户。为了澄清我的答案,我们假设你有这个小组:

$permArticles = $permission->create([ 
        'name'        => 'articles',
        'slug'        => [          // pass an array of permissions.
            'create'     => false,
            'view'       => false,
            'update'     => false,
            'delete'     => false,
        ],
        'description' => 'All articles module permissions'
    ]);

然后你可以创建类似的东西:

$articlesPermUser = Permission::create([
            'name'        => 'articles.user',
            'slug'        => [ // an array of permissions only for student
                'view' => true,
            ],
            // we use permission inheriting.
            'inherit_id' => $permArticles->getKey(),
            'description' => 'user articles permissions'
        ]);

然后您将新的权限分配给您的用户角色(我假设您已经拥有角色名称'用户'):

$userRole = Role::where('slug', 'user')->first();
$userRole->assignPermission('articles.user');

最后,您将该角色分配给...让您说出已登录的用户:

Auth::user()->assignRole($userRole);

您也可以通过覆盖权限来解决此问题,这可以为用户分配特定的权限值(但是,如果需要,您需要为应用中的每个用户执行此操作,所以我不喜欢这个解决方案完全没有。)

让我们说我们保留我们的大团队:

$permArticles = $permission->create([ 
            'name'        => 'articles',
            'slug'        => [          // pass an array of permissions.
                'create'     => false,
                'view'       => false,
                'update'     => false,
                'delete'     => false,
            ],
            'description' => 'All articles module permissions'
        ]);

正如该小组所说,任何带有您的文章权限的rol都将无法在您的文章模块中执行任何操作。假设您的用户角色alredy具有此权限,但您希望某个用户(假设已记录的用户)能够更新文章。您可以将特定的更新权限值设置为true,如下所示:

Auth::user()->addPermission('update.articles', true);
//or
Auth::user()->addPermission('articles', [
     'update' => true, 
]);

答案 1 :(得分:0)

感谢您的回答,但随着时间的推移,我已经找到了一个符合我需要的完美解决方案。这与我委托的事情没什么不同。

首先,我将为视图文章

创建一个这样的权限
$class = 'article';
$permission = new Kodeine\Acl\Models\Eloquent\Permission();
$permUser = $permission->create([ 
    'name'        => $class.'_view',
    'slug'        => [ 
        'view' => true,
    ],
    'description' => 'View '.$class
]); 

然后另一个例如创建文章

$class = 'article';
$permission = new Kodeine\Acl\Models\Eloquent\Permission();
$permUser = $permission->create([ 
    'name'        => $class.'_create',
    'slug'        => [ 
        'create' => true,
    ],
    'description' => 'Create '.$class
]);

以后只是将这些权限分配给用户角色,例如我想让这个用户角色可以查看文章

$roleAdmin = Kodeine\Acl\Models\Eloquent\Role::where('name','=','user_1');
$roleAdmin->assignPermission('article_view');

我仍然不了解继承功能,我需要快速完成此操作。它可能不是一种理想的方式,但它对我有用。