php实现的SSO单点登录系统接入功能示例分析

yipeiwu_com7年前PHP代码库

本文实例讲述了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 跟这不太一样,但基本原理过程差不多。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP网络编程技巧总结》、《php curl用法总结》、《php socket用法总结》、《php正则表达式用法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP数学运算技巧总结》、《php面向对象程序设计入门教程》、《PHP数据结构与算法教程》、《php程序设计算法总结》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

相关文章

批量修改RAR文件注释的php代码

我们打开WINRAR的帮助文件,帮助文件中提到了在命令行模式下修改RAR文件注释及添加压缩文档的两个参数分别为A\C,WINRAR的说明文件如下: 从当前文件夹添加全部 *.hlp 文件...

php array_key_exists() 与 isset() 的区别

php array_key_exists用于检查某个键名是否存在于数组中,而isset也可以用于检测数组中某个键名是否存在,那么二者有什么区别呢?本文章将为大家讲解array_key_e...

php 进阶:实现无限分类第1/4页

1.分析  我们在用 php 制作网站时,分类是很重要的,在分类下面又再分类这第二个分类称为次分类,而现在大多数网站分类只分到第三类:  第一分类...

基于php冒泡排序算法的深入理解

交换排序的基本思想:两两比较待排序的数据,如果发生逆序,则交换之,直到全部数据都排好序为止。•冒泡排序的基本思想:1.从后往前,扫描所有的数据,如果相邻的两个数发生逆序,则互...

PHP实现图片自动清理的方法

本文实例讲述了PHP实现图片自动清理的方法。分享给大家供大家参考。具体实现方法如下: <?php /** * 图片清理计划程序,删除文件下两周没有访问的文件 */...