Comment utiliser les expressions en matière de sécurité, de routage, de services et de validation


Symfony est livré avec un puissant langage d'expression composants. Il vous permet d'ajouter une logique personnalisée avancée à votre configuration. Le framework Symfony fait bon usage des expressions dans : ###### 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜#Service de configuration#🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜#; 🎜 🎜#Conditions de correspondance d'itinéraire

#🎜🎜 # 🎜#

(expliqué ci-dessous) et
  • Utilisez Allow_if pour le contrôle d'accès # ###### 🎜🎜#;#🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜# 🎜🎜#.
  • Create³³Pour plus d'informations sur l'utilisation des clauses adverbiales : expressions, veuillez vous référer à #🎜🎜 ## 🎜🎜#Syntaxe d'expression .
  • Sécurité : Utiliser des expressions complexes pour le contrôle d'accès #🎜 🎜#¶accepté sauf ROLE_ADMIN En plus de ce rôle,
  • estGranted
  • également . AccepterExpressionObject :
    use Symfony\Component\ExpressionLanguage\Expression;// ... public function indexAction(){
        $this->denyAccessUnlessGranted(new Expression(
            '"ROLE_ADMIN" in roles or (user and user.isSuperAdmin())'
        ));     // ...}

    Dans cet exemple, si l'utilisateur actuel a ROLE_ADMINROLE_ADMIN或者当前的用户对象的isSuperAdmin()方法返回true那么访问将被授权(注意:你的用户对象未必拥有isSuperAdmin方法,这个方法只为此例出现)。

    这就用到了一个表达式,你还可以学习更多关于表达languange的语法,参考表达式语法

    在表达式中,你可以访问以各种变量:

    • user
    • 用户对象(或者是anon,如果未经认证的话)。
    • roles
    • 用户所拥有的角色数组,包括角色层级(角色层级)但是不包括IS_AUTHENTICATED_*属性(参考下面的功能)。
    • object
    • 第二作为个参数传到isGranted方法的对象(如果有的话)。
    • token
    • 令牌对象。
    • trust_resolver
    • AuthenticationTrustResolverInterface接口,其对象是:可能你希望使用下面的is_* ou l'objet utilisateur actuel isSuperAdmin()
    • renvoie

    truepuis l'accès sera autorisé (remarque : votre objet utilisateur n'a peut-être pas isSuperAdmin

    🎜 méthode, cette méthode n'apparaît que pour cet exemple). 🎜🎜
    🎜🎜🎜🎜Cela utilise une expression. Vous pouvez également en savoir plus sur la syntaxe d'expression du langage, reportez-vous à 🎜🎜🎜🎜syntaxe d'expression🎜🎜🎜🎜. 🎜🎜🎜🎜🎜🎜Dans les expressions, vous pouvez accéder à diverses variables : 🎜🎜🎜
    • user🎜
    • 🎜🎜Objet utilisateur (ou 🎜🎜anon🎜🎜 si non authentifié). 🎜🎜🎜
    • rôles🎜
    • 🎜🎜Tableau de rôles détenus par l'utilisateur, y compris 🎜🎜🎜🎜Role level🎜🎜🎜🎜 (niveau de rôle) mais n'inclut pas l'attribut 🎜🎜IS_AUTHENTICATED_*🎜🎜 (voir la fonction ci-dessous ). 🎜🎜🎜
    • object🎜
    • 🎜🎜Le deuxième paramètre est passé à la méthode 🎜🎜isGranted🎜🎜 objet (le cas échéant). 🎜🎜🎜
    • jeton🎜
    • 🎜🎜Objet jeton. 🎜🎜🎜
    • trust_resolver🎜
    • AuthenticationTrustResolverInterface🎜🎜Interface, son objet est : Peut-être souhaitez-vous utiliser ce qui suit 🎜🎜 est_*🎜🎜 fonction à la place. 🎜🎜🎜🎜🎜🎜🎜 De plus, vous pouvez accéder à diverses fonctions dans les expressions : 🎜🎜🎜
      • est_authentifié
      • is_authenticated
      • 返回true,如果用户通过“记住我”或“完全”身份认证通过的话 - 比如,如果用户已登录,就返回true。
      • is_anonymous
      • 于等同在isGranted函数中使用IS_AUTHENTICATED_ANONYMOUSLY
      • is_remember_me
      • 类似但不完全等同于IS_AUTHENTICATED_REMEMBERED,见下文。
      • is_fully_authenticated
      • 类似但不完全等同于IS_AUTHENTICATED_FULLY,见下文。
      • has_role
      • 查看一个用户是否拥有给定的ROLE  - 等同于一个这样的表达式'ROLE_ADMIN' in roles

      is_remember_me不同于检查

      IS_AUTHENTICATED_REMEMBERED

      is_remember_me状语从句:is_authenticated_fully函数与在isGranted函数中使用IS_AUTHENTICATED_REMEMBERED状语从句:IS_AUTHENTICATED_FULLYReturn true, si l'utilisateur réussit l'authentification "se souvenir de moi" ou "complète" - par exemple, si l'utilisateur est connecté, renvoie vrai.

    • is_anonymous est égal à #🎜 🎜#isGranted

      utilisé dans la fonction #🎜🎜##🎜🎜#IS_AUTHENTICATED_ANONYMOUSLY#🎜🎜##🎜🎜#. #🎜🎜##🎜🎜##🎜🎜#is_remember_me#🎜🎜##🎜🎜##🎜🎜#Similaire mais pas exactement le idem Dans #🎜🎜##🎜🎜#IS_AUTHENTICATED_REMEMBERED#🎜🎜##🎜🎜#, voir ci-dessous. #🎜🎜##🎜🎜##🎜🎜#is_fully_authenticated#🎜🎜##🎜🎜##🎜🎜#Similaire mais pas exactement le idem Dans #🎜🎜##🎜🎜#IS_AUTHENTICATED_FULLY#🎜🎜##🎜🎜#, voir ci-dessous. #🎜🎜##🎜🎜##🎜🎜#has_role#🎜🎜##🎜🎜##🎜🎜# Vérifiez si un utilisateur a Le ROLE donné - équivaut à une expression comme #🎜🎜##🎜🎜#'ROLE_ADMIN' dans les rôles#🎜🎜##🎜🎜#. #🎜🎜##🎜🎜#

    #🎜🎜 ##🎜🎜#is_remember_me est différent de vérifier #🎜🎜##🎜🎜#

    #🎜🎜##🎜🎜#IS_AUTHENTICATED_REMEMBERED#🎜🎜##🎜🎜#< /em> em>

    is_remember_me#🎜🎜##🎜🎜#Clause adverbiale : #🎜🎜##🎜🎜#is_authenticated_fully#🎜🎜 ##🎜 🎜# Fonction et utilisation dans #🎜🎜##🎜🎜#isGranted#🎜🎜##🎜🎜# fonction 🎜##🎜🎜#Clause adverbiale : #🎜🎜##🎜🎜 #IS_AUTHENTICATED_FULLY#🎜🎜##🎜🎜# est similaire en anglais - ils ne le sont pas #🎜🎜##🎜🎜## 🎜🎜##🎜🎜##🎜🎜#not#🎜🎜# #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Idem L'exemple suivant montre la différence : 🎜#

    use Symfony\Component\ExpressionLanguage\Expression;// ... $ac = $this->get('security.authorization_checker');$access1 = $ac->isGranted('IS_AUTHENTICATED_REMEMBERED'); $access2 = $ac->isGranted(new Expression(
        'is_remember_me() or is_fully_authenticated()'));

    Ici, les valeurs de $access1$access1$access2的值是相同的。不同于IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_FULLY的行为,is_remember_me函数仅当用户通过了remember_me cookie认证时返回true,同时is_fully_authenticated et $access2 sont les mêmes. Contrairement au comportement de IS_AUTHENTICATED_REMEMBERED et
    IS_AUTHENTICATED_FULLY

    ,
is_remember_me🎜🎜 fonction 🎜🎜🎜🎜 🎜Seulement si 🎜🎜🎜🎜🎜Renvoie vrai lorsque l'utilisateur réussit l'authentification du cookie Remember_me, et 🎜🎜is_fully_authenticated 🎜🎜🎜Seulement si l'utilisateur 🎜🎜🎜🎜🎜 est dans le cycle de session (comme un utilisateur à part entière ) True ne sera renvoyé que si l'état de connexion est réussi. 🎜🎜🎜🎜🎜🎜🎜