zoukankan      html  css  js  c++  java
  • 用PHP实现SSO单点登录系统接入功能与分析

    SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一,下面我们来看看吧。

    简单讲一下 SSO 单点登录系统的接入的原理,前提是系统本身有完善的用户认证功能,即基本的用户登录功能,那实现起来就很方便了。

    SSO 登录请求接口往往是接口加上一个回调地址,访问这个地址会跳转到回调地址并带上一个 ticket 参数,拿着这个 ticket 参数再请求接口可以获取到用户信息,如果存在用户则自动登录,不存在就新增用户并登录。

    比如这个 SSO 模型实现了两个方法,一个是获取接口 url,一个是凭 ticket 获取用户信息:

    interface SSOLogin
    {
      /**
       * 获取登录用户信息
       * @param $ticket
       * @return mixed
       */
      public function getInfoFromTicket($ticket);
      /**
       * 单点登录授权地址
       * @return mixed
       */
      public function getAuthUrl();
    }

    再来看看控制器的主要方法,比如回调地址是跳转到控制器 http://www.example.com/sso/check?ticket=xxxx,代码如下

    /**
     * 检测是否单点登录
     * @return bool|string
     */
    public function actionCheck()
    {
      $ticket = Yii::$app->getRequest()->get('ticket');
      if (!$ticket) {
        return $this->renderAuthError('请先授权', sprintf('<a href="%s">点击登录单点登录系统</a>', SSOlogin::getInstance()->getAuthUrl()));
      }
    
      $userInfo = SSOlogin::getInstance()->getInfoFromTicket($ticket);
      if (empty($userInfo['username'])) {
        return $this->renderAuthError('请先授权', sprintf('<a href="%s">点击登录单点登录系统</a>', SSOlogin::getInstance()->getAuthUrl()));
      }
    
      $username = $this->getUserName($userInfo['username']);
      $user = User::find()->canLogin()->username($username)->one();
    
      if (!$user) {
        $newUser = [];
        $newUser['username'] = $userInfo['username'];
        $newUser['email'] = $this->getUserName($userInfo['username']);
        $newUser['role'] = User::ROLE_DEV;
        $newUser['is_email_verified'] = 1;
        $newUser['realname'] = $userInfo['truename'];
        $user = $this->addUser($newUser);
      }
    
      $isLogin = Yii::$app->user->login($user, 3600 * 24 * 30);
      if ($isLogin) {
        $this->redirect('/task/index');
      }
    
      return true;
    }

    大概看看这个控制器逻辑就明白了。SSO 接口起到的作用就是获取用户信息,拿这个用户信息跟系统用户表对比,存在用户则进行登录,不存在创建用户并登录。

    这是一个内部的单点系统,集成到后台,可能其他的 SSO 跟这不太一样,但基本原理过程差不多。

  • 相关阅读:
    我又来定计划了~2015-8至年底
    Spark官方文档中推荐的硬件配置
    java 多线程之:sleep() 方法
    Referrer Policy 介绍
    js 操作 cookie
    顶级域名和子级域名之间的cookie共享和相互修改、删除
    关于 Cookie-free Domains (为什么将静态图片,js,css存放到单独的域名?)
    cookie 知识点
    java 多线程之:yield() 方法
    java 多线程之:wait()、notify()、notifyAll()等方法
  • 原文地址:https://www.cnblogs.com/zxf100/p/14145008.html
Copyright © 2011-2022 走看看