보안, 라우팅, 서비스 및 검증에서 표현식을 사용하는 방법


Symfony에는 강력한 표현 언어 구성 요소가 포함되어 있습니다. 이를 통해 구성에 고급 사용자 정의 논리를 추가할 수 있습니다 .

Symfony 프레임워크는 다음에서 표현식을 효과적으로 활용합니다.

보안: 표현식은 복잡한 액세스 제어를 사용합니다.

허용됨 ROLE_ADMIN 역할에 추가 ,

허가됨

또한 마찬가지입니다. 을 수락하세요. 표현식객체:
use Symfony\Component\ExpressionLanguage\Expression;// ... public function indexAction(){
    $this->denyAccessUnlessGranted(new Expression(
        '"ROLE_ADMIN" in roles or (user and user.isSuperAdmin())'
    ));     // ...}

이 예에서 현재 사용자에게 ROLE_ADMINROLE_ADMIN或者当前的用户对象的isSuperAdmin()方法返回true那么访问将被授权(注意:你的用户对象未必拥有isSuperAdmin方法,这个方法只为此例出现)。

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

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

  • user
  • 用户对象(或者是anon,如果未经认证的话)。
  • roles
  • 用户所拥有的角色数组,包括角色层级(角色层级)但是不包括IS_AUTHENTICATED_*属性(参考下面的功能)。
  • object
  • 第二作为个参数传到isGranted方法的对象(如果有的话)。
  • token
  • 令牌对象。
  • trust_resolver
  • AuthenticationTrustResolverInterface接口,其对象是:可能你希望使用下面的is_*#🎜🎜이 있는 경우 # 또는 현재 사용자 개체의 isSuperAdmin() 메서드가
을 반환합니다.< code class ="notranslate">true

그러면 액세스가 승인됩니다(참고: 사용자 개체에 가 없을 수도 있습니다. isSuperAdmin< /code>

메서드, 이 메서드는 이 예에만 나타납니다. #🎜🎜##🎜🎜#
#🎜🎜##🎜🎜##🎜🎜##🎜🎜#이것은 표현을 사용하는 경우에도 언어 표현의 문법에 대해 자세히 알아볼 수 있습니다. # 🎜🎜 ##🎜🎜##🎜🎜##🎜🎜#표현 구문#🎜🎜##🎜🎜#< /em> #🎜🎜##🎜🎜#. #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#표현식에서 다양한 변수에 액세스할 수 있습니다. #🎜🎜##🎜🎜##🎜🎜#< ul class=" docutils">
  • 사용자#🎜🎜#
  • #🎜🎜##🎜🎜# 사용자 개체(또는 #🎜🎜##🎜🎜 #anon#🎜🎜##🎜🎜#, 인증되지 않은 경우). #🎜🎜##🎜🎜##🎜🎜#
  • 역할#🎜🎜#
  • #🎜🎜##🎜🎜#사용자가 소유한 역할 배열 , #🎜🎜##🎜🎜##🎜🎜##🎜🎜#역할 계층구조#🎜🎜##🎜🎜# 포함 # 🎜🎜##🎜🎜#(역할 수준)이지만 #🎜🎜##🎜🎜#IS_AUTHENTICATED_*#🎜🎜##🎜🎜# 속성은 포함되지 않습니다(참조 아래 기능으로). #🎜🎜##🎜🎜##🎜🎜#
  • 객체#🎜🎜#
  • #🎜🎜##🎜🎜#두 번째 매개변수는 #에 전달됩니다. 🎜🎜##🎜🎜#isGranted#🎜🎜##🎜🎜# 메서드의 개체입니다(있는 경우). #🎜🎜##🎜🎜##🎜🎜#
  • 토큰#🎜🎜#
  • #🎜🎜##🎜🎜#토큰 개체. #🎜🎜##🎜🎜##🎜🎜#
  • trust_resolver#🎜🎜#
  • AuthenticationTrustResolverInterface#🎜🎜## 🎜🎜#Interface, 해당 개체는 다음과 같습니다. 대신 다음 #🎜🎜##🎜🎜#is_*#🎜🎜##🎜🎜# 함수를 사용하고 싶을 수도 있습니다. #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜# 또한 표현식에서 다양한 기능에 액세스할 수 있습니다. #🎜🎜##🎜🎜## 🎜🎜#
    • is_authenticated
    • 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_FULLYReturns true 사용자가 "remember me"를 통과하거나 Return을 하면 "전체" 인증이 통과된 경우(예: 사용자가 로그인한 경우) true입니다.

  • is_anonymousisGranted

    에서 사용되는 것과 같습니다. 🎜 함수 🎜🎜IS_AUTHENTICATED_ANONYMOUSLY🎜🎜. 🎜🎜🎜is_remember_me🎜🎜🎜유사하지만 🎜🎜IS_AUTHENTICATED_REMEMBERED🎜와 정확히 동일하지는 않습니다. 🎜 , 아래를 참조하세요. 🎜🎜🎜is_full_authenticated🎜🎜🎜는 유사하지만 🎜🎜IS_AUTHENTICATED_FULLY와 정확히 동일하지는 않습니다. 🎜🎜 , 아래를 참조하세요. 🎜🎜🎜has_role🎜🎜🎜 사용자가 특정 ROLE을 가지고 있는지 확인하세요. 이는 다음과 같은 표현식과 같습니다. 🎜🎜역할의 'ROLE_ADMIN'🎜🎜. 🎜🎜

    🎜🎜is_remember_me는 확인하는 것과 다릅니다 🎜🎜 < /em>

    🎜🎜IS_AUTHENTICATED_REMEMBERED🎜🎜

    is_remember_me🎜🎜부사절: 🎜🎜is_authenticated_full< / code>🎜🎜 함수 및 🎜🎜IS_AUTHENTICATED_REMEMBERED🎜🎜부사절 사용: 🎜🎜IS_AUTHENTICATED_FULLY🎜🎜 영어와 유사 - 🎜🎜🎜🎜🎜 아님 🎜🎜🎜🎜🎜다음 예에서는 차이점을 보여줍니다. 🎜🎜🎜

    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()'));

    여기서 $access1$access1$access2的值是相同的。不同于IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_FULLY的行为,is_remember_me函数仅当用户通过了remember_me cookie认证时返回true,同时is_fully_authenticated$access2의 값은 동일합니다. IS_AUTHENTICATED_REMEMBERED
    IS_AUTHENTICATED_FULLY

    ,

    is_remember_me🎜🎜 함수의 동작과 달리 🎜🎜🎜🎜 🎜만약 🎜🎜🎜🎜🎜사용자가 Remember_me 쿠키 인증을 통과하고 🎜🎜is_full_authenticated인 경우 true를 반환합니다. 🎜🎜🎜 🎜🎜🎜🎜🎜 사용자가 세션 기간 내에 있는 경우에만(예: 전체 공급 ) True는 로그인 상태가 성공한 경우에만 반환됩니다. 🎜🎜🎜🎜🎜🎜🎜