我正在尝试实现一项功能,在登录后,用户会根据其角色重定向到URL。我已经设置了角色部分,但是我在登录后立即测试用户的属性时遇到了问题。
我按照说明here创建了用户登录页面。我的AuthController
看起来像这样:
namespace App\Http\Controllers\Auth;
use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
class AuthController extends Controller {
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
protected $redirectTo = '/test';
...
}
我的__construct()
函数验证了用户,但我不知道如何在登录后立即访问用户对象。这就是我现在所拥有的:
public function __construct() {
$this->middleware('guest', ['except' => 'getLogout']);
if ( \Auth::check() ) {
$user = \Auth::user();
if ( $user->admin() ) {
// an admin
$this->redirectTo = '/admin';
} else {
// it's a client
$this->redirectTo = '/client/dashboard';
}
}
$user = \Auth::user();
if ( is_object($user) ) {
} else {
$this->redirectTo = '/auth-not-object';
}
}
当我第一次尝试使用管理员帐户登录时,我会转到路径/auth-not-object
,因为此时没有任何经过身份验证的用户对象。
在尝试登录但导致重定向错误后,当我再次访问/login
网址时,我被重定向到/home
,我认为这是默认$redirectTo
这个班级使用的特征。这意味着我们已经通过了AuthController __construct()
方法而没有更改$redirectTo
,即使有经过身份验证的用户也是如此。
我发现了其他问题,例如How to add extra logic on login condition in Laravel 5.2和laravel redirect to url after login,但我不了解如何应用这些答案。例如,第二个问题的接受答案显示了新方法,getCredentials()
和login()
,这些方法并不存在于海报的原始课程中。在我的代码库中,我不确定在哪个类中添加它们或从哪里调用它们。
其他类似的答案显示了一种完全不同的用户身份验证方式,例如this。看来,要使用该解决方案,我需要重新编写代码,并放弃使用特性,其中包括登录限制等奖励功能。
我是否有办法在登录后根据角色重定向用户,同时仍然使用这些内置特征?
答案 0 :(得分:1)
我不确定5.1 auth是否与5.2 auth相同,但如果是,则删除构造中的所有内容并添加此方法:
protected function handleUserWasAuthenticated( Request $request, $throttles, $guard )
{
if ($throttles) {
$this->clearLoginAttempts( $request );
}
if ( method_exists( $this, 'authenticated' ) ) {
return $this->authenticated( $request, Auth::guard( $guard )->user() );
}
return redirect()->intended( $this->redirectTo );
}
这是确定重定向的方法,您可以访问用户对象。
修改强>
我拿回上面的内容,只需将以下内容添加到您的控制器中;
protected function authenticated( $request, $user ) {
return redirect()->intended( $user->admin() ? '/admin' : '/client/dashboard' );
}
这应该很好用