当前位置: 首页 > 知识库问答 >
问题:

Laravel自定义多重身份验证

景承教
2023-03-14

我正在创建一个laravel应用程序与自定义多重身份验证。我正在跟随这篇文章进行多重身份验证。https://pusher.com/tutorials/multiple-authentication-guards-laravel

我已经创建了登录和注册控制器定义的警卫和提供者,一切正常,我能够注册用户并登录他们。我写了一页(http://127.0.0.1:8000/admin)只有当管理员登录时,才能访问此页面,但每个人都可以访问此url。下面是我的代码,

登录控制器代码

public function __construct()
{
     $this->middleware('guest')->except('logout');
        $this->middleware('guest:admin')->except('logout');
        $this->middleware('guest:writer')->except('logout');
}


public function showAdminLoginForm()
{
    return view('auth.login', ['url' => 'admin']);
}

public function adminLogin(Request $request)
{
    $this->validate($request, [
        'email'   => 'required|email',
        'password' => 'required|min:6'
    ]);

    if (Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request>password], $request->get('remember'))) {

        return redirect()->intended('/admin');
    }
    return back()->withInput($request->only('email', 'remember'));
}

寄存器控制器代码

     public function __construct()
    {
        $this->middleware('guest');
            $this->middleware('guest:admin');
            $this->middleware('guest:writer');


    }

     public function showAdminRegisterForm()
    {
        return view('auth.register', ['url' => 'admin']);
    }
protected function createAdmin(Request $request)
    {
        $this->validator($request->all())->validate();
        $admin = Admin::create([
            'name' => $request['name'],
            'email' => $request['email'],
            'password' => Hash::make($request['password']),
        ]);
        return redirect()->intended('login/admin');
    }

管理模型代码

namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

use Illuminate\Database\Eloquent\Model;

class admin extends Authenticatable 
{


     use Notifiable;

        protected $guard = 'admin';

        protected $fillable = [
            'name', 'email', 'password',
        ];

        protected $hidden = [
            'password', 'remember_token',
        ];
}

Handler.php

  protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
        if ($request->is('admin') || $request->is('admin/*')) {
            return redirect()->guest('/login/admin');
        }
        if ($request->is('writer') || $request->is('writer/*')) {
            return redirect()->guest('/login/writer');
        }
        return redirect()->guest(route('login'));
    }

重定向uthenticated.php

public function handle($request, Closure $next, $guard = null)
{
    if ($guard == "admin" && Auth::guard($guard)->check()) {
            return redirect('/admin');
        }
        if ($guard == "writer" && Auth::guard($guard)->check()) {
            return redirect('/writer');
        }
        if (Auth::guard($guard)->check()) {
            return redirect('/home');
        }

        return $next($request);
    }

Admin.blade.php视图

   <html>
    <head>
        <title>admin page </title>
    </head>
    <body>

    <h1> hi bosss </h1>
    </body>
    </html>

//Auth.php

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

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],


          'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
        'writer' => [
            'driver' => 'session',
            'provider' => 'writers',
        ],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],

    'admins' => [
        'driver' => 'eloquent',
        'model' => App\admin::class,
    ],
    'writers' => [
        'driver' => 'eloquent',
        'model' => App\writer::class,
    ],

//web.php

  <?php
Route::view('/', 'welcome');
Auth::routes();

Route::get('/login/admin', 'Auth\LoginController@showAdminLoginForm');
Route::get('/login/writer', 'Auth\LoginController@showWriterLoginForm');
Route::get('/register/admin', 'Auth\RegisterController@showAdminRegisterForm');
Route::get('/register/writer', 'Auth\RegisterController@showWriterRegisterForm');

Route::post('/login/admin', 'Auth\LoginController@adminLogin');
Route::post('/login/writer', 'Auth\LoginController@writerLogin');
Route::post('/register/admin', 'Auth\RegisterController@createAdmin');
Route::post('/register/writer', 'Auth\RegisterController@createWriter');

Route::view('/home', 'home')->middleware('auth');
Route::view('/admin', 'admin');
Route::view('/writer', 'writer');

请建议。

共有2个答案

唐俊楚
2023-03-14

我认为不值得有两个单独的表useradmin
我发现多重身份验证的最佳方法是:
https://www.itsolutionstuff.com/post/laravel-6-multi-auth-authentication-tutorialexample.html

咸臻
2023-03-14

您应该将auth: admin中间件分配到您希望仅限制管理员的路由:

Route::view('admin', 'admin')->middleware('auth:admin');

Laravel 6.x文档-身份验证-保护路由-指定保护

 类似资料:
  • 我正在laravel中创建一个多身份验证系统,其中有两种类型的用户:管理员(由我创建)和用户(使用本地laravel身份验证系统)。 如果我以用户身份登录,当我尝试访问登录页面时,当我已经登录,它会将我重定向回仪表板,但如果我以管理员身份登录,当我再次访问管理员登录页面时,它会让我再次登录,尽管已经作为管理员登录。 以下是我的重定向身份验证类代码: 有人能解释一下发生了什么事吗?

  • 我正在使用fire base制作一个反应原生应用程序,用于使用电子邮件登录im并通过身份验证。但是,有没有办法使用用户名和密码登录?

  • 我的管理员控制器扩展了控制器类,在那里我使用方法加载视图页面并传递保护。config/auth.php也通过添加管理员保护和提供程序进行了修改。在app/Actions/Fortify文件夹中,我添加了AttemptToAuthenticate和ReDirectIfTwoFactorAuthenticate类,并更改了命名空间。我的管理员控制器还扩展了Guard。用户的重定向中间件和管理员的重定向

  • 在我的LaravelV5.4项目中,我有两个模型:用户和管理员。 在config/auth.php中,我向警卫和提供者添加了admin,如下所示: 现在在AdminController类中,我想使用Auth::true函数,但默认情况下它使用用户表。我可以在config/auth.php中更改默认值,如下所示,它可以工作,但在这种情况下,我不能为用户使用auth::trunt。 我想将用户设置为默

  • 在Laravel 5中,如果用户的基本身份验证失败,则返回的默认消息是“无效凭据”错误字符串。出现这种情况时,我试图返回一个自定义JSON错误。 我可以在vendor/laravel/framework/src/illumb/Auth/SessionGuard.php中编辑返回的响应,但是我还没有看到可以在vendor目录之外的何处更改此消息的行为。有办法吗? 看起来有一些方法可以通过Larave

  • 我们正在研究在我们的应用程序中实施基于SAML的SSO身份验证,我想知道是否可以通过SAML指定自定义重定向URL。换句话说,我们可以在身份提供者中配置一个服务提供者,并让服务提供者通过SAML请求指定身份提供者在登录后应将用户重定向到哪里? 我们之所以要寻找这样的东西,是因为我们的应用程序运行在不同的服务器上,这取决于它们所处的开发阶段(开发、测试、暂存、生产)。如果我们不必为要迁移到SAML