Documentação do Symfony2
Renderizada do repositório symfony-docs-pt-BR no Github

Como usar Expressões em Segurança, Roteamento, Serviços e Validação

No Symfony 2.4, um poderoso componente ExpressionLanguage foi adicionado ao Symfony. Isso nos permite adicionar lógica altamente personalizada dentro da configuração.

O Framework Symfony utiliza expressões prontas para uso nas seguintes formas:

  • Configuração de serviços;
  • Condições de correspondência na rota;
  • Verificação de segurança (explicado abaixo) e controles de acesso com allow_if;
  • Validação.

Para mais informações sobre como criar e trabalhar com expressões, consulte /components/expression_language/syntax.

Segurança: Controles de Acesso Complexos com Expressões

Adicionalmente a um papel como ROLE_ADMIN, o método isGranted também aceita um objeto Symfony\Component\ExpressionLanguage\Expression:

use Symfony\Component\ExpressionLanguage\Expression;
// ...

public function indexAction()
{
    if (!$this->get('security.authorization_checker')->isGranted(new Expression(
        '"ROLE_ADMIN" in roles or (user and user.isSuperAdmin())'
    ))) {
        throw $this->createAccessDeniedException();
    }

    // ...
}

Nesse exemplo, se o usuário atual possui ROLE_ADMIN ou se o método isSuperAdmin() do objeto do usuário atual retornar True, então o acesso será concedido (nota: o seu objeto User pode não ter um método isSuperAdmin, esse método foi inventado para esse exemplo).

Isso usa uma expressão e para aprender mais sobre a sintaxe da linguagem de expressão , consulte /components/expression_language/syntax.

Dentro da expressão, você tem acesso a uma série de variáveis:

user
O objeto usuário (ou a string anon caso não estiver autenticado).
roles
O array de papéis que o usuário possui, inclusive da hierarquia de papel mas não incluindo os atributos IS_AUTHENTICATED_* (veja as funções abaixo).
User.
O objeto (se houver) que é passado como segundo argumento para isGranted.
Token
O objeto token.
trust_resolver
O objeto Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface, você provavelmente usará as funções is_* abaixo em vez disso.

Além disso, você tem acesso a uma série de funções dentro da expressão:

is_authenticated
Retorna `` True`` se o usuário é autenticado via “remember-me” ou “Totalmente” autenticado - ou seja, retorna true se o usuário estiver “logado”.
is_anonymous
É o mesmo que usar IS_AUTHENTICATED_ANONYMOUSLY com a função isGranted.
is_remember_me
Semelhante, mas não igual a IS_AUTHENTICATED_REMEMBERED, veja abaixo.
is_fully_authenticated
Semelhante, mas não igual a IS_AUTHENTICATED_FULLY, veja abaixo.
has_role
Verifica se o usuário tem o papel atribuído - o equivalente a uma expressão como 'ROLE_ADMIN' in roles.