我正在使用entrust来管理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;
和use EntrustUserTrait;
,我认为它可以让我访问该功能,但显然不是。
我很欣赏hasRole()
是一个用户对象的方法,在检查时我没有用户对象,但是在尝试成功后我无法进行角色检查,因为用户已经登录,如果角色错误,我需要将其注销,因为他们的凭据是正确的,但不是角色;这似乎很慢而且不实用。
我该如何处理?是否有我可以使用的Auth::attempt
的替代方法,它不会登录用户,但检查用户是否存在指定的输入,然后运行角色检查,然后使用另一个函数启动经过身份验证的会话?< / p>
如果有用,我的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');
}
}
非常感谢任何帮助或指示。感谢。
答案 0 :(得分: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');
}
}
答案 1 :(得分: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';
}
答案 2 :(得分: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');
}