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