【问题标题】:Laravel 5 multiple authenticationLaravel 5 多重身份验证
【发布时间】:2015-08-21 08:31:12
【问题描述】:

如何在 Laravel 5 中设置多个身份验证。开箱即用您只能设置 1 个身份验证。如果我有一个客户表和一个管理员表并希望为每个表设置身份验证 - 每种经过身份验证的用户类型都应该被限制查看或访问管理页面,反之亦然?

* 更新 *

我创建了一个 users 表,其中包含求职者和招聘人员共有的信息,即姓名、密码等。

我已经创建了一个角色和角色用户表

我创建了两个单独的表来保存jobseeker_profile 和recruiter_profile

如何使用以下路由验证具有 Jobseeker 类型角色的用户?

Route::get('jobseeker/login', 'Auth\AuthController@getLogin');
Route::post('jobseeker/login', 'Auth\AuthController@postLogin');
Route::get('recruiter/login', 'Auth\AuthController@getLogin');
Route::post('recruiter/login', 'Auth\AuthController@postLogin');

以及如何在经过身份验证后保护路由 - 以下是中间件如何知道用户类型:

Route::get('jobseeker/profile', ['middleware' => 'auth', 'uses' => 'JobseekerProfileController@show']);
Route::get('jobseeker/profile/update', ['middleware' => 'auth', 'uses' => 'JobseekerProfileController@updateProfile']);

class JobseekerProfileController extends Controller {


  public function updateProfile()
  {
    if (Auth::user())
    {
        // Auth::user() returns an instance of the authenticated user...
    }
  }

}

Laravel 5 身份验证控制器使用以下特征 - 您会使用您的答案编辑该特征还是使用您的答案创建一个新的身份验证控制器?

trait AuthenticatesAndRegistersUsers {

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

    $credentials = $request->only('email', 'password');

    if ($this->auth->attempt($credentials, $request->has('remember')))
    {
        return redirect()->intended($this->redirectPath());
    }

    return redirect($this->loginPath())
                ->withInput($request->only('email', 'remember'))
                ->withErrors([
                    'email' => 'These credentials do not match our records.',
                ]);
 }
}

【问题讨论】:

    标签: authentication laravel-5


    【解决方案1】:

    您可以在您的数据库中创建一个角色表,相应地为每个用户分配角色,然后在登录时检查用户具有什么角色,然后您可以相应地重定向/显示页面。无需为每种类型的用户创建单独的表。

    修改后的答案

    if(Auth::attempt(['email' => $request->email, 'password' => $request->password]))
    {
       //using role with an expectation that you have one relation method named role defined in User model
       //and roles table stores user type as name
    
       if(Auth::user()->role->name == 'admin')
       {
          return redirect()->to('/administrator/dashboard');
       }
       elseif(Auth::user()->role->name == 'jobseeker')
       {
          return redirect()->to('jobseeker/dashboard');
       }
    }
    

    【讨论】:

    • 不同类型的用户具有不同的属性,在这种情况下,将所有用户用户放在一个表中是糟糕的数据库设计。举个例子,我可以有一个求职者和一个招聘人员。两者都是用户,但每个人都有不同的属性。某些属性对于招聘人员是强制性的,但对于求职者则不是,反之亦然,例如招聘人员将有一个公司表的外键。求职者不会有这样的关系等等。
    • 此外,上述用户(即求职者和招聘人员)之间的明显区别将使在雄辩模型中定义关系变得极其困难。如果我对求职者和招聘者都有一个单一的用户雄辩模型,你将如何定义招聘者有很多工作但求职者没有的关系?
    • 我的意思是使用单个表进行身份验证,并为求职者和公司提供不同的个人资料表
    • 我已经按照您的建议更新了我的数据库,但是如何验证不同类型的用户?
    • 我想我明白你的意思。但是有一个问题,我正在使用 laravel 5,并且开箱即用的身份验证控制器使用 AuthenticateAndRegistersUsers 特征 - 请参阅使用此特征的 postLogin 方法编辑的问题。你会编辑这个特征还是根据你的答案创建一个新的身份验证控制器?
    【解决方案2】:

    你可以通过这个包实现多重认证

    https://packagist.org/packages/sarav/laravel-multiauth

    有关更详细的解释,请在此处查看我之前返回的答案

    How to use authentication for multiple tables in Laravel 5

    【讨论】:

    • 这里非常不鼓励仅链接的答案,因为这些链接将来可能会失效。我建议您使用您引用的来源中的引用来编辑您的答案。
    • 我已经尝试过写了,但是修改器要求我链接之前写的链接,而不是在这里再次复制答案。作为新用户,我没有足够的积分来评论或将此问题标记为重复
    • 没关系。但这只是一个建议,以便将来其他人可能不会将其标记为仅链接答案。
    猜你喜欢
    • 2015-05-26
    • 2018-07-21
    • 2018-10-17
    • 2015-04-25
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多