Laravel Entrust - добавить поддержку гостевой роли

Я использую Доверьте промежуточное ПО отсюда. Все идет нормально, за исключением случаев, когда я хочу открыть определенную страницу администратору при вошел в систему и любому пользователю Не вошел.

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

Для чего в этом сценарии нужно промежуточное ПО? Похоже, что на маршруте не должно быть промежуточного программного обеспечения, связанного с аутентификацией.

Devon 01.09.2018 16:39

Мой сайт использует Entrust для уровня контроля доступа. На определенном этапе мне нужно открыть страницу (то есть какую-то регистрацию) любому пользователю, не вошедшему в систему. В противном случае, если бы ACL не существовало, рассматриваемая проблема не возникла бы.

Istiaque Ahmed 01.09.2018 16:41

Верно, но почему нельзя просто исключить этот маршрут из промежуточного программного обеспечения?

Devon 01.09.2018 16:41

Как это исключить? из промежуточного программного обеспечения, которое я показал, или из kernel.php?

Istiaque Ahmed 01.09.2018 16:42

Я мог бы предположить, что вы использовали группу маршрутов или что-то в этом роде, чтобы назначить это промежуточное ПО для маршрутов, не так ли?

Devon 01.09.2018 16:44

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

Istiaque Ahmed 01.09.2018 16:44

Позвольте нам продолжить обсуждение в чате.

Istiaque Ahmed 01.09.2018 16:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
183
1

Ответы 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);
    }

«Используйте группы маршрутов для назначения промежуточного программного обеспечения защищенным маршрутам». - Вы имеете в виду, что я должен добавить промежуточное ПО к переменной $middlewareGroups в Kernel.php?

Istiaque Ahmed 01.09.2018 17:04

Нет, добавьте их в $ routeMiddleware, например auth и guest. Группы промежуточного программного обеспечения почти глобальны.

Devon 01.09.2018 17:06

позвольте мне попробовать решение сейчас

Istiaque Ahmed 01.09.2018 17:07

Но когда пользователь не вошел в систему, страница также перенаправляется на страницу по умолчанию. Я говорю о своем решении в OP

Istiaque Ahmed 01.09.2018 17:08

это не должно быть .. $ request-> user () должно быть нулевым для гостей

Devon 01.09.2018 17:09

Как ваше промежуточное ПО будет прикреплено к моей конкретной странице (например, page123)?

Istiaque Ahmed 01.09.2018 17:09

Позвольте нам продолжить обсуждение в чате.

Istiaque Ahmed 01.09.2018 17:11

Другие вопросы по теме