自定义的多重身份验证防护,可启用学生登录

时间:2019-12-30 12:57:02

标签: php laravel laravel-6

我正在与4个不同的用户(每个人有不同的表)一起开发Laravel 6应用程序。为此,我正在使用多重身份验证防护,并根据本教程(https://pusher.com/tutorials/multiple-authentication-guards-laravel)在线创建了我的第一个防护。

这是我的海关守卫“学生”

    '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”的自定义身份验证保护的自定义登录控制器

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
{
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
        $this->middleware('guest:student')->except('logout');
    }
    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,但此错误会弹出“尝试获取非对象的属性” auth()-> user()上没有数据的标头,因此不会加载view.blade.php。

这是我的路线:

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

在StackOverflow上找不到其他相关主题的任何解决方案。如果我在某处有任何错误,请纠正我,或者如果您要检查其他文件中的代码,请告诉我。

谢谢。

1 个答案:

答案 0 :(得分:0)

您在auth()->user()上没有任何数据,因为您正在查询默认保护web

如果您想通过student保护来检索登录的用户,则必须执行auth()->guard('student')->user();

还请记住,每次都将保护措施传递给auth和使用auth的中间件。

即:如果您需要进行一些仅限于经过身份验证的用户的路由,则需要执行以下操作:

Route::group(['middleware' => 'auth:student'], function() {
    // Your restricted routes
})

省略:student将一如既往地使用默认的web保护罩