viduc/casbundle 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

viduc/casbundle

Composer 安装命令:

composer require viduc/casbundle

包简介

bundle d'authentification cas pour les applications symfony

关键字:

README 文档

README

CasBundle est un bundle pour Symfony 5. Il permet de s'authentifié via un serveur SSO (cas) de façon très simple. Il embarque également un système de switch utilisateur afin de pouvoir prendre possession d'un compte utilisateur sans connaitre ses identifiants (fonctionnalité 'EnTantQue'). Il est également aussi possible de créer des personas pour les phases de développement de votre application.

AUTEUR

Viduc Mail

STATUT

Latest Version on Packagist Software License Build Status Coverage Total Downloads

LICENSE

Copyright [2020] [Tristan FLeury]

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

PREREQUIS

Ce bundle fonctionne avec une version minimale de symfony 5.1 et une version de php 7.2. La dépendance jasig/phpcas est nécessaire et sera installée avec la librairie. A partir de la version 1.1.0 le cas authenticator fonctionne avec le nouveau système de symfony. Si vous souhaitez utilisez l'autenticator guard vous devez utiliser les versions précédentes. Les personnas ont été supprimés avec la version 1.1.0, un autre bundle sera disponible pour cette fonctionnalité.

INSTALLATION

L'installation du bundle se fait via composer:

composer require viduc/casbundle

