Laravel Entrust - добавить поддержку роли гостя - PullRequest
0 голосов
/ 01 сентября 2018

Я использую Entrust Middleware отсюда. Все идет хорошо, кроме случаев, когда я хочу открыть определенную страницу для администратора, когда вошел в систему и для любого пользователя, который НЕ вошел в систему .

С помощью здесь я добавил следующее промежуточное ПО, но когда я нажимаю на 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 таблице. Я добавил строку с идентификатором 9 и именем guest. Как я могу добавить гостевую поддержку в Entrust, чтобы любой пользователь, который не вошел в систему, будет считаться гостем, и ему также будет разрешено посещать определенные маршруты.

1 Ответ

0 голосов
/ 01 сентября 2018

Лично я бы избегал любого глобального промежуточного программного обеспечения, имеющего дело с авторизацией, чтобы не блокировать доступ к общедоступным страницам вашего приложения. Используйте группы маршрутов для назначения промежуточного программного обеспечения защищенным маршрутам.

Хотя это может не вписываться в дизайн 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);
    }
...