【问题标题】:Laravel 5.1 Block users using Bican rolesLaravel 5.1 使用 Bican 角色阻止用户
【发布时间】:2016-07-23 22:31:59
【问题描述】:

我在想,我怎么能通过 this 包禁止人们...

所以我目前正在使用 Laravel 5.1,我正试图从我的网站“禁止”用户。 我有一个名为“banned”的表,其结构如下:

    +---------------+--------------+------------+-------------+------------------+----------------+--+
    | 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 角色)。

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

最好的方法是什么?

【问题讨论】:

    标签: php laravel laravel-5.1 roles rbac


    【解决方案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);
        }
    }
    

    并在protected $routeMiddleware 下编辑您的kernal.php 添加此

    '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();
        }
    

    这个功能是因为我有另一种方法来存储禁令等......

    将以下行添加到protected $middleware 数组中的app/http/kernel.php

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

    这可以在每次请求之前检查数据。

    你就完成了!

    【讨论】:

    • 好吧,我今天用更好的方法制作了新的中间件。无论如何感谢您的帮助:D
    • @RobinR 如果它是正确的,您能否将其设置为答案。谢谢
    • 我已经接受了你的回答,因为这也是一种可行的方法,但是你也可以在你的用户模型中添加一个函数,在你的中间件中调用该函数,然后在内核中注册它。我已经在你的回答中提供了我的答案。
    • 哦,是的,你可以,那会是更简单的方法
    猜你喜欢
    • 2016-05-22
    • 2015-12-09
    • 2016-04-07
    • 2016-08-24
    • 2020-01-31
    • 2016-05-15
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多