Laravel和Sentinel。 Sentinel中使用的概念?

时间:2015-09-08 19:18:33

标签: laravel permissions roles cartalyst-sentinel

我需要为我的项目提供基于角色的访问权限,并且我已经收到了重新发明轮胎并使用Sentinel的重新命令。我已经检查过了,但我对它是如何工作有点困惑。文档实际上只涉及如何使用它,但不包括它的工作原理。

因此,我了解注册,用户,限制,角色和权限。但是我不明白持久性,激活,检查点是什么。

如何创建权限并将其附加到角色?在应用程序代码中?我可以从中检索它们吗?

如何将权限链接到资源?在每条路线中单独添加一个中间件?

如果我需要多个不同路由的中间件怎么办?

我知道我有很多问题,但现在一切都会有所帮助。 我的问题在于我不想使用Sentinel,并意识到它无法正常工作,然后从头开始。

由于

2 个答案:

答案 0 :(得分:2)

在我看来,哨兵是一个更好的选择。

例如,您可以使用Sentinel为数据库设定种子:

创建角色

示例EXA角色

    $role = \Sentinel::getRoleRepository()->createModel()->create([
        'name' => 'Example',
        'slug' => 'EXA',
    ]);
    $role->permissions = [
        'servicio_dash' => true,
        'servicio_widget' => true,
    ];
    $role->save();

用户角色USR

    $role = \Sentinel::getRoleRepository()->createModel()->create([
        'name' => 'User',
        'slug' => 'USR',
    ]);
    $role->permissions = [
        'servicio_dash' => true,
        'servicio_widget' =>false,
    ];
    $role->save();

创建50个用户并指定EXA角色(使用faker)

    $usr_role = \Sentinel::findRoleBySlug('EXA');

    factory(App\User::class, 50)->make()->each(function ($u) use ($usr_role) {
        \Sentinel::registerAndActivate($u['attributes']);
    });

奖励跟踪:工厂示例

$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
    'email' => $faker->safeEmail,
    'password' => 'p4ssw0rd',
    'first_name' =>  $faker->firstName,
    'last_name' => $faker->lastName,
    'recycle' => false,
    'phone' => $faker->phoneNumber,
    'alt_email' => $faker->email
];

});

只有一位用户

$yo = factory(App\User::class)->make(['email' => 'jpaniorte@openmailbox.org']);
    \Sentinel::registerAndActivate($yo['attributes']);


    $jperez = User::where('email', 'jpaniorte@openmailbox.org')->firstOrFail();
    $epa_role->users()->attach($jperez);

为API REST验证控制器

  public function authenticateCredentials(Request $request)
{
    $credentials = $request->only('email', 'password');

    $user = \Sentinel::authenticate($credentials);
    return response()->json($user);
}

使用令牌(使用JWT)和sentinel

进行身份验证
 public function authenticate(Request $request)
{

    // grab credentials from the request
    $credentials = $request->only('email', 'password');
    try {
        // attempt to verify the credentials and create a token for the user
        if (!$token = JWTAuth::attempt($credentials)) {
        return response()->json(['error' => 'invalid_credentials'], 401);
    }
    } catch (JWTException $e) {
        // something went wrong whilst attempting to encode the token
        return response()->json(['error' => 'could_not_create_token'], 500);
    }
    // all good so return the token
    return response()->json(compact('token'));
}

注意:为此,您需要使用自定义身份验证提供程序配置JWT选项,您可以找到此here

在任何控制器中

public function hasPermission($type)
{
    //$sentinel = \Sentinel::findById(\JWTAuth::parseToken()->authenticate()->id); //->this is for a token

    $sentinel = \Sentinel::findById(1); //if you now the id


    if($sentinel->hasAccess([$type]))
        return response()->json(true, 200);
    //yout custom handle for noAccess here
}

答案 1 :(得分:-3)

如果您使用的是laravel 5.1,请不要使用Sentinel。 使用中间件,检查laravel文档,它的功能强大且非常简单。