【问题标题】:Laravel 5.3 protecting routes from user have different rolesLaravel 5.3 保护用户的路由具有不同的角色
【发布时间】:2017-05-15 18:42:38
【问题描述】:

问题

我正在寻找一种方法来保护用户免受不属于他们的访问路由的影响,例如管理员无法访问用户区域,简单用户无法访问管理区域

嗨,我有一个 laravel 5.3 应用,它有两种类型的用户

  1. 管理员
  2. 简单用户

我试图阻止admin 访问simple user 路由,反之亦然,我搜索了很多并找到了一种创建中间件的解决方案

我做了什么

<?php

namespace App\Http\Middleware;

use Auth;

use Closure;

class UserRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ( Auth::check()) // user logged
        {
            $request_url = $request->getRequestUri();
            if( Auth::user()->user_type == 1 ) // simple user
            {
                // checking if simple user is visiting routes              // starts with /user in the url 
                if (strpos($request_url, "/user") === 0)
                {
                    return $next($request);
                }
                else
                {
                    return redirect('/');
                }
            }
            // checking if admin is visiting routes                    // starts with /admin in the url
            else if( Auth::user()->user_type == 2 ) // admin
            {
                if (strpos($request_url, "/admin") === 0)
                {
                    return $next($request);
                }
                else
                {
                    return redirect('/');
                }
            }
            else
            {
                return redirect('/');
            }
        }
        return redirect('/');
    }
}

不幸的是,双方都能够访问彼此的禁区。我找不到更好的方法来保护用户不访问他们也无权访问的路线。

【问题讨论】:

    标签: php laravel routes laravel-5.3


    【解决方案1】:

    如果您想使用中间件来实现这一点,您需要执行以下操作 -

    1. 创建两个中间件,一个用于管理员,一个用于简单用户。

    2. 然后在你的路由文件中创建两个路由组,即routes/web.php

    3. 使用 admin 中间件保护一个路由组,并将所有与管理员相关的路由放入该组。保护另一个路由组 和 simple-user 中间件,并将所有与管理员相关的路由放在该组中。

    Route::group(['middleware' => ['auth', 'admin']], function() {
        // put all your admin routes here
    });
    
    Route::group(['middleware' => ['auth', 'simple-user']], function() {
        // put all your simple user routes here
    });
    

    您也可以使用角色和权限来完成此操作。这是一个可以满足您需求的软件包。

    https://packagist.org/packages/zizaco/entrust

    【讨论】:

      猜你喜欢
      • 2018-09-25
      • 2017-02-11
      • 2014-07-18
      • 1970-01-01
      • 2018-08-20
      • 2021-11-12
      • 2017-01-24
      • 2017-05-10
      • 2013-08-01
      相关资源
      最近更新 更多