使用laravel手动认证方法实现类似SSO单点登录功能


前提:系统A和系统B(各自都需要登录),在A系统中会进行跳转到B系统的操作,要求在进入B系统操作的时候免去在登录界面登录的过程。并且系统A的用户都已经同步到系统B。

说明:这种要求解决办法其实就是我们所说的单点登录SSO,但是在没有数据中心(第三方)的前提下要实现该功能就要换一种思路了。
解决办法思路:在系统A向系统B跳转的时候,附带上系统A的用户信息(accountId),然后访问系统B中的相应接口,在接口中执行登陆,将登陆成功的状态写入session和客户端的cookie。

// 获取URL传过来的accountId,这一步往往都用一个接口认证的过程,此处省略
$accountId=$request->accountId;
// 根据accountId获取系统B中的用户信息
$user=DB::table('users')->where('platform_id',$accountId)->first();

//检查用户登录状态,如果已登录,返回到首页,否则执行登陆,然后返回到首页,使用laravel手动认证方式进行认证
if(Auth::loginUsingId($user->id)) {
//认证通过...
//附带cookie信息
$id=session()->getId();   // 获取sessionId
$name=session()->getName();   // 获取cookie名称
$_pre=session()->previousUrl();    // 获取_previous
$handler=session()->getHandler();    // 获取handler
$store= newStore($name,$handler,$id)// 创建session的Store对象,保存session
$store->start();
$store->setPreviousUrl($_pre);
$attr=session()->all();
foreach($attras$k=>$v) {
$store->put($k,$v);
}
$store->save();
$request->setLaravelSession($store);   // 将session保存到request对象
$secret=encrypt($id);   // 客户端cookie的值
returnredirect()->intended($this->redirectPath())->cookie('laravel_session',$secret,time()+1800);   //页面渲染。 
// $this->redirectPath()这个可以直接写死(例如"admin/businesses"),也可以这样写,但是需要引入这个trait:use\Illuminate\Foundation\Auth\AuthenticatesUsers;并在当前控制器中,添加如下方法:
public functionredirectTo()
{
// 这里往往会进行逻辑处理,用于导向不同的界面
    return url('admin/assessments');
}

    



点赞 取消点赞 收藏 取消收藏

<< 上一篇: PHP写个网页小工具来监控你的加密币

>> 下一篇: 区块链 EOS RPC API PHP SDK