【发布时间】: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