Laravel 5.1阻止使用Bican角色的用户

时间:2016-04-04 11:44:00

标签: php laravel laravel-5.1 roles rbac

我在想,如何通过this包裹禁止人们......

所以我目前正在使用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角色)。

现在,我希望能够使用“禁止”表格中的数据向我的被禁用用户显示自定义禁止视图。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

如果你添加一个新的中间件并在你的控制器中调用,用户可以访问该页面,它将检查它们是否被禁止

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,

这提供了在每个请求之前检查数据。

你已经完成了!