需要有关在单个资源控制器中使用 Entrust 角色的建议 - Laravel5
Need suggestions on using Entrust roles in a single resource controller - Laravel5
我正在开发一个控制面板应用程序,其中我有多个用户角色,如 globaladmin、编辑器等。现在我想将这些角色与单个 UserController 资源一起使用。
例如,globaladmins 应该能够执行所有 Restful 方法,而编辑者只能查看和更新用户。
我知道 entrust 带有开箱即用的中间件,非常适合我的需要。但它只适用于路线(在这种情况下我需要为每个角色单独的控制器) .
我的 UserController 看起来像这样。
Class UserController extends BaseController
{
$protected $viewfolder;
public function __construct
{
// Checking for role and then assigning the folder name of the views
$role = User::getRole();
switch($role)
case 'globaladmin':
$this->viewfolder = 'globaladmin';
break;
case 'editor':
$this->viewfolder = 'editor';
break;
default:
abort(401, 'Access Denied');
break;
}
public function index(){
if( Entrust::can('view-all-users') ){
$users = User:all();
}
return view( $this->viewfolder.'.users.viewuser', compact('users'));
}
public function create()
public function update()
public function delete()
}
我需要在构造函数中使用一个中间件来检查用户角色,然后仅当该角色有权使用该方法时才允许使用该方法。但这应该以一种体面的方式完成,没有任何黑客攻击,因为我也会在其他控制器上使用它。
我假设您在路由文件中使用以下内容:
Route::resource('users', 'UserController');
在这种情况下,我建议您使用 Entrust 提供的中间件之一作为基础并检索被调用的方法,例如如果您使用 EntrustRole:
public function handle($request, Closure $next)
{
$controllerMethod = Route::segment(3);
$roles = $this->retrieveRequiredRolesForMethod($method);
if ($this->auth->guest() || !$request->user()->hasRole(explode('|', $roles))) {
abort(403);
}
return $next($request);
}
当然这只是一个提示,你应该找到更好的方法来提取被调用的方法并且仍然需要实现retrieveRequiredRolesForMethod
啊..我认为这对你的情况有用。
class UserController extends Controller
{
public function __construct()
{
$this->middleware('permission:user_index', ['only' => ['index']]);
$this->middleware('permission:user_create', ['only' => ['create', 'store']]);
$this->middleware('permission:user_edit', ['only' => ['edit', 'update']]);
$this->middleware('permission:user_delete', ['only' => ['delete']]);
$this->middleware('permission:user_view', ['only' => ['show']]);
}
}
此处user_index、user_create、user_edit等是用户模块的权限(权限table名称字段中的条目)。
这将自动检查登录用户的能力并相应地显示页面。
我正在开发一个控制面板应用程序,其中我有多个用户角色,如 globaladmin、编辑器等。现在我想将这些角色与单个 UserController 资源一起使用。
例如,globaladmins 应该能够执行所有 Restful 方法,而编辑者只能查看和更新用户。
我知道 entrust 带有开箱即用的中间件,非常适合我的需要。但它只适用于路线(在这种情况下我需要为每个角色单独的控制器) .
我的 UserController 看起来像这样。
Class UserController extends BaseController
{
$protected $viewfolder;
public function __construct
{
// Checking for role and then assigning the folder name of the views
$role = User::getRole();
switch($role)
case 'globaladmin':
$this->viewfolder = 'globaladmin';
break;
case 'editor':
$this->viewfolder = 'editor';
break;
default:
abort(401, 'Access Denied');
break;
}
public function index(){
if( Entrust::can('view-all-users') ){
$users = User:all();
}
return view( $this->viewfolder.'.users.viewuser', compact('users'));
}
public function create()
public function update()
public function delete()
}
我需要在构造函数中使用一个中间件来检查用户角色,然后仅当该角色有权使用该方法时才允许使用该方法。但这应该以一种体面的方式完成,没有任何黑客攻击,因为我也会在其他控制器上使用它。
我假设您在路由文件中使用以下内容:
Route::resource('users', 'UserController');
在这种情况下,我建议您使用 Entrust 提供的中间件之一作为基础并检索被调用的方法,例如如果您使用 EntrustRole:
public function handle($request, Closure $next)
{
$controllerMethod = Route::segment(3);
$roles = $this->retrieveRequiredRolesForMethod($method);
if ($this->auth->guest() || !$request->user()->hasRole(explode('|', $roles))) {
abort(403);
}
return $next($request);
}
当然这只是一个提示,你应该找到更好的方法来提取被调用的方法并且仍然需要实现retrieveRequiredRolesForMethod
啊..我认为这对你的情况有用。
class UserController extends Controller
{
public function __construct()
{
$this->middleware('permission:user_index', ['only' => ['index']]);
$this->middleware('permission:user_create', ['only' => ['create', 'store']]);
$this->middleware('permission:user_edit', ['only' => ['edit', 'update']]);
$this->middleware('permission:user_delete', ['only' => ['delete']]);
$this->middleware('permission:user_view', ['only' => ['show']]);
}
}
此处user_index、user_create、user_edit等是用户模块的权限(权限table名称字段中的条目)。
这将自动检查登录用户的能力并相应地显示页面。