laravel - 初学者的多身份验证 laravel 5.6 一步一步
问题描述
有人可以帮我如何在 laravel 5.6 中进行多重身份验证,我已经阅读了这篇如何在 laravel 5.6 中创建多重身份验证? 但仍然无法理解。请帮助我。
解决方案
这家伙摇滚......我学会了如何使用这个 youtube 视频进行多重身份验证,它有点长,但如果你想要的话,它肯定会让你为管理员和用户进行身份验证。
https://www.youtube.com/watch?v=iKRLrJXNN4M&list=PLwAKR305CRO9S6KVHMJYqZpjPzGPWuQ7Q
这是我为本教程视频制作的备忘单。当您厌倦了在视频上输入所有内容时,请参考它。但是,我强烈建议观看视频,仅看这些说明可能还不够。
基本身份验证和管理模型
php artisan make:auth
php artisan make:migration create_admins_table --create=admins
数据库/迁移/???_create_admins_table.php
public function up()
{
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
将用户模型复制到管理员模型
用户.php
管理员.php
在 auth.php 中保护管理员
配置/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'admin-api' => [
'driver' => 'token',
'provider' => 'admins',
],
],
**Create provider for Admin**
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
]
],
**Create password resets for admin**
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
'admins' => [
'provider' => 'admins',
'table' => 'password_resets',
'expire' => 60,
],
],
将 Admin Guard 应用于 admin 模型
应用程序/Admin.php
protected $guard = 'admin’;
制作管理员控制器
复制 HomeController -> AdminController
应用程序/Http/Controllers/AdminController.php
public function __construct()
{
$this->middleware('auth:admin');
}
制作 AdminLoginController
php artisan make:controller Auth/AdminLoginController
制作管理员登录视图
重复 login.blade.php -> admin-login.blade.php
资源/视图/admin-login.blade.php
登录 -> 管理员登录
route(‘login’) -> route(‘admin.login.submit’)
管理员路由设置
路线/web.php
Route::prefix('admin')->group(function() {
Route::get('/', 'AdminController@index’)->name(‘admin.dashboard');
Route::get('/login', 'Auth\AdminLoginController@showLoginForm')->name('admin.login');
Route::post('/login', 'Auth\AdminLoginController@login')->name('admin.login.submit');
});
使 AdminLoginController 登录
应用程序/http/controllers/Auth/AdminLoginController.php
public function __construct()
{
$this->middleware('guest:admin', ['except' => ['logout']]);
}
public function showLoginForm()
{
return view('auth.admin-login');
}
public function login(Request $request)
{
// Validate the form adata
$this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:6'
]);
//Attempt to log the user in
if (Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request->password], $request->remember)) {
//if sucessful, the redirect to their
return redirect()->intended(route('admin.dashboard'));
}
//if unseccessful
return redirect()->back()->withInput($request->only('email', 'remember'));
}
public function logout()
{
Auth::guard('admin')->logout();
return redirect('/');
}
解决重定向错误 1
- /admin 导致 /login 时出错
- 使用异常处理程序解决它。未认证状态下,当guard为admin时,重定向到/admin/login,其他情况,重定向到/login
应用程序/异常/Handler.php
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'unauthenticated'], 401);
}
$guard = array_get($exception->guards(),0);
switch ($guard) {
case 'admin':
$login = 'admin.login';
break;
default:
$login = 'login';
break;
}
return redirect()->guest(route($login));
}
解决重定向错误 2
- 受访客中间件保护的页面仅指向 /home
- 以用户身份登录时,输入/admin 将重定向到/home,这是由于仅识别guest:user 引起的。因此,我们应该修复 RedirectIfAuthenticated 以便我们的应用程序也可以识别 guest:admin 。
应用程序/Http/中间件/RedirectIfAuthenticated
public function handle($request, Closure $next, $guard = null)
{
switch($guard) {
case 'admin':
if(Auth::guard($guard)->check()) {
return redirect()->route('admin.dashboard');
}
break;
default:
if(Auth::guard($guard)->check()) {
return redirect()->route('/home');
}
}
return $next($request);
}
更新 laravel 项目的配置缓存
php artisan config:cache
希望能帮助到你 :)
推荐阅读
- java - 使用 Spring Security 持久化登录操作
- java - log4j2新objectMessageAsJsonObject问题
- swift - 重新加载 UICollectionView viewForSupplementaryElementOfKind 而不重新加载 cellForItemAt
- react-native - REACT NATIVE:如何从 Stack-Navigator 中的 Tap-navigator 访问屏幕
- git - 独立合并/ git diff --no-index 的 3 路等效项
- javascript - KonvaJS 在圆圈顶部翻转文本
- ruby-on-rails - 在 RoR 中提交之前,如何获取模型方法中的属性值?
- python - AttributeError:类型对象“BST”没有属性“包含”
- ios - 为什么社交分享按钮看起来很糟糕?
- echarts - Echarts 将值与 x 标签类别对齐