首页 > 编程语言 >php中如何实现SSO单点登录

php中如何实现SSO单点登录

时间:2022-11-25 16:07:00浏览次数:43  
标签:username 单点 登录 GET sso SSO SESSION php


什么是单点登录SSO(Single Sign-On)

SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。

本文以简化的PHP代码案例来让大家抛开理念,更简单认识SSO的应用。

我这边简单配置了3个域名及对应的文件夹

├─A 文件夹 a.com 应用系统

│ ├─index.php

│ └─login.php

├─B 文件夹 b.com 应用系统

│ ├─index.php

│ └─login.php

├─C 文件夹 c.com 登录系统

│ └─login.php

A和B都是业务系统,C是专门用来登录的系统,都不在一个域。

当然,这里把它们抽离开来只是简化抽象便于理解。

下面看下 A 服务器的文件(服务器B仅uri与A不同):

-------------------------------------index.php-------------------------------------

-------------------------------------login.php-------------------------------------



<?php
// 已在本站登录,直接返回
if (isset($_COOKIE['userInfo'])) {
    session_start();
    $username = $_SESSION['username'];
    echo $username ."已登录";
    die;
}
// 由登陆中心登录成功返回过来的,处理并返回用户操作
if (isset($_GET['action']) && $_GET['action'] == 'sso') {
    setcookie('userInfo',$_GET['userInfo']);
    session_start();
    $username = $_SESSION['username'];
    echo $username ."已授权登录";
    die;
}
// 未登录,跳转至登陆中心
if (!isset($_COOKIE['userInfo'])) {
    header('Location: http://appdev.aigupiao.com/sso.php?uri='.$_SERVER['host']."&username=zhangsan");
    die;
}

下面看下登录系统 C 的代码:

-------------------------------------login.php-------------------------------------



<?php
//已在登陆中心登录,直接返回登录站点
        session_start();
if (isset($_SESSION['username'])) {
        header('Location: http://'.$_GET['uri'].'/sso.php?action=sso&username='.$_SESSION['username']);
        die;
}

//登录处理并返回
if (isset($_GET['username'])) {
        $_SESSION['username'] = $_GET['username'];
        $_SESSION['token'] = rand(100000,999999);
        header('Location: http://'.$_GET['uri'].'/sso.php?action=sso&username='.$_GET['username']."&token=".$_SESSION['token']);
        die;
}

登出

只需要清除本地Cookie,调用SSO站点接口清除登陆缓存的状态即可实现登出。

以上就是一个简单的SSO单点登录系统方案。当然实际应用中,会有redis...来存储公共的登录数据,每个业务系统会有自己的权限验证。


标签:username,单点,登录,GET,sso,SSO,SESSION,php
From: https://blog.51cto.com/u_6353447/5886818

相关文章

  • php8世界上最好的语言新版本特性
    本文只会讲述新特性的一些关键点,更详细的介绍请认真阅读官方文档。01UnionTypes(联合类型)说明一点,从PHP7开始,支持下面这样的语法: functionsum(int$a,int$b):int......
  • 试验解析抖音无水印视频【PHP版】
    试验了网上很多抖音解析无水印视频的API,发现很多都是不稳定的。连今天要分享的这个api也是,总是那么不稳定。不过还好,总算是解析出了无水印视频。很多东西还是要自己调试一下......
  • php中如何优雅的写复杂if-else
    提前return优化逻辑结构,让正常流程走主干,非正常流程提前return,去除不必要的else优化前$a=1;$b=2;$c=3;if($a==1){if($b==2){if($c==3){......
  • PHP7带来的重大变革
    PHP7带来的新东西1.类型的声明。可以使用字符串(string),整数(int),浮点数(float),以及布尔值(bool),来声明函数的参数类型与函数返回值。declare(strict_types=1);fun......
  • 前后端分离 Ueditor + PHP 实现阿里云Oss上传
    首先去百度下载UeditorPHP(一般都是UTF-8版本)的当然首先要composer这样滴: "require":{"aliyuncs/oss-sdk-php":"~2.0.0",},解压后结构如下:第一步:创建OssInUe......
  • PHP的生成器yield
    官方解释yieldyield生成器是php5.5之后出现的,官方文档这样解释:yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现Iterator接口的方式,性能开销和复杂性大......
  • PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作
    /** *PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作 *     A *    B   C *  D  E F   G......
  • PHP消息队列如何处理订单和配送
    在项目开发者经常会遇到『给用户群发短信』、『订单系统有大量的日志需要记录』或者在秒杀业务的时候服务器无法承受瞬间并发的压力。这种情况下,我们怎么保证系统正常有效的......
  • PHP7实现多进程
    我们都知道PHP是单进程执行的,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli模式下处理大量数据或运行后台DEM......
  • PHP7的内核CGI与FastCGI
    CGI:是WebServer与WebApplication之间数据交换的一种协议。FastCGI:同CGI,是一种通信协议,但比CGI在效率上做了一些优化。PHP-CGI:是PHP(WebApplication)对WebSe......