Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel多重身份验证-管理员保护_Php_Laravel - Fatal编程技术网

Php Laravel多重身份验证-管理员保护

Php Laravel多重身份验证-管理员保护,php,laravel,Php,Laravel,我在拉雷维尔有两名警卫 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], //Our Admin custom driver 'web_admin' => [ 'driver' => 'session',

我在拉雷维尔有两名警卫

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        //Our Admin custom driver
        'web_admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
    ],
和提供者

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],

     //Admin user provider
      'admins' => [
          'driver' => 'eloquent',  //We are using eloquent model
          'model' => App\Admin::class,
      ],
],
默认值是

'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
当我以管理员身份登录并尝试访问用户配置文件时,它会要求我以用户身份登录,这是正常的。但我要找的是,管理员应该能够访问作为管理员登录整个网站

我之所以选择multi-auth而不是rbac,是因为我有5种类型的用户,每种类型都有不同的注册字段和登录名。每个用户也有一套工具

所以我希望管理员守卫能够访问所有的警卫了

Business guard只能访问用户guard

App/Http/Controllers/AdminAuth/LoginController

<?php

//LoginController.php

namespace App\Http\Controllers\AdminAuth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

//Class needed for login and Logout logic
use Illuminate\Foundation\Auth\AuthenticatesUsers;

//Auth facade
use Auth;

class LoginController extends Controller
{
    //Where to redirect admin after login.
    protected $redirectTo = '/admin/home';

    //Trait
    use AuthenticatesUsers;

    //Custom guard for admin
    protected function guard()
    {
      return Auth::guard('web_admin');
    }

    //Shows admin login form
   public function showLoginForm()
   {
       return view('admin.auth.login');
   }
}
<?php

namespace App\Http\Controllers\Auth;
use Socialite;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    /**
     * Redirect the user to the GitHub authentication page.
     *
     * @return \Illuminate\Http\Response
     */
      public function redirectToProvider($social)
      {
          return Socialite::driver($social)->redirect();
      }

      /**
       * Obtain the user information from GitHub.
       *
       * @return \Illuminate\Http\Response
       */
      public function handleProviderCallback($social)
      {
          $user = Socialite::driver($social)->user();

          // $user->token;
      }
}

进一步了解我们的通信

一,


如果您有多种类型的用户。。。所以我建议你改变你的逻辑,让管理员也成为用户。。。删除管理员,然后在用户添加字段“type”或类似的内容。。。并与字段一起检查用户是否是管理员或是否有权限/访问系统的某些部分。。。如果用户“type”是“admin”,那么他也可以访问所有部分

  • 所以你的意思是删除多重身份验证并使用RBAC。但我有一个要求,我需要使用多重身份验证,每个守卫都有自己的RBAC,例如,管理员守卫角色是经理、支持等等。业务守卫角色包括供应商、卖家等

  • 是的,这就是我的意思。我在我开发的一个系统上做了类似的事情,我又添加了一个守卫,这样所有的“登录”路由都会传入(比如auth),在那里我检查请求的路由和操作,检查用户类型是否允许访问此操作,如果不允许,我将他重定向到其他地方(在我的情况下是主仪表板页面)

  • 添加新的中间件

    php artisan make:middleware Permissions
    
    在app\Http\Kernel.php中,将新中间件添加到受保护的$routeMiddleware中

    'permissions' => \App\Http\Middleware\Permissions::class,
    
    在Routes web中添加登录所需的路由并添加中间件权限。。。注意as的定义

    Route::group(['middleware'=>['auth', 'permissions']], function() {
            // any of your routs ... for example
    
            Route::get('/', [
                'uses'=>"UserController@getUsers",
                'as'=>"users"
            ]);
    
            Route::get('/{id}', [
                'uses'=>"UserController@getUserEdit",
                'as'=>"users.edit"
            ]);
    });
    
    在新的中间件app\Http\middleware\Permissions.php中, 调整公共功能句柄,并在其中添加用户级逻辑。。。请注意,对于开关盒,请检查as。。。与routs web文件中定义的相同

    根据需要为登录用户“键入”添加更多检查。。。管理员,支持。。。等等,就像你在系统中看到的那样

    public function handle($request, Closure $next, $guard = null)
    {
        $user = $request->user();
        $actions = $request->route()->getAction();
    
        switch( $actions['as'] ) {
            case "users":
                if( ! $user->isAdmin() ) {
                    //return redirect()->route("dashboard");
                }
            break;
    
            case "users.edit":
                if( ! $user->isAdmin() ) {
    
                }
            break;
    
            // add more cases as you need and check the user "type"
    
            default:
    
            break;
        }
    
        return $next($request);
    }
    
    如果你有很多溃败。。。因此,可能最好添加一些“小”中间件,并针对每个路由组/前缀。。。检查用户是否允许访问此前缀。
    例如添加SupportMiddleware/SalesMiddleware。。。在每一种情况下,您只需检查用户类型以及它是否适合当前的路由组。

    只需用,(逗号)分隔您的守卫,所有列出的守卫就可以访问这些路由

    示例:

    Route::group(['middleware'=>'auth:web,web_admin'], function() {
        //Now this routes can be accessible by both admin as well as 
    
    });
    

    您说过,当我以管理员身份登录并尝试访问用户配置文件时,它会要求我以用户身份登录,所以您是否检查用户配置文件的功能以验证用户身份?您应该编写一个函数来检查访问级别?您的意思是在控制器中?如果您有多种类型的用户。。。所以我建议你改变你的逻辑,让管理员也成为你的助手。。。删除管理员,然后在用户添加字段“type”或类似的内容。。。和带有字段的wotk,以检查用户是否是管理员或是否有权限/访问系统的某些部分。。。如果用户“type”是“admin”,那么他也可以访问所有部分。Route::group(['middleware'=>'auth'],function(){我希望admin也可以访问这些路由。我为admin创建了单独的中间件,它有自己的Route::group['middleware'=>'admin']我如何使管理员访问验证中间件也,以便支持代理可以检查的情况下,如果出现任何问题与用户account@Srikanthgopi…是的,这就是我的意思。我在我开发的一个系统上做了类似的事情,我又添加了一个守卫,这样所有“登录”的路由都可以通过(比如auth)在那里,我正在检查请求的路由和操作,并检查用户类型是否允许访问此操作,如果不允许,我将他重定向到其他地方(在我的情况下,重定向到主仪表板页面)。您成功了吗?需要更多帮助吗?
    Route::group(['middleware'=>['auth', 'permissions']], function() {
            // any of your routs ... for example
    
            Route::get('/', [
                'uses'=>"UserController@getUsers",
                'as'=>"users"
            ]);
    
            Route::get('/{id}', [
                'uses'=>"UserController@getUserEdit",
                'as'=>"users.edit"
            ]);
    });
    
    public function handle($request, Closure $next, $guard = null)
    {
        $user = $request->user();
        $actions = $request->route()->getAction();
    
        switch( $actions['as'] ) {
            case "users":
                if( ! $user->isAdmin() ) {
                    //return redirect()->route("dashboard");
                }
            break;
    
            case "users.edit":
                if( ! $user->isAdmin() ) {
    
                }
            break;
    
            // add more cases as you need and check the user "type"
    
            default:
    
            break;
        }
    
        return $next($request);
    }
    
    Route::group(['middleware'=>'auth:web,web_admin'], function() {
        //Now this routes can be accessible by both admin as well as 
    
    });