【问题标题】:Laravel ACL Kodeine permission slug functionLaravel ACL Kodeine 权限 slug 函数
【发布时间】:2017-03-30 05:55:26
【问题描述】:

当我的项目还是 Laravel 4 时,我之前在 Laravel 中使用 Entrust 来控制 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 中有参数?

【问题讨论】:

  • 我已经修复了这个问题中的很多案例错误(我注意到您的回答存在同样的问题)。由于这里的帖子是为了长期读者的利益,如果在写作上花费更多的精力,我们将不胜感激。如果您是用手机写的,请在撰写问题和答案时仍然使用句子大小写 - 谢谢!

标签: laravel laravel-5


【解决方案1】:

正如我在您的 github 问题中所写,我建议您将所有文章权限保留在一个大组中,但所有权限都设置为 false(请记住,您可能需要更改您的 'most_permissive_wins ' acl 配置文件中的变量)。您可以使用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'
        ]);

正如该小组所说,任何分配了您的文章权限的角色都无法在您的文章模块中执行任何操作。假设您的用户角色已经拥有此权限,但您希望某个用户(假设登录的用户)能够更新文章。您可以像这样将特定的更新权限值设置为 true:

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

【讨论】:

    【解决方案2】:

    感谢您的回答,但随着时间的推移,我已经找到了符合我需要的完美解决方案。和我委托做的没什么区别。

    所以首先我将创建一个这样的权限来查看文章

    $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');
    

    我仍然不了解继承功能,我需要尽快完成。这可能不是一个理想的方式,但它对我有用。

    【讨论】:

    • 当您的项目截止日期临近时,欢迎任何适合您需求的解决方案。问候!
    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 2016-09-13
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多