LoginUsingId的Laravel问题(手动验证)

时间:2016-09-07 02:19:12

标签: laravel laravel-5 laravel-5.3

我正在尝试在多个域上实施单点登录。这个概念非常简单,即发送唯一的用户令牌,然后验证这些令牌以找到用户然后登录。

现在在验证令牌然后抓住用户之后,我做了类似的事情

$loggedInUser = Auth::loginUsingId($user->id, true);

现在我有一个自定义中间件,它首先检查登录用户,即

Auth::Check()

上述情况首次正常。但是刷新时Auth :: check()没有经过验证。我也试过使用所有不同的会话驱动程序,但仍然无法正常工作。

我在laravel 5.2上使用了类似的代码,它确实有效。但是在laravel 5.3上它没有验证持久性请求。

编辑:让我告诉你我的代码 我没有修改AuthServiceProvider或任何其他防护。我在目录中有用户模型,但我修改了auth.php中的路径。

以下是domain1指向的路径:

http://domain2.com/ {{$角色}} / {{$路线}} /单一登入/ {{$令牌}}

然后通过loginController中的verifySingleSignOn方法获取它,该方法接收用户从其他域进入的角色和路由以及令牌。然后,用户将重定向到相同的路由,但在domain2上。在这里,我可以在手动登录之前成功接收用户ID。

public function verifySingleSignOn($role, $route, $token)
    {
        // Fetch Single Signon
        $userRepository = new UserRepository();
        $user = $userRepository->checkForSingleSignOnToken($token, ['id']);

        // Check if Token Exists
        if (isset($user->id) && is_int($user->id) && $user->id != 0) {

            // Manually Logging a user (Here is successfully recieve the user id)
            $loggedInUser = Auth::loginUsingId($user->id);

            if (!$loggedInUser) {
                // If User not logged in, then Throw exception
                throw new Exception('Single SignOn: User Cannot be Signed In');
            }
            $redirectTo = $role . '/' . $route;
            return redirect($redirectTo);
        } else {
            return Auth::logout();
        }
    }

然后我有了这个GlobalAdminAuth中间件

   // Check if logged in
    if( Auth::Check() ){
        $user = Auth::User();

        // Check if user is active and is a globaladmin
        if( !$user->isGlobalAdmin() || !$user->isActive() ){
            return redirect()->guest('login');
        }
    }else{
        return redirect()->guest('login');
    }

    return $next($request);

现在第一次一切正常,用户成功地通过中间件。但是第二次触发了else语句。

编辑:checkForSingleSignOnToken的代码

public function checkForSingleSignOnToken($token, $columns = array('*'))
{
    return User::where('single_signon', $token)->first($columns);
}

5 个答案:

答案 0 :(得分:0)

Cookie受域名限制。您在domain1.com上的申请将无法抓取domain2.com设置的Cookie。

你应该定制守卫以使用除cookie以外的其他机制。也许在查询参数中使用令牌。

答案 1 :(得分:0)

将其添加到inf

中的protected $middleware数组中
app\Http\Kernel.php

我认为这与框架中的更新有关

答案 2 :(得分:0)

没有使用auth:检查中间件

使用request-> user()或auth :: user()

答案 3 :(得分:0)

  

请查看以下代码结构,我已经进行了手动验证   在laravel 5.0。

<强> routes.php文件

Route::get('login_user_by_id/{id?}', ['as' => 'login_user_by_id', 'uses' => 'UsersController@login_user_by_id']);
Route::post('user_login_post_for_admin',['as'=>'user_login_post_for_admin','uses'=>'LoginController@user_login_post_for_admin']);
Route::get('user_logout', ['as' => 'user_logout', 'uses' => 'UsersController@user_logout']);

<强> LoginController.php

public function user_login_post_for_admin(){
    $this->set_email($_POST['email']);
    $this->set_password($_POST['password']);
    $this->set_login_requested_role(['Admin','Moderator']);
    return $this->user_login_post();
}

public function user_login_post(){
    $User = new User();

    if(isset($this->email) && !empty($this->email)){
        $User->set_email(trim($this->email));
        $User->set_password(Hash::make(trim($this->password)));
        $user_login_data = $User->check_email_password_for_login();
        if(isset($user_login_data) && !empty($user_login_data)){
            if (Hash::check(trim($this->password), $user_login_data[0]->password)) {
                $response['user_id']=$user_login_data[0]->id;
                $response['name']=$user_login_data[0]->name;
                $response['surname']=$user_login_data[0]->surname;
                $response['profile_picture']=$user_login_data[0]->profile_picture;
                $response['SUCCESS']='True';
                $response['MESSAGE']='Login Success.';
                return Redirect::route('login_user_by_id',[$user_login_data[0]->id]);
            }else{
                Session::put('SUCCESS','FALSE');
                Session::put('MESSAGE', 'Invalid Credential.');
                return redirect()->back();
            }
        }else{
            Session::put('SUCCESS','FALSE');
            Session::put('MESSAGE', 'Invalid Credential.');
            return redirect()->back();
        }
    }else{
        Session::put('SUCCESS','FALSE');
        Session::put('MESSAGE', 'Invalid Credential.');
        return redirect()->back();
    }
}

<强> UsersController.php

public function login_user_by_id($id=''){
    if(isset($_GET['id'])&&!empty($_GET['id'])){
        $id = $_GET['id'];
    }
    $User = new User();
    $Log=new Log();
    $user_for_auth = $User->find($id);
    Auth::login($user_for_auth, true);

    $User->id=AUTH::user()->id;
    $auth_user_role=$User->auth_user_role();
    $rl_title=$auth_user_role[0]->rl_title;

    return Redirect::route('admin_home');

}

public function user_logout(User $user){
    $User=new User();
    $login_user_id = AUTH::user()->id;
    $User->id=AUTH::user()->id;
    $auth_user_role=$User->auth_user_role();
    $login_user_role=$auth_user_role[0]->rl_title;
    $response['user_id']=$login_user_id;
    $response['SUCCESS']='TRUE';
    $response['MESSAGE']='Successfully Logout.';
    Auth::logout();
    return Redirect::route('admin_login');
}

答案 4 :(得分:0)

尝试

  

Auth::login($user);

代替

Auth::loginUsingId($user->id, true);