在Laravel使用Sentinel

时间:2016-08-11 14:40:35

标签: laravel laravel-5.2 sentinel

我已经阅读了文档,似乎无法找到我需要做的事情。我已安装此软件包Centaur

据我所知,它本质上是Sentinel的扩展,所以应该以同样的方式工作。安装和设置后,我可以创建用户和角色。这一切都很好。所以在我的布局视图中,我提供了一个指向客户索引页面的链接,我希望每个人都看到这个,所以我不做任何检查。

<li class="{{ Request::is('clients*') ? 'active' : '' }}"><a href="{{ route('clients.index') }}">Clients</a></li>

查看用户和角色控制器,我假设我在ClientsController中需要一个构造函数来说明权限。这就是我所拥有的

public function __construct(AuthManager $authManager)
{
    // Middleware
    $this->middleware('sentinel.auth');
    $this->middleware('sentinel.access:users.view', ['only' => ['index', 'show']]);
    $this->middleware('sentinel.role:administrator');

    // Dependency Injection
    $this->roleRepository = app()->make('sentinel.roles');
    $this->authManager = $authManager;
}

我试图实现的是用户只能查看客户端,管理员可以更新它们。在我的编辑角色视图中,我添加了复选框

<div class="checkbox">
    <label>
        <input type="checkbox" name="permissions[clients.update]" value="1" {{ $role->hasAccess('clients.update') ? 'checked' : '' }}>
        clients.update
    </label>
</div>
<div class="checkbox">
    <label>
        <input type="checkbox" name="permissions[clients.view]" value="1" {{ $role->hasAccess('clients.view') ? 'checked' : '' }}>
        clients.view
    </label>
</div>

根据情况,管理员可以查看和更新​​客户端。但是,当我以普通用户身份登录系统时,当我点击客户端链接时,我看到了

 Error: You do not have permission to do that. 

因此,在使用Sentinel创建新模型时,为某些操作授予用户/角色权限的过程是什么?

由于

1 个答案:

答案 0 :(得分:1)

首先create the role,然后是attach the role to the user

提供链接的快速示例:

$role = Sentinel::getRoleRepository()->createModel()->create([
    'name' => 'Subscribers',
    'slug' => 'subscribers',
]);

$user = Sentinel::findById(1);

// use this for lookup where you don't already have a role handy
$role = Sentinel::findRoleByName('Subscribers');

$role->users()->attach($user);

在您的情况下,可能类似于以下角色权限:

$role->permissions = [
    "admin.view"   => true,
    "admin.update" => true
    "user.view"    => true,
    "user.update"  => false
];
$role->save();

然后一次性检查用户的权限和类型......这将是管理员用户尝试更新的示例

if (Sentinel::inRole('admin') and $user->hasAccess(['admin.update']) {
    //
}

我很久没有使用过Sentinel,你可以完全省略inRole检查,不确定。