我在这里使用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中添加来宾支持,以便将所有未登录的用户视为来宾,并允许他访问某些路线。
答案 0 :(得分:0)
我个人会避免使用任何涉及授权的全局中间件,以免阻止您的应用程序具有可公开访问的页面。使用路由组将中间件分配给受保护的路由。
尽管它可能不适合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);
}