web-dev-qa-db-fra.com

Classe Symfony 2 SecurityContext obsolète

J'obtiens l'erreur suivante lorsque j'essaie d'atteindre app/example sur la démo de symfony

Erreur: la classe Symfony\Component\Security\Core\SecurityContext est obsolète depuis la version 2.6 et sera supprimé de la version 3.0. Utilisation Symfony\Component\Security\Core\Authentification\Token\Storage\TokenStorage ou Symfony\Component\Security\Core\Authorization\AuthorizationChecker au lieu.

Le serveur renvoie la bonne réponse avec un code de statut 200 cependant.

Je n'ai rien trouvé sur Google à ce sujet. Quelqu'un at-il rencontré cette erreur auparavant et/ou sait-il comment la réparer?

26
Harijoe

Explication

À partir de Symfony 2.6, la SecurityContext a été scindée en TokenStorage et en AuthorizationChecker (voir: Blog Symfony - "Nouveauté de Symfony 2.6: améliorations du composant de sécurité" ).

La raison principale en était d'éviter la référence circulaire qui se produisait assez souvent lors de l'injection de SecurityContext dans vos propres services.

Solution

La modification elle-même est rétro-compatible à 100% (comme indiqué dans l'article de blog lié), il vous suffit de réécrire la manière dont vous avez accédé à la variable SecurityContext.

// Symfony 2.5
$user = $this->get('security.context')->getToken()->getUser();
// Symfony 2.6
$user = $this->get('security.token_storage')->getToken()->getUser();

// Symfony 2.5
if (false === $this->get('security.context')->isGranted('ROLE_ADMIN')) { ... }
// Symfony 2.6
if (false === $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { ... }

Vous pouvez simplement essayer de trouver le coupable en effectuant une recherche textuelle de security.context ou SecurityContext dans votre code source (y compris le répertoire du fournisseur).

Mais comme vous avez dit que vous utilisez Vanilla Symfony 2.6, il semble qu’il utilise simplement des méthodes qui seront bientôt obsolètes. Donc, vous pouvez simplement utiliser ceci ...

Solution de contournement

Comme Symfony fait sa dépréciation en déclenchant des erreurs E_USER_DEPRECATED, vous pouvez simplement les désactiver lors du démarrage de Symfony AppKernel:

// app/AppKernel.php
class AppKernel extends Kernel
{
    public function __construct($environment, $debug) {
        // Keep error reporting like it was and disable only deprecation warnings.
        error_reporting(error_reporting() & (-1 ^ E_DEPRECATED));
        // ...
    }
}

Personnellement, j'aime bien les avertissements de dépréciation, car les journaux des modifications de Symfony ont tendance à donner des informations très détaillées sur la façon de modifier votre code pour prendre en charge les versions futures de Symfony et les avertissements de dépréciation sont normalement déclenchés des mois avant que les méthodes ne soient réellement obsolètes.

45
flu

Ce n'est pas une erreur, mais un avertissement.

Une classe obsolète est une classe qu'il est prévu de supprimer dans les versions ultérieures (de Symfony, dans ce cas).

Il vous suggère de cesser de l'utiliser et vous dirige vers la nouvelle classe (et ses substituts), TokenStorage et AuthorizationChecker, qui prendra complètement le relais pour effectuer les mêmes tâches.

1
Jean

C'est tellement énervant de voir cet avertissement. Dans le même temps, vous ne voulez pas désactiver les avertissements. J'ai donc pensé qu'il serait peut-être utile de donner un exemple de changement de code pour s'en débarrasser. Voici comment j'ai changé la classe HWIOAuthBundle de OAuthUtils pour le faire . D'abord, j'ai changé /vendor/hwi/oauth-bundle/HWI/Bundle/OAuthBundle/Resources/config/oauth.html à partir de ceci:

<service id="hwi_oauth.security.oauth_utils" class="%hwi_oauth.security.oauth_utils.class%">
    <argument type="service" id="security.http_utils" />
    <argument type="service" id="security.context" />
    <argument>%hwi_oauth.connect%</argument>
</service>

pour ça:

<service id="hwi_oauth.security.oauth_utils" class="%hwi_oauth.security.oauth_utils.class%">
    <argument type="service" id="security.http_utils" />
    <argument type="service" id="security.authorization_checker" />
    <argument>%hwi_oauth.connect%</argument>
</service>

Nous devons maintenant changer cela dans la classe /vendor/hwi/oauth-bundle/HWI/Bundle/OAuthBundle/Security/OAuthUtils:

 utilisez Symfony\Component\Security\Core\SecurityContextInterface; 
 ...

 /**
 * @var SecurityContextInterface 
 */
 private $ securityContext; 

 /**
 * @param HttpUtils $ httpUtils 
 * @param SecurityContextInterface $ securityContext 
 * @param boolean $ connect 
 */
 fonction publique __construct (HttpUtils $ httpUtils, SecurityContextInterface $ securityContext, $ connect) 
 {
 $ this-> httpUtils = $ httpUtils; 
 $ this-> securityContext = $ securityContext; 
 $ this-> connect = $ connect; 
 } 

pour ça:

 utilisez Symfony\Component\Security\Core\Authorization\AuthorizationChecker; 
 ...

 /**
 * @var AuthorizationChecker 
 */
 private $ autorisationChecker; 

 /**
 * @param HttpUtils $ httpUtils 
 * @param AuthorizationChecker $ verificationCheck 
 * @param boolean $ connect 
 */
 fonction publique __construct (HttpUtils $ httpUtils, AuthorizationChecker $ verificationCheck, $ connect) 
 {
 $ this-> httpUtils = $ httpUtils; 
 $ this-> verificationChecker = $ autorisationChecker; 
 $ this-> connect = $ connect; 
 } 

Ensuite, j'ai apporté des modifications là où la securityContext a été utilisée. Remplacé par authorizationChecker.

 fonction publique getAuthorizationUrl (Request $ request, $ name, $ redirectUrl = null, array $ extraParameters = array ()) 
 {
 $ resourceOwner = $ this-> getResourceOwner ($ name); 
 if (null === $ redirectUrl) {
 if (! $ this-> connect ||! $ this-> verificationChecker-> isGranted ('IS_AUTHENTICATED_REMEMBERED')) {
 $ redirectUrl = $ this-> httpUtils-> generateUri ($ request, $ this-> ownerMap-> getResourceOwnerCheckPath ($ name)); 
 } autre {
 $ redirectUrl = $ this-> getServiceAuthUrl ($ request, $ resourceOwner); 
 } 
 } 

 return $ resourceOwner-> getAuthorizationUrl ($ redirectUrl, $ extraParameters); 
 } 

La raison pour laquelle SecurityContext a été remplacé par AuthorizationChecker est que seule la méthode isGranted est utilisée dans ce cas. Peut-être pourriez-vous le remplacer par TokenStorage ou utiliser à la fois AuthorizationChecker et TokenStorage si vous aviez besoin de votre cas.

0
Gulzada Serzhan