标签 / iu-cas
IU 的 CAS 认证类。
Requires
- php: >=7.1.0
Requires (Dev)
- phpstan/phpstan: >=0.11.1
- phpunit/php-code-coverage: *
- phpunit/phpunit: ^7
- squizlabs/php_codesniffer: 3.*
This package is auto-updated.
Last update: 2024-09-26 06:32:07 UTC
README
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
-
创建一个新的认证对象。构造函数的所有参数都是可选的。
- 第一个是 CAS 登录后应用程序应重定向到的 URL。必须在认证和验证步骤中相同。默认为当前 URL。
- 第二个可选参数必须是 IU 的 CAS 应用程序代码之一。默认为
'IU'
。 - 第三个可选参数是 PSR-3 日志记录器(如 Monolog)的引用。如果可用,用于记录远程错误。默认为 `null``。
-
调用
#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
推荐方法
而不是依赖内置行为,传递显式的 回调函数 用于认证失败或成功。
两个回调函数是
- 失败时:默认设置为设置
"401 未授权"
头并exit;
。 - 成功时:默认将 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-2 和 PHP_CodeSniffer 检查
- 使用 phpstan 在最大级别进行静态分析
- v0.3
- 稳定
- 支持 PHP 5.6+ 的最后一个完整版本