在laravel 5.1

时间:2016-08-24 03:59:11

标签: authentication laravel-5.1

我正在尝试实现一项功能,在登录后,用户会根据其角色重定向到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.2laravel redirect to url after login,但我不了解如何应用这些答案。例如,第二个问题的接受答案显示了新方法,getCredentials()login(),这些方法并不存在于海报的原始课程中。在我的代码库中,我不确定在哪个类中添加它们或从哪里调用它们。

其他类似的答案显示了一种完全不同的用户身份验证方式,例如this。看来,要使用该解决方案,我需要重新编写代码,并放弃使用特性,其中包括登录限制等奖励功能。

我是否有办法在登录后根据角色重定向用户,同时仍然使用这些内置特征?

1 个答案:

答案 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' );
}

这应该很好用