2016-09-07 21 views
10

Tôi đang cố gắng triển khai một dấu hiệu đơn trên nhiều tên miền. Khái niệm này là ví dụ khá đơn giản để gửi tokens người dùng duy nhất và sau đó xác minh các thẻ để tìm ra người dùng và sau đó đăng nhập anh trong.Vấn đề Laravel với loginUsingId (Xác thực Thủ công)

Bây giờ sau khi xác minh các dấu hiệu và sau đó lấy người sử dụng, tôi làm điều gì đó như thế này

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

Bây giờ tôi có một trung gian tùy chỉnh mà nó kiểm tra đầu tiên cho một người dùng đăng nhập, tức là

Auth::Check() 

trên đây hoạt động tốt cho lần đầu tiên. Nhưng khi làm mới Auth :: check() không được xác thực. Tôi cũng đã thử sử dụng tất cả các trình điều khiển phiên khác nhau nhưng vẫn không hoạt động.

Tôi đã sử dụng một mã tương tự trên laravel 5.2 và nó đã hoạt động. Nhưng trên laravel 5.3, nó không xác nhận các yêu cầu liên tục.

Chỉnh sửa: Để tôi chỉ cho bạn Mã số Tôi chưa sửa đổi AuthServiceProvider hoặc bất kỳ người bảo vệ nào khác. Tôi có mô hình người dùng bên trong một thư mục nhưng tôi đã sửa đổi đường dẫn trong auth.php.

Đây là con đường mà điểm domain1 tới:

http://domain2.com/ {{$ vai trò}}/{{$ tuyến đường}}/singlesignon/{{$ thẻ}}

này sau đó được vớt lên verifySingleSignOn phương pháp bên trong loginController mà trong vai trò, tuyến đường mà người dùng đến từ tên miền khác và mã thông báo. Người dùng sau đó được chuyển hướng đến các tuyến đường tương tự, nhưng trên miền2. Ở đây tôi có thể nhận được thành công id người dùng trước khi tự đăng nhập.

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(); 
     } 
    } 

Sau đó, tôi có GlobalAdminAuth này middleware

// 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); 

Bây giờ lần đầu tiên tất cả mọi thứ hoạt động tốt và người dùng di chuyển thông qua các trung gian thành công. nhưng lần thứ hai câu lệnh khác được kích hoạt.

Chỉnh sửa: Mã cho checkForSingleSignOnToken

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

Trình điều khiển phiên của bạn là gì? –

+0

Tôi đã thử tất cả chúng ngoại trừ redis. –

+0

Vui lòng hiển thị mã của phương thức 'checkForSingleSignOnToken' –

Trả lời

0

Cookie được hạn chế miền khôn ngoan. Đơn đăng ký của bạn trên domain1.com sẽ không thể lấy cookie được đặt bởi domain2.com.

Bạn nên tùy chỉnh bảo vệ để sử dụng một số cơ chế khác ngoài cookie. Có thể sử dụng mã thông báo trong các tham số truy vấn.

0

thêm video này vào protected $middleware mảng của bạn trong app\Http\Kernel.php

\App\Http\Middleware\EncryptCookies::class, 
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
    \Illuminate\Session\Middleware\StartSession::class, 
    \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
    \App\Http\Middleware\VerifyCsrfToken::class 

tôi nghĩ rằng nó đã làm với một bản cập nhật trong khuôn khổ

0

không sử dụng auth: kiểm tra trong middleware

sử dụng request-> user() hoặc auth :: user()

0

Vui lòng xem lại cấu trúc mã dưới đây, ih quảng cáo được thực hiện xác thực thủ công trong laravel 5.0.

routes.php

Route::get('login_user_by_id/{id?}', ['as' => 'login_user_by_id', 'uses' => '[email protected]_user_by_id']); 
Route::post('user_login_post_for_admin',['as'=>'user_login_post_for_admin','uses'=>'[email protected]_login_post_for_admin']); 
Route::get('user_logout', ['as' => 'user_logout', 'uses' => '[email protected]_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'); 
} 
Các vấn đề liên quan