标签/iu-cas

IU 的 CAS 认证类。

v1.0 2019-01-25 03:36 UTC

This package is auto-updated.

Last update: 2024-09-26 06:32:07 UTC


README

Travis-CI build status

IuCasAuthentication

一个与 IU 的 CAS 配合工作的 CAS 认证对象。使用 IU 的 CAS 并不复杂,UITS 甚至提供了一些 PHP 示例代码。此辅助类旨在使此过程更加简单。

请注意,此库不提供任何 授权(基于用户名的权限),仅提供 认证(验证用户的凭据)。

遵循 PSR-4 和 PSR-2 标准。需要 PHP >= 7.1。已测试 PHP v7.1 – v7.3。

安装

推荐的安装方法是使用 Composer

使用 Composer 安装

将以下内容添加到您的 composer.json 文件中

"tag/iu-cas": ">=1.0"

或者,安装 Composer 包

composer require tag/iu-cas

不使用 Composer 安装

下载 IuCasAuthentication 类,并在您的页面(或页面集合)上包含或引入它。

使用 IuCasAuthentication

  1. 创建一个新的认证对象。构造函数的所有参数都是可选的。

    • 第一个是 CAS 登录后应用程序应重定向到的 URL。必须在认证和验证步骤中相同。默认为当前 URL。
    • 第二个可选参数必须是 IU 的 CAS 应用程序代码之一。默认为 'IU'
    • 第三个可选参数是 PSR-3 日志记录器(如 Monolog)的引用。如果可用,用于记录远程错误。默认为 `null``。
  2. 调用 #authenticate()。可选参数可用于覆盖默认行为。

由于 CAS 预期应用程序在会话期间仅进行一次认证,因此 IuCasAuthentication 类将成功的认证存储在 $_SESSION 中,因此可以在每个页面上(或作为 Middleware)安全地使用它来测试认证。

如果用户名在 $_SESSION 中,则 #authenticate() 认为用户已成功认证,并且不会尝试与 CAS 进行检查。

最简单的方法

IuCasAuthentication 辅助类为您做所有工作。需要当前可写 $_SESSION

此代码需要在您希望受保护的每个页面上调用。

<?php
// File: any.php

$casHelper = new \IuCas\IuCasAuthentication();
$casHelper->authenticate(); // Default behavior is 401 (Unauthorized) and die on failure.
                            // Pass a callback if other behavior is desired; see documentation for other options

// Continue processing file as normal

// After authentication, user name is available
$userName = $casHelper->getUserName(); // Actually stored in $_SESSION

推荐方法

而不是依赖内置行为,传递显式的 回调函数 用于认证失败或成功。

两个回调函数是

  1. 失败时:默认设置为设置 "401 未授权" 头并 exit;
  2. 成功时:默认将 CAS 返回的用户名放入 $_SESSION 并返回。
$casHelper = new \IuCas\IuCasAuthentication();

$casHelper->authenticate(
        function () {
            http_response_code(401);     // Unauthorized
            header('Location: /public'); // Failure, go to page that doesn't require authentication
            exit;
        },
        function ($username) {
            // Success, store the user
            $casHelper->setUserName($success); // Sets to $_SESSION['CAS_USER']; key may be overridden via environment
        }
    );

手动管理登录和验证

尽管 #authenticate() 函数为您做了所有工作,但如果您愿意,您仍然可以手动管理认证过程。

$casHelper = new \IuCas\IuCasAuthentication();

if (!$casHelper->getUserName()) {

    if (!$casHelper->getCasTicket()) {
        header('Location: ' . $casHelper->getCasLoginUrl(), true, 303);
        exit;
    } else {
        $result = $casHelper->validate();
        if ($result) { // Success, logged in
            $_SESSION['username'] = $result;  // Unless environment variables are set, this value will not be seen by IuCasAuthentication
        } else { // Failure
            header("HTTP/1.1 401 Unauthorized");
            // Add optional redirect here
            exit;
        }
    }
}

// Continue processing file as normal

在应用程序的不同页面上的登录和验证示例

您可能可以使用此示例代码仅在特定的 URL 上实现 CAS 认证。而不是调用 #authenticate(),您可能做以下操作

<?php
// File: login.php

$appUrl = 'https:///login-validate'; // URL CAS should redirect to with the CAS ticket after login
$casHelper = new \IuCas\IuCasAuthentication($appUrl);

header('Location: ' . $casHelper->getCasLoginUrl(), true, 303);
exit;
<?php
// File: login-validate.php

// Remember, your application URL in validation must match the one passed in the authentication step
$appUrl = 'https:///login-validate';
$casHelper = new \IuCas\IuCasAuthentication($appUrl);

$result = $casHelper->validate();

if ($result) {
    // Success, logged in
    $_SESSION['username'] = $result;
    header('Location: /', true, 303);
} else {
    // Failure; Redirect to logout to clear session
    header('Location: /logout', true, 303);
}

exit;

Slim 框架示例

以下代码与 Slim 框架 兼容。此示例还使用了 PSR-3 记录器和匿名回调函数。将登录功能实现为中间件会更好,但此示例突出了 IuCasAuthentication 辅助器的某些功能。

$app->get('/login', function (Request $request, Response $response) {
    $appUrl = 'https:///login-validate';
    $casHelper = new \IuCas\IuCasAuthentication($appUrl);
    
    return $response->withRedirect($casHelper->getCasLoginUrl(), 303);
});

$app->get('/login-validate', function (Request $request, Response $response) {
    
    $appUrl = 'https:///login-validate'; // URL CAS has redirected to with the CAS ticket after login
                                                  // Must match the one passed to CAS in the authentication step
    $casHelper = new \IuCas\IuCasAuthentication($appUrl);
    $casHelper->setLogger($this->get('logger'));
    
    return $casHelper->authenticate(
        function () use (&$response) {
            return $response->withRedirect('/logout', 401); // Failure, go to page that doesn't require authentication
        },
        function ($username) use (&$response) {
            // Do other session-setting stuff here, if desired
            return $response->withRedirect('/home', 303); // Success, logged in
        }
    );
});

日志记录

您可以将可选的 PSR-3 记录器作为构造函数的第三个参数传递。如果验证步骤失败,详细信息将发送到记录器(如果可用)。

环境变量

在大多数情况下,不需要创建环境变量来修改此库与 IU CAS 使用的默认行为。一切应该已经配置完成,无需额外配置。但是,如果您想更改默认行为,则有一些环境变量可供选择。

PHP 的最佳实践 是将重要的配置选项放在环境变量中,例如在虚拟主机配置(例如,httpd.conf.htacess)中或 .env 文件中。通过 Composer 可使用 几个 来帮助加载 .env 文件。

默认包含的三个必要 URL(登录、验证、注销),如 https://kb.iu.edu/d/atfc 所述,但可以通过以下环境变量来覆盖。

  • CAS_LOGIN_URL 默认为 'https://cas.iu.edu/cas/login'
  • CAS_VALIDATION_URL 默认为 'https://cas.iu.edu/cas/validate'
  • CAS_LOGOUT_URL 默认为 'https://cas.iu.edu/cas/logout'

使用了两个额外的环境变量

  • CAS_SESSION_VAR 默认为 'CAS_USER',因此活动用户的用户名在 $_SESSION[getenv('CAS_SESSION_VAR')] 处可用。当前值由 #getSessionVar() 返回。会话变量由 #getUserName()#setUserName() 使用,这些函数反过来又由 #logout()#authenticate() 的默认成功处理程序使用,以便将 CAS 的用户名响应存储在 $_SESSION 中。
  • CAS_TIMEOUT 设置对 CAS 验证和注销服务的服务请求的超时时间。默认为 5

如果需要在会话变量之外的地方存储身份验证状态,则最好使用 #authenticate() 的回调变体。

这些环境变量的默认值也可以作为类常量提供。例如,IuCasAuthentication::CAS_VALIDATION_URL。 (异常:超时常量命名为 IuCasAuthentication::CAS_DEFAULT_TIMEOUT。)

发布历史

  • v1.0
    • 稳定
    • PHP 7.1 的最低要求
    • 简化代码,回调现在是与 #authenticate() 交互的唯一方式,这与 v0.3 不兼容
    • 代码通过 PSR-2PHP_CodeSniffer 检查
    • 使用 phpstan 在最大级别进行静态分析
  • v0.3
    • 稳定
    • 支持 PHP 5.6+ 的最后一个完整版本