Laravel 5.1 Блокировать пользователей, использующих роли Bican

Мне было интересно, как я могу банить людей через этот пакет...

Итак, в настоящее время я использую Laravel 5.1 и пытаюсь «забанить» пользователей на моем сайте. У меня есть таблица под названием «запрещено», которая имеет следующую структуру:

    +---------------+--------------+------------+-------------+------------------+----------------+--+
    | TABLE_NAME | COLUMN_NAME | COLUMN_DEFAULT | IS_NULLABLE | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | 
    +---------------+--------------+------------+-------------+------------------+----------------+--+
    | banned     | id          | NULL           | NO          | int       | NULL                     |
    | banned     | user_id     | NULL           | NO          | int       | NULL                     |
    | banned     | banned_by   | NULL           | NO          | int       | NULL                     |
    | banned     | reason      | NULL           | NO          | varchar   |                      255 |
    | banned     | expires     | NULL           | NO          | datetime  | NULL                     |
    | banned     | lifted      | NULL           | YES         | datetime  | NULL                     |
    | banned     | lifted_by   | NULL           | YES         | int       | NULL                     |
    +---------------+--------------+------------+-------------+------------------+----------------+--+

У меня тоже стандартная структура ролей (bican roles).

Теперь я хочу иметь возможность отображать настраиваемое запрещенное представление для моих заблокированных пользователей с данными из таблицы «запрещено».

Как лучше всего это сделать?


person Robin    schedule 04.04.2016    source источник


Ответы (1)


Если вы добавите новое промежуточное ПО и вызовете свои контроллеры, где пользователи могут получить доступ к странице, оно проверит, не заблокированы ли они.

BannedMiddleware.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class BannedMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!Auth::guest() && Auth::user()->is('banned')) {
            return view('BannedPageView');
        }

        return $next($request);
    }
}

и отредактируйте свой kernal.php под protected $routeMiddleware добавьте это

'isBanned' => \App\Http\Middleware\BannedMiddleware::class,

Затем в ваших контроллерах добавьте это

public function __construct()
     {
         $this->middleware('isBanned');
     }

Это проверит, забанены ли они, когда они попадут на какой-либо маршрут в этом контроллере.

Изменить


Чтобы проверить все глобально для каждого запроса:

Сделайте такое же промежуточное ПО и поместите этот код:

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;
use App\User;
use DB;
use Carbon\Carbon;

class CheckBanMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (Auth::check()) {
            if (User::CheckBan()) {
                $bandata = DB::table('banned')->where('user_id', '=', Auth::id())->where('lifted', '=', Null)->where('expires', '>=', Carbon::now())->first();
                return response()->view('banned', ['bandata' => $bandata]);
            }
        }
        return $next($request);
    }
}

В вашем User.php создайте новую функцию:

public static function CheckBan()
    {
        return DB::table('banned')->where('user_id', '=', Auth::id())->where('lifted', '=', Null)->where('expires', '>=', Carbon::now())->exists();
    }

Эта функция сделана потому, что у меня есть другой способ хранения банов и т.д...

Добавьте следующую строку в app/http/kernel.php массива protected $middleware.

\App\Http\Middleware\CheckBanMiddleware::class,

Это обеспечивает проверку данных ПЕРЕД каждым запросом.

И вы сделали!

person Skel    schedule 06.04.2016
comment
хорошо, я сделал новое промежуточное программное обеспечение сегодня с лучшим методом. В любом случае спасибо за помощь :D - person Robin; 06.04.2016
comment
@RobinR ЕСЛИ это правильно, не могли бы вы установить это как ответ. Спасибо - person Skel; 06.04.2016
comment
Я принял ваш ответ, так как это тоже возможный путь, НО вы также можете добавить функцию в свою модель пользователя, вызвать эту функцию в своем промежуточном программном обеспечении, а затем зарегистрировать ее в ядре. Я предоставил свой ответ в вашем ответе. - person Robin; 07.04.2016
comment
О да, ты можешь, это будет проще - person Skel; 07.04.2016