4

我在 Laravel 5.3 中使用委托来管理基于角色的权限,并且自然地为不同的用户类型使用手动/自定义登录。是否可以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;and 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');
    }
}

任何帮助或方向将不胜感激。谢谢。

4

3 回答 3

1

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

$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';
}
于 2016-11-06T05:42:51.840 回答
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');
}
于 2016-11-06T11:56:46.317 回答
1

你可以做的是:

 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');
     }
 }
于 2016-11-06T04:20:32.727 回答