【问题标题】:Laravel Entrust - add support for guest roleLaravel Entrust - 添加对访客角色的支持
【发布时间】:2019-02-07 07:01:50
【问题描述】:

我从这里使用Entrust middleware。一切都很好,除非我想在 登录 时向管理员公开某个页面,以及向任何 未登录 的用户公开。

here 的帮助下,我添加了以下中间件,但是当我点击 url 时,它说重定向太多。

namespace App\Http\Middleware;

use App\Models\User;
use App\Models\Role;
use Closure;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Database\Eloquent\Collection;

class CheckPermission {

    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $auth;

    /**
     * Create a new filter instance.
     *
     * @param  Guard  $auth
     * @return void
     */
    public function __construct( Guard $auth )
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle( $request, Closure $next )
    {
        if ( $this->auth->guest() )
        {
            $user = new User;
            $user->id = 0;
            $user->username = 'Guest';

            $role = Role::find(9);// EXPLANATION OF 9 IS GIVEN BELOW UNDER CODE

            $user->roles = new Collection;
            $user->roles->add( $role );
        }
        else
        {
            $user = $this->auth->user();
        }

        // Automatically check permission based on route name
        /* 
          if ( !$user->can( $request->route()->getName() ) )
         {
            // Handle denied permission, e.g. abort(401)
         }
        */

        return $next( $request );
    }

} 

数据库更改:roles 表中,我添加了一个 ID 为 9 且名称为 guest 的行。 如何在 Entrust 中添加访客支持,以便任何未登录的用户都将被视为访客并允许他访问某些路线。

【问题讨论】:

  • 在这种情况下你需要委托中间件做什么?听起来路由上不应该有任何与身份验证相关的中间件。
  • 我的站点使用 Entrust 作为访问控制层。在某个阶段,我需要向任何未登录的用户公开一个页面(即某种类型的注册)。否则,如果不存在 ACL,则不会出现问题。
  • 对,但是为什么不能从中间件中排除这条路由呢?
  • 如何排除?来自我展示的中间件或 kernel.php ?
  • 我想您使用路由组或其他东西将此中间件分配给路由,不是吗?

标签: php laravel acl middleware entrust


【解决方案1】:

我个人会避免使用任何处理授权的全局中间件,以免阻止您的应用程序拥有可公开访问的页面。使用路由组将中间件分配给受保护的路由。

虽然它可能不适合 Entrust 的设计,但您也可以编写自定义中间件以仅允许访客和管理员使用。像这样的:

class AdminOrGuestMiddleware {

   /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if ($request->user() && !$request->user()->hasRole('admin')) {
            return redirect('/home');
        }

        return $next($request);
    }

【讨论】:

  • '使用路由组将中间件分配给受保护的路由。' - 你的意思是我应该将中间件添加到Kernel.php 中的$middlewareGroups 变量?
  • 不,将它们添加到 $routeMiddleware 中,例如 auth 和 guest。中间件组几乎是全球性的。
  • 现在让我试试解决方案
  • 但是当用户没有登录时,页面也会重定向到默认页面。我说的是我在 OP 中的解决方案
  • 它不应该.. $request->user() 对于客人来说应该为空
猜你喜欢
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 2015-12-27
  • 2016-07-28
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多