如何在Laravel 4中实现Sentry 2权限?

24

我正在尝试在使用Laravel 4构建的网站中使用Cartalyst Sentry 2。基本上,我不理解如何实现权限。

我看到一些关于为组设置权限的示例,例如以下示例:

{
    "name" : "Administrator",
    "permissions" : 
    {
        "user.create" : 1,
        "user.delete" : 1,
        "user.view"   : 1,
        "user.update" : 1
    }
}

这是为管理员组设置权限。但是这些权限在哪里设置?

在表 'groups' 中有一个叫做permissions的文本字段 - 它们是在那里设置的吗?如果是,怎么设置?还是在模型或控制器中设置?

有人能指导我如何在Laravel 4应用程序中逐步使用吗?我已经阅读了支持文档,其中介绍了函数,但我不确定如何设置数据以使函数正常工作。

2个回答

52

基本上,你需要...

创建你的群组

Sentry::getGroupProvider()->create([
    'name' => 'Super Administrators',
    'permissions' => [
        'system' => 1,
    ],
]);

Sentry::getGroupProvider()->create([
    'name' => 'Managers',
    'permissions' => [
        'system.products' => 1,
        'system.store' => 1,
        'system.profile' => 1,
    ],
]);
将一个用户组设置给特定的用户,本例中是将“Managers”组设置为当前登录的用户。
Sentry::getUser()->addGroup( Sentry::getGroupProvider()->findByName('Managers') );

检查用户是否具有特定的访问权限

if ( Sentry::getUser()->hasAnyAccess(['system','system.products']) )
{
    // Will be able to do a thing
}

检查用户是否为超级管理员(只有该组才具有“系统”访问权限)

if ( Sentry::getUser()->hasAnyAccess(['system']) )
{
    // Will be able to do a thing
}
获取特定用户的所有组。
try
{
    // Find the user using the user id
    $user = Sentry::getUserProvider()->findById(1);

    // Get the user groups
    $groups = $user->getGroups();
}
catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
{
    echo 'User was not found.';
}

2
你是在说 systemsystem.products 吗?它们与你的类之间没有关系,那只是你选择的名称。我试图使用像 system.products.insert 这样的方式进行细分,如果你有 system.products,你可以在产品上执行所有操作。 - Antonio Carlos Ribeiro
1
我整天都在找这个。 - giannis christofakis
@AntonioCarlosRibeiro 太棒了 :D 如果我想为特定的用户电子邮件设置一个组,而不是已登录的用户,该怎么办?谢谢!! - 1myb
@AntonioCarlosRibeiro 我的意思是将用户分配到组中,例如将用户(me@mydomain.com)添加到管理员组,而不是已登录的用户。 - 1myb
1
它将返回 Illuminate\Database\Eloquent\Collection 的一个实例。 - Antonio Carlos Ribeiro
显示剩余6条评论

4

在你的groups表中,你使用JSON设置权限。

我有以下列:

id | name | permissions

和以下一行:

1 | admin | {"admin":1, "create_news": 1}

使用表users_groups将用户分配到组中

现在你可以使用以下示例来检查用户是否具有给定权限:

$user = Sentry::getUser();
if ($user->hasAccess('create_news')) {
    echo "You can create a news item";
}
else {
    echo "You can't create a news item";
}

谢谢您的回答 - 我将使用两个答案的组合,两个都很有道理。现在我要在我的网站上试用它。 - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接