CONFIGURATION

  • Configuration de la partie SSO (CAS):

    1. créez un fichier cas.yaml dans le dossier config/packages de votre application

    2. ajoutez ces deux lignes à votre fichier cas.yaml:

          cas:
            host: '%env(CAS_HOST)%'
    3. éditez le fichier .env et ajouter le paramètre suivant:

          CAS_HOST=mon.serveur.cas.fr
      

      ou mon.serveur.cas.fr est l'url de votre serveur sso

    4. Class User: par défaut le bundle est configuré pour utiliser sa class CasUser.php. Il est cependant conseillé de créer votre propre class utilisateur en étendant la class CasUser.php (ou au minimum en implémentatnt l'interface UserInterface). Si vous n'avez pas de class déjà existante, créez votre class dans le dosser Security par exemple (créer le dossier s'il n'existe pas) et étendez la class CasUser.php:

      <?php
      namespace App\Security;
      
      use Viduc\CasBundle\Security\CasUser;
      
      class User extends CasUser
      {
      
      }
    5. Class UserProvider: la class UserProvider sert à charger l'objet utilisateur lorsque l'authentification est réussie. Par défaut le système utilisera la class CasUser en renseignant le login récupéré par le cas et en attribuant les roles user et entantque. Pour implémenter votre logique de chargement d'un utilisateur, vous devez créer une class (par ex: UserPersoProvider.php) dans le dossier Security (créer le dossier s'il n'existe pas) situé dans src (App). Cette class doit étendre la class Viduc/CasBundle/Security/UserProvider.php. Vous devrez ensuite surcharger la méthode: chargerUtilisateurParSonLogin($username) Cette méthode prend en paramètre le username (login) renvoyer par le cas et doit retourner un objet utilisateur (implémentant au minimum 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;
          }
      }

      C'est dans cette méthode que vous implémenterez votre propre logique de chargement utilisateur. Vous pouvez récupérer votre utilisateur depuis votre base de données, depuis un référentiel externe (ldap) ou tout autre système. Si vous souhaitez lever une exception (par exemple si l'utilisateur est autorisé par votre SSO mais n'est pas connu de l'application), utilisez de préférence les exceptions ETQ_NonAutoriseException ou ETQ_UtilisateurNonTrouveException (use Viduc\CasBundle\Exception\ETQ_NonAutoriseException; ou use Viduc\CasBundle\Exception\ETQ_UtilisateurNonTrouveException;). Vous devez également surcharger la méthode* 'supportsClass($class)'* pour accepter votre nouvelle class utilisateur dans le UserProvider. Ajouter donc cette méthode à ce fichier:

          /**
       * Tells Symfony to use this provider for this User class.
       */
      public function supportsClass($class)
      {
          return User::class === $class;
      }

      Dans cette exemple nous supposons que votre class se nomme User, modifier le nom de la classe si besoin.

    6. Security.yaml : Vous pouvez maintenant modifier le fichier security.yaml pour prendre en compte l'authentification et le chargement de l'utilisateur. Ouvrez le fichier et modifier le comme ceci:

          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 }

      Modifiez le provider en renseignant votre class précédemment créée:

          providers:
              viduc_provider:
                  id: App\Security\UserPersoProvider
    7. Test: Si vous voulez tester rapidement le fonctionnement de l'authentification CAS, ajoutez au fichier routes.yaml de votre dossier config cette ligne:

      _cas:
        resource: "@CasBundle/Resources/config/routes.yaml"

      Accédez ensuite à l'url de votre application suivit de "/cas" (par exemple: http://monapli/cas). Vous serez alors redirigé automatiquement vers votre serveur SSO pour être authentifié. Une fois logué, vous serez redirigé vers une page du bundle (Connexion En Tant Que)

    warning Si le path vous renvoi un 404 not found, essayer ces otpions:
    composer require symfony/apache-pack
    et dans fichier conf de votre serveur apache:
    <Directory "/Library/WebServer/Documents/Your_public_symfony_directory"> .... FallbackResource /index.php ....
  • Configuration de la partie En Tant Que:

    La fonctionnalité "En Tant Que" permet de prendre le contrôle d'un compte utilisateur connu de votre application. Elle est normalement réservée à un groupe d'utilisateur restreint (gestionnaire ou administrateur de l'application) et permet de tester ou vérifier des bugs ou anomalies qu'un utilisateur aurait fait remonté. Les utilisateurs qui auront accès à cette fonctionnalité devront avoir le rôle: 'ROLE_ENTANTQUE'.

    Pour utiliser cette fonctionnalité, il faudra tout d'abord définir un tableau de login d'utilisateur dont on peut prendre le contrôle. Vous pouvez générer ce tableau soit dans votre controller principal, soit dans le UserProvider ou dans un écouteur d'évènement. Le principe est de créer un tableau contenant des Users (CasUser ou votre propre class User) avec au minimum leur username (login). Ce tableau doit ensuite être chargé en session dans une variable nommée 'enTantQue.users'. Vous pouvez vous baser sur le controller CasController du bundle pour prendre exemple.

    Ensuite vous devrez définir un lien pour accéder à cette fonctionnalité, ce lien aura comme path: 'enTantQue' :

    <a href="{{ path('enTantQue') }}">en tant que</a>

    Ce lien ouvrira la page qui permet de sélectionner un utilisateur pour prendre son rôle ou de revenir à l'utilisateur d'origine

    Lorsque l'on sélectionne un login pour se connecter, le système repassera par votre méthode définie dans l'UserProvider précédemment pour charger l'utilisateur demandé. Le compte qui sera donc chargé contiendra bien toutes les informations de la personne et notamment ses rôles. Voici un exemple d'un controller et de sa vue qui pourrait recevoir l'accès à la fonctionnalité:

     <?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>

    Enfin, si vous souhaitez modifier la page (twig) de la fonctionnalité en tant que, créez un dossier CasBundle dans le dossier templates/bundles de votre application (créez les dossiers s'ils n'existent pas). Créez ensuite un fichier nommé 'enTantQue.html.twig' et mettez-y votre logique du vue. Faites ensuite un :

     php /bin/console cache:clear
    

    Votre template devrait être chargé à la place du template du Bundle. Vous pouvez créer un lien pour le retour sur la session appelante en utilisant le path enTantQueRestore:

    <a href="{{ path('enTantQueRestore') }}">Revenir à ma session</a>

viduc/casbundle 适用场景与选型建议

viduc/casbundle 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 583 次下载、GitHub Stars 达 1, 最近一次更新时间为 2020 年 07 月 13 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「cas」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 viduc/casbundle 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 viduc/casbundle 我们能提供哪些服务?
定制开发 / 二次开发

基于 viduc/casbundle 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 583
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 8
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: Apache-2.0
  • 更新时间: 2020-07-13