我正在尝试在多个域上实施单点登录。这个概念非常简单,即发送唯一的用户令牌,然后验证这些令牌以找到用户然后登录。
现在在验证令牌然后抓住用户之后,我做了类似的事情
$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);
}
答案 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);