spsostrov/libsso

SPŠ Ostrov 学校的 SSO 库

v1.4.1 2024-06-21 08:27 UTC

This package is auto-updated.

Last update: 2024-09-21 08:59:58 UTC


README

英文文档也可用

这是一个用于与 SPŠ Ostrov 学校 SSO 系统通信的库仓库。该库主要面向 SPŠ Ostrov 学生及其项目,但也适用于任何需要与该 SSO 系统协作的项目。

安装

手动添加到项目

  1. 将此仓库的内容(或至少其子目录 lib/)复制到您的项目目录结构中。
  2. 确保在每次运行 PHP 脚本时都加载文件 lib/libsso.php
  3. 作为替代,只要在处理 SSO 的脚本中加载 lib/libsso.php 即可,但这种方法不建议使用。

通过 Composer 添加

composer require spsostrov/libsso

规范

还提供了整个 SSO 协议规范的英文版本。

文档

该库在 SPSOstrov\SSO 命名空间中提供几个类。提供库功能的主要类是 SSO 类。即其完全限定名称为 SPSOstrov\SSO\SSO。但是,如果通过 lib/libsso.php 加载库,还会创建到根命名空间的别名,因此可以在根(空)命名空间中使用相应的类。

SPSOstrov\SSO\SSO -> SSO
SPSOstrov\SSO\SSOUser -> SSOUser

如果通过 composer 加载库,则不会自动启用类别名,但可以通过命令启用它们

SPSOstrov\SSO\SSO::enableAliases();

如果要在加载 lib/libsso.php 的同时不使用根命名空间的别名,只需在加载相关文件之前定义常量 SPSOSTROV_SSO_NO_ALIASES

define("SPSOSTROV_SSO_NO_ALIASES", true);
require_once $ssoLibDir . "/lib/libsso.php";

也可以简单地使用 use 指令在不使用别名的情况下工作,遵循 PHP 中命名空间的标准使用规则

use SPSOstrov\SSO\SSO;
use SPSOstrov\SSO\SSOUser;

基本使用

基本使用示例在 testapp 目录中的测试应用程序中。

以下代码将启动整个 SSO 流程

$sso = new SSO();
$user = $sso->doLogin();

$sso->doLogin() 函数将返回代表相应已登录用户的 SSOUser 类对象,或者如果无法找到已登录用户,则返回 null

注意:由于在调用 $sso->doLogin() 方法之前执行的任何代码都将执行两次(首先是在重定向到 SSO 服务器之前,然后是在从 SSO 服务器重定向回应用程序之后),因此必须在脚本执行的最开始调用 $sso->doLogin() 方法。因此,在调用 $sso->doLogin() 方法之前调用的代码不应有任何副作用,也不应向标准输出打印任何内容(例如,使用 echo 命令)。

无对象访问

该方法与 $sso->doLogin() 的工作方式相同,但它不会将已登录用户作为 SSOUser 类的实例返回,而是作为关联数组返回。

$sso->doLoginAsArray();

访问登录过程的部分

在此情况下,正确调用 $sso->doLogin() 方法的正确性取决于许多可能不总是满足的条件。因此,还提供了一些只启动流程部分的方法

以下方法将仅执行重定向到 SSO 服务器(1.阶段授权)的操作,重定向回的地址为 $backUrl

$sso->doRedirect($backUrl);

$backUrl 中可以使用以下选项

$backUrl = null; //bude použito url skriptu, který se právě provádí
$backUrl = "https://moje.aplikace.cz/sso"; //plné url
$backUrl = "/cesta/k/sso"; //absolutní cesta na aktuálním serveru
$backUrl = "sso.php"; //relativní cesta vůči právě prováděnému skriptu

以下调用将执行授权的第二阶段

$sso->getLoginCredentials($token, $backUrl);

kde $token可以是null(然后从GET参数中读取)或者可以是一个具体的字符串。$backUrl需要填写与第一阶段(SSO重定向)相同的值,否则第二阶段将失败。

以下方法返回第一阶段的重定向URL,如果应用程序想要自行实现重定向

$redirectUrl = $sso->getRedirectUrl($backUrl);

SSOUser类接口

  • 登录:$user->getLogin()
  • 全名:$user->getName()
  • 电子邮件:$user->getEmail()
  • 组名:$user->getGroupName()
  • 组:$user->getGroups()
  • 检查用户是否在组中的测试:$user->hasGroup("ucitele")
  • 认证方式:$user->getAuthBy()
  • OU简单:$user->getOUSimple()
  • OU名称:$user->getOUName()
  • 测试用户是否是教师:$user->isTeacher()
  • 测试用户是否是学生:$user->isStudent()
  • 班级:$user->getClass()(仅针对学生,对于非学生总是返回null
  • 研究领域:$user->getFieldOfStudy()(仅针对学生,对于非学生总是返回null
  • 入学年份:$user->getStudyEntryYear()(仅针对学生,对于非学生总是返回null
  • 将整个用户打印为HTML:$user->prettyPrint()
  • 将用户转换为关联数组:$user->asArray()