laravel の新機能。私はこれを Yii で行いましたが、とても簡単です。:)
Laravel バージョン: 5.2 Entrust バージョン: dev-laravel-5
私の要件を説明しましょう。私には 2 人のロール マネージャーと CEO がいます。また、次の権限があります。
In PostController:
1.Role: Manager
Action: View
2.Role : CEO
Action: create,edit,delete
上記の権限でロールを作成しました。
それでは、私が何をしたか見てみましょう。ロールをチェックする2つのミドルウェア RoleCheck と権限をチェックする PermissionCheck を作成します
RoleCheck.php
namespace App\Http\Middleware;
use Closure;
class RoleCheck
{
public function handle($request, Closure $next)
{
// Get the required roles from the route
$roles = $this->getRequiredRoleForRoute($request->route());
// Check if a role is required for the route, and
// if so, ensure that the user has that role.
if($request->user()->hasRole($roles) || !$roles)
{
return $next($request);
}
return response()->view('errors.401');
}
public function getRequiredRoleForRoute($route)
{
$actions = $route->getAction();
return isset($actions['roles']) ? $actions['roles'] : null;
}
}
PermissionCheck.php
namespace App\Http\Middleware;
use Closure;
class PermissionCheck
{
public function handle($request, Closure $next, $permission= null)
{
//exit;
if (\Auth::user()->can($permission)) {
return $next($request);
} else {
return response()->view('errors.401');
}
}
}
今、このミドルウェアを routeMiddleware 配列の Kernel.php に追加しました
'role' => Middleware\RoleCheck::class,
'permission' => Middleware\PermissionCheck::class
追加したロールを認証する
Route::group(['middleware' => ['auth','role']], function () {
Route::resource('posts', 'PostsController');
});
これは完璧に機能します。しかし、役割で与えられた許可をユーザーに認証できません。
PostController.php 内
function __construct() {
$this->middleware('auth');
$this->middleware('permission:can_view',['only'=>'show']);
$this->middleware('permission:can_create_post',['only'=>'create','store']);
$this->middleware('permission:can_update_post',['only'=>'edit','update']);
$this->middleware('permission:can_delete_post',['only'=>'destroy']);
}
および route.php
Route::group(['middleware' => 'web','permission'], function () {
Route::resource('posts', 'PostsController');
});
これは完璧に機能します。ただし、この認証は許可に基づいています。しかし今、私は与えられた役割に基づいて認証したいと思っています。ルートを変更してみてください
Route::group(['middleware' => ['web','role'],'roles'=>['Manager','CEO']], function () {
Route::resource('posts', 'PostsController');
});
__construct() 関数を削除しました。しかし、ここで問題に直面します。を持つユーザーはRole
、自分に割り当てられていないすべてのアクションにアクセスできます。を持つユーザーはManager
、自分に割り当てられていないすべてのアクションにもアクセスできます。
その方法は?ロールで割り当てられたアクセス許可を認証するにはどうすればよいですか。私は今、ミドルウェアと認証の間で完全に混乱しています。助けてください。