ome*_*ooq 13 laravel laravel-5 laravel-5.3
我正在尝试在多个域上实现单点登录.这个概念非常简单,即发送唯一的用户令牌,然后验证这些令牌以找到用户,然后将其登录.
现在在验证令牌然后抓住用户之后,我做了类似的事情
$loggedInUser = Auth::loginUsingId($user->id, true);
Run Code Online (Sandbox Code Playgroud)
现在我有一个自定义中间件,它首先检查登录用户,即
Auth::Check()
Run Code Online (Sandbox Code Playgroud)
以上工作首次正常.但是刷新时Auth :: check()没有经过验证.我也尝试使用所有不同的会话驱动程序,但仍然无法正常工作.
我在laravel 5.2上使用了类似的代码,它确实有效.但是在laravel 5.3上它没有验证持久性请求.
编辑:让我告诉你我的代码 我没有修改AuthServiceProvider或任何其他警卫.我在目录中有用户模型,但我修改了auth.php中的路径.
这是domain1指向的路线:
http://domain2.com/ {{$ role}}/{{$ route}}/singlesignon/{{$ token}}
然后通过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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有这个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);
Run Code Online (Sandbox Code Playgroud)
现在第一次一切正常,用户成功地通过中间件.但是第二次触发了else语句.
编辑:checkForSingleSignOnToken的代码
public function checkForSingleSignOnToken($token, $columns = array('*'))
{
return User::where('single_signon', $token)->first($columns);
}
Run Code Online (Sandbox Code Playgroud)
小智 6
尝试
Auth::login($user);
代替
Auth::loginUsingId($user->id, true);
Run Code Online (Sandbox Code Playgroud)
Cookie 受域限制。您的应用程序domain1.com将无法获取由 设定的cookie domain2.com。
您应该自定义防护以使用 cookie 之外的其他机制。也许在查询参数中使用令牌。
| 归档时间: |
|
| 查看次数: |
4464 次 |
| 最近记录: |