viduc/casbundle

为 Symfony 应用程序提供的 CAS 认证包

安装: 580

依赖: 0

建议者: 0

安全: 0

星标: 1

关注者: 1

分支: 0

开放问题: 0

类型:symfony-bundle

v1.1.2 2021-11-12 20:24 UTC

This package is auto-updated.

Last update: 2024-09-15 19:10:33 UTC


README

CasBundle 是一个用于 Symfony 5 的包,它允许通过 SSO (CAS) 服务器(单点登录)进行简单认证。它还包含一个用户切换系统,以便在不了解用户凭据的情况下接管用户账户(“作为”功能)。此外,还可以为应用程序的开发阶段创建角色。

作者

Viduc Mail

状态

Latest Version on Packagist Software License Build Status Coverage Total Downloads

许可证

版权 [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)部分

    1. 在您的应用程序的 config/packages 目录中创建一个名为 cas.yaml 的文件

    2. 将以下两行添加到您的 cas.yaml 文件中

          cas:
            host: '%env(CAS_HOST)%'
    3. 编辑 .env 文件并添加以下参数

          CAS_HOST=mon.serveur.cas.fr
      

      或 mon.serveur.cas.fr 是您的 SSO 服务器 URL

    4. User 类: 默认情况下,包配置为使用 CasUser.php 类。然而,建议创建自己的用户类,通过扩展 CasUser.php 类(至少实现 UserInterface 接口)。如果您没有现有的类,可以在 Security 目录中创建一个类(例如,创建 Security 目录,如果尚不存在),并扩展 CasUser.php 类。

      <?php
      namespace App\Security;
      
      use Viduc\CasBundle\Security\CasUser;
      
      class User extends CasUser
      {
      
      }
    5. UserProvider 类: UserProvider 类用于在认证成功时加载用户对象。默认情况下,系统将使用 CasUser 类,并填写 CAS 获取的登录信息,并分配 roles userentantque。要实现用户加载逻辑,您必须在 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,如果需要,请修改类名。

    6. 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
    7. 测试:如果您想快速测试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>