【问题标题】:how to guard a controller through multiple of user?如何通过多个用户保护控制器?
【发布时间】:2017-09-19 08:56:21
【问题描述】:

这是项目要求。我有多个登录名,但有些用户无法访问几个模块。像超级管理员和分析师一样可以访问所有模块,但开发人员只能使用自己的控制器。

所以在这种情况下,我如何保护具有多个登录名的控制器。另请注意,我在数据库中有单独的登录页面和表。

例如 phonebookController 可以由超级管理员和分析师访问,但不能由开发人员访问。 所以请告诉我如何实现这个?

我用这个来表示::

if( Auth::guard('superAdmin')->check() )
 {   $author =Auth::guard('superAdmin')->User()->id ;  }
  else  if( Auth::guard('analysts')->check() )
 {   $author =Auth::guard('analysts')->User()->id;   }
 else
 {  $author =Auth::guard('supervisor')->User()->id    }

我想在类的构造方法中使用这个

【问题讨论】:

  • 记录对控制器的每次访问到数据库,并在每次加载控制器之前检查用户是否可以查看 throw 403...
  • 你是如何分配角色的?您的用户表中是否有一个字段说明用户是否为管理员?

标签: php laravel-5.4 guard laravel-middleware


【解决方案1】:

这是我对管理员和用户(在我的例子中是代理)进行访问控制的实现 我的用户表中有一个boolean 字段(is_admin),普通用户为0,管理员为1。所以在我的用户模型中我这样做了

    protected $casts = [
        'is_admin' => 'boolean',
    ];

  public function isAdmin()
    {
            return $this->is_admin;
    }

为您想要使用的角色类型创建一个新的中间件

php artisan make:middleware Admin

php artisan make:middleware Agent

中间件文件将在 App\Http\Middleware\ 中创建 将此添加到Admin.php 中的类中

public function handle($request, Closure $next)
{

    if ( Auth::check() && Auth::user()->isAdmin() )
    {
        return $next($request);
    }

    return redirect('/agent');

}

这个给Agent.php

    public function handle($request, Closure $next)
{

    if ( Auth::check() && !Auth::user()->isAdmin() )
    {
        return $next($request);
    }

    return redirect('/home');

}

在此之后使用 laravel 注册你的中间件以执行此操作,将其添加到位于 app\Http\Kernel.php 的 Kernel.php 中的 protected $routeMiddleware

'admin' => 'App\Http\Middleware\Admin',
'agent' => 'App\Http\Middleware\Agent',

确保为重定向创建正确的路由,正如我们在中间件文件中提到的那样。 在这之后你几乎完成了。现在要验证用户是管理员还是普通用户,请将其添加到控制器的构造方法中。

只允许管理员用户操作

    public function __construct()
{   

    $this->middleware('auth');
    $this->middleware('admin');
}

只允许普通用户操作

公共函数 __construct() {

$this->middleware('auth');
$this->middleware('agent');

}

【讨论】:

  • 公开 $user_type , $participant_id , $model_class , $model_type ;公共函数 __construct() { $this->middleware(function ($request, $next) { if( Auth::guard('analysts')->check() =='analysts' ) { $this->participant_id = Auth::guard('analysts')->user()->id; $this -> user_type = 'analyst'; $this -> model_type = 'Analyst'; $this -> model_class = 'App\Analysts'; } else { 返回重定向()->back(); }
  • return $next($request); }); } $model = $this->model_class; $items = $model::where( 'id' , $this->participant_id )->get()->first();
  • 很高兴知道你解决了它!顺便说一句,您也可以在 cmets 部分使用降价,例如。格式化代码将它们包含在back quotes中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多