laravel 中的新功能。我已经在 Yii 中做到了,这非常容易。:)
Laravel 版本:5.2 委托版本:dev-laravel-5
让我解释一下我的要求。我有两个角色经理和首席执行官。他们有以下权限。
In PostController:
1.Role: Manager
Action: View
2.Role : CEO
Action: create,edit,delete
我创建了具有上述权限的角色。
现在让我们看看我做了什么。我创建了两个中间件 RoleCheck 来检查角色和 PermissionCheck 来检查权限
角色检查.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;
}
}
权限检查.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
也可以访问所有未分配给他的操作。
怎么做?如何验证角色中分配的权限。我现在完全混淆了中间件和身份验证。请提供任何帮助。