自定义 multi-auth 保护日志记录和路由
Custom multi-auth guard logging & routing
我正在开发一个有 4 个不同用户的 Laravel 6 应用程序(每个用户有不同的 table)。为此,我正在使用多身份验证守卫,并按照在线教程 (https://pusher.com/tutorials/multiple-authentication-guards-laravel) 创建了我的第一个守卫。
这是我的自定义守卫"student"
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
'student' => [
'driver' => 'session',
'provider' => 'students',
],
],
和供应商
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'students' => [
'driver' => 'eloquent',
'model' => App\Models\Student::class,
],
],
我有一个自定义登录控制器,使用名为 'student'
的自定义 auth guard
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Auth;
use Student;
class LoginController extends Controller
{
protected $redirectTo = '/dashboard';
public function __construct()
{
$this->middleware('guest')->except('destroy');
$this->middleware('student')->except('destroy');
}
public function studentLogin(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:5'
]);
if (Auth::guard('student')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))) {
return redirect()->intended('admin/home')->with('smessage', 'Logged in successfully...!');
}
return back()->withInput($request->only('email', 'remember'));
}...
}
现在,每当我尝试登录时,似乎我已登录并重定向到 middleware/RedirectIfAuthenticated.php 中定义的 URL,但会弹出此错误 "Trying to get property of non-object" 来自通用 header 模板,其中 auth()->user()
.
上没有可用的已登录用户数据
如果我使用 'middleware'=>'auth:student'
,我可以以学生身份访问路线并通过 auth()->user()
获取已记录的用户数据。对于使用 'middleware'=>'auth'
的管理员也是如此,但将 auth
和 auth:student
作为数组传递 我无法通过 auth()->user()
为两个用户获取记录的用户数据。
这是我的路线:
Route::get('/', function () {
return view('welcome');
});
Route::get('/login', 'LoginController@create')->name('login');
Route::post('login', 'LoginController@store');
Route::get('/login/student', 'LoginController@create')->name('studentlogin');
Route::post('/login/student', 'LoginController@studentLogin');
Route::get('/logout', 'LoginController@destroy')->name('logout');
Route::group(['prefix'=>'admin', 'namespace' => 'Dashboard', 'middleware'=> 'auth' ], function () {
Route::get('home', 'DashboardController@display')->name('admin.home');
Route::get('users', 'UserlistController@display')->name('admin.userlist');
Route::post('users', 'UserlistController@store')->name('admin.create');
Route::delete('users/{id}', 'UserlistController@destroy')->name('admin.deleteuser');
});
Route::group(['prefix'=>'student', 'namespace' => 'Students', 'middleware'=> 'auth:student' ], function () {
Route::get('all', 'StudentsController@display')->name('student.all');
Route::delete('all/{id}', 'StudentsController@destroy')->name('student.delete');
Route::post('all', 'StudentsController@store')->name('student.store');
});
无法从 Whosebug 上的其他相关主题中找到任何解决方案。如果我在某处有任何错误,请纠正我,或者如果您想检查代码的任何其他文件,请告诉我。
提前致谢。
您在 auth()->user()
上没有任何数据,因为您正在查询默认守卫 web
。
如果你想通过 student
守卫检索登录的用户,你必须做 auth()->guard('student')->user();
还记得每次将你的守卫传递给 auth
和使用 auth
的中间件。
即:如果您需要将某些路由限制为仅供经过身份验证的用户使用,您需要执行以下操作:
Route::group(['middleware' => 'auth:student'], function() {
// Your restricted routes
})
省略 :student
将一如既往地使用默认 web
守卫
请注意,如果您需要将路由限制为属于不同守卫的 组 用户,您可以将这些守卫传递给 auth
:
Route::group(['middleware' => 'auth:web,student'], function() {
// Your restricted routes
}];
这样,Laravel 将同时检查 web
和 student
守卫,并自动设置属于经过身份验证的用户的守卫。您还可以通过 auth()->user()
忘记通过右后卫
来检索您的用户
我正在开发一个有 4 个不同用户的 Laravel 6 应用程序(每个用户有不同的 table)。为此,我正在使用多身份验证守卫,并按照在线教程 (https://pusher.com/tutorials/multiple-authentication-guards-laravel) 创建了我的第一个守卫。
这是我的自定义守卫"student"
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
'student' => [
'driver' => 'session',
'provider' => 'students',
],
],
和供应商
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'students' => [
'driver' => 'eloquent',
'model' => App\Models\Student::class,
],
],
我有一个自定义登录控制器,使用名为 'student'
的自定义 auth guardnamespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Auth;
use Student;
class LoginController extends Controller
{
protected $redirectTo = '/dashboard';
public function __construct()
{
$this->middleware('guest')->except('destroy');
$this->middleware('student')->except('destroy');
}
public function studentLogin(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:5'
]);
if (Auth::guard('student')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))) {
return redirect()->intended('admin/home')->with('smessage', 'Logged in successfully...!');
}
return back()->withInput($request->only('email', 'remember'));
}...
}
现在,每当我尝试登录时,似乎我已登录并重定向到 middleware/RedirectIfAuthenticated.php 中定义的 URL,但会弹出此错误 "Trying to get property of non-object" 来自通用 header 模板,其中 auth()->user()
.
如果我使用 'middleware'=>'auth:student'
,我可以以学生身份访问路线并通过 auth()->user()
获取已记录的用户数据。对于使用 'middleware'=>'auth'
的管理员也是如此,但将 auth
和 auth:student
作为数组传递 我无法通过 auth()->user()
为两个用户获取记录的用户数据。
这是我的路线:
Route::get('/', function () {
return view('welcome');
});
Route::get('/login', 'LoginController@create')->name('login');
Route::post('login', 'LoginController@store');
Route::get('/login/student', 'LoginController@create')->name('studentlogin');
Route::post('/login/student', 'LoginController@studentLogin');
Route::get('/logout', 'LoginController@destroy')->name('logout');
Route::group(['prefix'=>'admin', 'namespace' => 'Dashboard', 'middleware'=> 'auth' ], function () {
Route::get('home', 'DashboardController@display')->name('admin.home');
Route::get('users', 'UserlistController@display')->name('admin.userlist');
Route::post('users', 'UserlistController@store')->name('admin.create');
Route::delete('users/{id}', 'UserlistController@destroy')->name('admin.deleteuser');
});
Route::group(['prefix'=>'student', 'namespace' => 'Students', 'middleware'=> 'auth:student' ], function () {
Route::get('all', 'StudentsController@display')->name('student.all');
Route::delete('all/{id}', 'StudentsController@destroy')->name('student.delete');
Route::post('all', 'StudentsController@store')->name('student.store');
});
无法从 Whosebug 上的其他相关主题中找到任何解决方案。如果我在某处有任何错误,请纠正我,或者如果您想检查代码的任何其他文件,请告诉我。
提前致谢。
您在 auth()->user()
上没有任何数据,因为您正在查询默认守卫 web
。
如果你想通过 student
守卫检索登录的用户,你必须做 auth()->guard('student')->user();
还记得每次将你的守卫传递给 auth
和使用 auth
的中间件。
即:如果您需要将某些路由限制为仅供经过身份验证的用户使用,您需要执行以下操作:
Route::group(['middleware' => 'auth:student'], function() {
// Your restricted routes
})
省略 :student
将一如既往地使用默认 web
守卫
请注意,如果您需要将路由限制为属于不同守卫的 组 用户,您可以将这些守卫传递给 auth
:
Route::group(['middleware' => 'auth:web,student'], function() {
// Your restricted routes
}];
这样,Laravel 将同时检查 web
和 student
守卫,并自动设置属于经过身份验证的用户的守卫。您还可以通过 auth()->user()
忘记通过右后卫