viduc / casbundle
为 Symfony 应用程序提供的 CAS 认证包
Requires
- php: >=7.2.5
- jasig/phpcas: ^1.3||^1.4
- symfony/framework-bundle: ^5.1||^5.2
Requires (Dev)
- phpunit/phpunit: ^8.5|^9.0
- roave/security-advisories: dev-master
- symfony/browser-kit: 3.4.42
This package is auto-updated.
Last update: 2024-09-15 19:10:33 UTC
README
CasBundle 是一个用于 Symfony 5 的包,它允许通过 SSO (CAS) 服务器(单点登录)进行简单认证。它还包含一个用户切换系统,以便在不了解用户凭据的情况下接管用户账户(“作为”功能)。此外,还可以为应用程序的开发阶段创建角色。
作者
状态
许可证
版权 [2020] [Tristan FLeury]
遵循 Apache 许可证 2.0 版(“许可证”);除非符合许可证规定或书面同意,否则不得使用此文件。您可以在以下位置获取许可证副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”基础提供,不提供任何明示或暗示的保证或条件。有关许可证的具体语言、许可和限制,请参阅许可证。
预先要求
此包与最低 symfony 5.1 版本和 php 7.2 版本兼容。需要 jasig/phpcas 依赖项,并将与库一起安装。从 1.1.0 版本开始,CAS 认证器与新的 symfony 系统兼容。如果您想使用 authenticator guard,则必须使用旧版本。从 1.1.0 版本开始已删除角色,将提供另一个包来实现此功能。
安装
通过 composer 安装此包
composer require viduc/casbundle
配置
-
配置 SSO(CAS)部分
-
在您的应用程序的 config/packages 目录中创建一个名为 cas.yaml 的文件
-
将以下两行添加到您的 cas.yaml 文件中
cas: host: '%env(CAS_HOST)%'
-
编辑 .env 文件并添加以下参数
CAS_HOST=mon.serveur.cas.fr
或 mon.serveur.cas.fr 是您的 SSO 服务器 URL
-
User 类: 默认情况下,包配置为使用 CasUser.php 类。然而,建议创建自己的用户类,通过扩展 CasUser.php 类(至少实现 UserInterface 接口)。如果您没有现有的类,可以在 Security 目录中创建一个类(例如,创建 Security 目录,如果尚不存在),并扩展 CasUser.php 类。
<?php namespace App\Security; use Viduc\CasBundle\Security\CasUser; class User extends CasUser { }
-
UserProvider 类: UserProvider 类用于在认证成功时加载用户对象。默认情况下,系统将使用 CasUser 类,并填写 CAS 获取的登录信息,并分配 roles user 和 entantque。要实现用户加载逻辑,您必须在 src (App) 中的 Security 目录中创建一个类(例如,UserPersoProvider.php),并扩展 Viduc/CasBundle/Security/UserProvider.php 类。然后,您需要重写
chargerUtilisateurParSonLogin($username)
方法。此方法接受由 CAS 返回的 username(登录名)作为参数,并必须返回一个用户对象(至少实现 UserInterface)。<?php namespace App\Security; use Viduc\CasBundle\Security\UserProvider; use App\Security\User; class UserPersoProvider extends UserProvider { public function chargerUtilisateurParSonLogin($username) { $user = new User(); $user->setUsername($username); $user->setRoles(['ROLE_USER']); return $user; } }
在这个方法中,您将实现自己的用户加载逻辑。您可以从数据库、外部存储库(如ldap)或任何其他系统中获取用户。如果您想抛出异常(例如,如果用户由您的SSO授权但不在应用程序中已知),请优先使用ETQ_NonAutoriseException或ETQ_UtilisateurNonTrouveException异常(使用Viduc\CasBundle\Exception\ETQ_NonAutoriseException;或使用Viduc\CasBundle\Exception\ETQ_UtilisateurNonTrouveException;)。您还必须覆盖'supportsClass($class)'方法,以便在UserProvider中接受您的新用户类。因此,将此方法添加到该文件中。
/** * Tells Symfony to use this provider for this User class. */ public function supportsClass($class) { return User::class === $class; }
在这个例子中,我们假设您的类名为User,如果需要,请修改类名。
-
Security.yaml:现在您可以修改security.yaml文件,以考虑用户身份验证和加载。打开文件并按以下方式修改:
security: role_hierarchy: ROLE_ADMIN: [ROLE_USER] providers: viduc_provider: id: Viduc\CasBundle\Security\UserProvider firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false main: lazy: true provider: app_user_provider logout: ~ custom_authenticator: - viduc.cas_authenticator access_control: - { path: ^/test, roles: ROLE_USER }
修改提供程序以提供之前创建的类。
providers: viduc_provider: id: App\Security\UserPersoProvider
-
测试:如果您想快速测试CAS的身份验证功能,请将此行添加到您的config目录的routes.yaml文件中:
_cas: resource: "@CasBundle/Resources/config/routes.yaml"
然后访问您应用程序的URL后跟"/cas"(例如:http://monapli/cas)。您将被自动重定向到您的SSO服务器进行身份验证。登录后,您将被重定向到Bundle的一个页面(登录作为)。
-
-
“作为”部分的配置
“作为”功能允许控制您应用程序中已知的一个用户账户。它通常保留给受限用户组(应用程序的管理员或管理员)用于测试或验证用户报告的bug或异常。将访问此功能的用户必须有'ROLE_ENTANTQUE'角色。
为了使用此功能,您首先需要定义一个用户登录表,您可以控制。您可以在主控制器、UserProvider或事件监听器中生成此表。原则是创建一个包含Users(CasUser或您自己的User类)的表,至少包含他们的用户名(登录名)。然后,将此表加载到名为'enTantQue.users'的会话变量中。您可以参考Bundle的CasController来获取示例。
然后,您需要定义一个链接以访问此功能,该链接的路径为'enTantQue'。
<a href="{{ path('enTantQue') }}">en tant que</a>
此链接将打开一个页面,允许选择一个用户来接管其角色或返回到原始用户。
选择登录名进行登录时,系统将再次通过您之前在UserProvider中定义的方法来加载请求的用户。因此,加载的账户将包含该人的所有信息,包括其角色。以下是一个可能的控制器和视图示例,该控制器和视图可以接收对功能的访问:
<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; use App\Security\User; use Symfony\Component\HttpFoundation\Session\SessionInterface; class TestController extends AbstractController { public function __construct(SessionInterface $session) { $user1 = new User(); $user1->setUsername('test1'); $user1->setRoles(['ROLE_USER']); $user2 = new User(); $user2->setUsername('test2'); $user2->setRoles(['ROLE_USER']); $users[] = $user1; $users[] = $user2; $session = $session; $session->set('enTantQue.users', $users); } /** * @Route("/test", name="test") */ public function index() { return $this->render('test/index.html.twig', [ 'controller_name' => 'TestController', ]); } }
{% extends 'base.html.twig' %} {% block title %}Hello TestController!{% endblock %} {% block body %} <div class="example-wrapper"> <h1>Se connecter en tant que...</h1> <a href="{{ path('enTantQue') }}">en tant que</a> </div>
最后,如果您想修改作为功能的页面(twig),在您的应用程序的templates/bundles目录中创建一个名为CasBundle的目录(如果不存在,请创建)。然后创建一个名为'enTantQue.html.twig'的文件,并将您的视图逻辑放入其中。然后执行:
php /bin/console cache:clear
您的模板将替换Bundle的模板。您可以使用enTantqueRestore路径创建一个返回到调用会话的链接。
<a href="{{ path('enTantQueRestore') }}">Revenir à ma session</a>