如何在安全,路由,服務和驗證中使用表達式


Symfony的自帶了強力的#表達式語言元件。它允許你在配置中添加高級自訂邏輯

Symfony框架在以下方面很好地利用了表達式:

建立³³關於使用狀語子句:表達式的更多內容請參考##表達式語法

安全性:表達式使用複雜性進行存取控制  ##¶

接受除了ROLE_ADMIN這種角色之外,isGranted也。接受Expression 物件:

use Symfony\Component\ExpressionLanguage\Expression;// ... public function indexAction(){
    $this->denyAccessUnlessGranted(new Expression(
        '"ROLE_ADMIN" in roles or (user and user.isSuperAdmin())'
    ));     // ...}

本例中,如果目前使用者有ROLE_ADMIN或目前的使用者物件的#isSuperAdmin()方法回傳true那麼存取將被授權(注意:你的使用者物件未必有isSuperAdmin方法,這個方法只為此範例出現)。

這就用到了一個表達式,你還可以學習更多關於表達languange的語法,參考表達式語法

在表達式中,你可以存取以各種變數:

  • ##user
  • 使用者物件(或是anon,如果未經認證的話)。
  • roles
  • #使用者所擁有的角色數組,包括角色層級(角色層級)但是不包含IS_AUTHENTICATED_*#屬性(參考下面的功能)。
  • object
  • #第二個作為參數傳到isGranted方法的物件(如果有的話)。
  • token
  • 令牌物件。
  • trust_resolver
  • AuthenticationTrustResolverInterface接口,其物件是:可能你希望使用下面的is_*函數來取代。

另外,你可以在表達式中存取各種函數:#

  • 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 rolesis_remember_me不同於檢查IS_AUTHENTICATED_REMEMBEREDis_remember_me狀語子句:is_authenticated_fully 函數與在

###isGranted##########函數中使用########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##$access2 #的值是相同的。不同於IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_FULLY

##is_remember_me#########函數################只當###############使用者通過了remember_me Cookie認證時傳回true,同時#########is_fully_authenticated### ##########僅當##############使用者在會話週期之內(例如full-fedged)是成功登入的狀態,才會回傳真。 #####################