【问题标题】:Can Laravel Auth::attempt() handle relationships?Laravel Auth::attempt() 可以处理关系吗?
【发布时间】:2017-03-19 13:07:49
【问题描述】:

我在 Laravel 5.3 中使用entrust 来管理基于角色的权限,并且自然而然地为不同的用户类型使用手动/自定义登录。 Auth::attempt() 可以处理外表关系吗?基本上,我想做这样的事情:

if(Auth::attempt(['email' => $request->email, 'password' => $request->password, hasRole('teacher') => true])) {
        return redirect()->intended('teacher/dashboard');
}

但我不断收到hasRole() 是未定义函数的错误。我已经包含了use Zizaco\Entrust\Traits\EntrustUserTrait;use EntrustUserTrait;,我认为它们可以让我访问该功能,但显然不是。

我很欣赏hasRole() 是一种用户对象的方法,并且在检查时我没有用户对象,但在尝试成功后我无法进行角色检查,因为那时用户已经已经登录,如果角色错误,我需要注销他们,因为他们的凭据是正确的,但不是角色;这似乎很慢而且不务实。

我应该如何处理这个问题?我可以使用Auth::attempt 的替代方法,它不会登录用户,但使用指定的输入检查用户是否存在,然后运行角色检查,然后使用另一个函数启动经过身份验证的会话?

如果有用,我的 LoginController 在这里:

<?php

namespace App\Http\Controllers\Teacher;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Validator;
use Zizaco\Entrust\Traits\EntrustUserTrait;

class LoginController extends Controller {
    use EntrustUserTrait;

    public function showLoginForm() {
        return view('teacher/login');
    }

    public function authenticate(Request $request) {
        Validator::make($request->all(), [
            'email' => 'required|email',
            'password' => 'required',
        ])->validate();

        if(Auth::attempt(['email' => $request->email, 'password' => $request->password, hasRole('teacher') => true])) {
            return redirect()->intended('teacher/dashboard');
        }

        return redirect('admin/login')->with('invalid', 'Invalid username or password');
    }
}

任何帮助或指导将不胜感激。谢谢。

【问题讨论】:

    标签: laravel laravel-5.3 laravel-authorization entrust


    【解决方案1】:

    我最终手动进行了身份验证检查并使用Auth::login($user) 创建了经过身份验证的会话。这样,用户只有在满足特定登录门户和控制器的角色要求时才能登录。

    public function authenticate(Request $request) {
        Validator::make($request->all(), [
            'email' => 'required|email',
            'password' => 'required',
        ])->validate();
    
        $user = User::where('email', $request->email)->first();
    
        if($user) {
            if(Hash::check($request->password, $user->password) && $user->hasRole('teacher')) {
                Auth::login($user);
                return redirect()->intended('teacher/dashboard');
            }
        }
    
        return redirect('teacher/login')->with('invalid', 'Invalid username or password');
    }
    

    【讨论】:

      【解决方案2】:

      这就是我在登录检查角色上所做的

      $user = User::whereEmail($request->email)->first();
      
      // I added this is because the customer 
      // are not suppose to login from here
      if(!$user || $user->hasRole(['customer'])){
          return $this->sendFailedLoginResponse($request);
      }
      
      if ($this->guard()->attempt($credentials, $request->has('remember'))) {
          return $this->sendLoginResponse($request);
      }
      

      如果你想根据用户角色改变路由,你可以尝试简单地替换redirectPath方法

      public function redirectPath()
      {
          $user = Auth::user();
          if($user->hasRole(['admin', 'system_admin']))
              return '/backend';
          elseif($user->hasRole(['teacher']))
              return '/teacher';
      }
      

      【讨论】:

      • 这是一个很好的解决方案,特别是如果我最终统一了登录控制器。但是,为了简单起见并与提供的函数保持一致以维护问题的上下文,我创建了另一个解决方案并标记为答案。
      【解决方案3】:

      你可以做的是:

       if(Auth::attempt(['email' => $request->email, 'password' => $request->password)) {
           if($user = Auth::user()->hasRole('teacher')) {
               return redirect()->intended('teacher/dashboard');
           } else {
               return redirect()->intended('teacher/dashboard');
           }
       }
      

      【讨论】:

      • 这将登录的人不一定是老师,但可以在不同的登录门户进行身份验证
      猜你喜欢
      • 2023-03-05
      • 2017-04-28
      • 2019-02-03
      • 2017-05-11
      • 2018-07-30
      • 2017-03-10
      • 1970-01-01
      • 2014-06-20
      • 2018-08-03
      相关资源
      最近更新 更多