Action Security

A habilidade de executar uma action pode ser restringida a um usuario com certos previlegios. As ferramentas fornecidas pelo

symfony para esta finalidade permitem a criação de aplicações seguras, onde usuarios precisam estar logados para acessar

algumas funcionalidades ou partes da aplicação. Segurança na aplicação requer dois passos: declarando as exigências da

segurança para cada ação e entrando usuários com privilégios de modo que possam alcançar estas ações seguras.

Restrição de Accesso

Antes de ser executado, toda action passa por um filtro especial que checa se o usuário corrente tem previlégio para acessar

a action requisitada. No symfony, previlegios são compostos de duas partes:

  • Actions seguras necessitam de usuários autenticados.
  • Credenciais são nomeados previlegios de segurança e permitem organizar segurança por grupo.

A restrição de acesso de uma ação é feito simplesmente criando e editando um arquivo configuração de YAML chamado

security.yml no diretório config/ do módulo. Neste arquivo, você pode especificar as exigências da segurança que os

usuários devem cumprir para cada ação ou para o todas (all) as ações.

Lista 6-23 - ajustando a restrição de acesso, em apps/myapp/modules/mymodule/config/security.yml

    read:
      is_secure:   off       # Todos os usuários podem requisitar esta ação

    update:
      is_secure:   on        # O update é somente para usuarios autenticados

    delete:
      is_secure:   on        # Somente para usuários autenticados
      credentials: admin     # Com credencial de admin

    all:
      is_secure:  off        # off é o valor padrão

Actions não são seguras por padrão, então quando não houver um security.yml ou nenhuma mensão de uma action nele, a actions

é acessivél por qualquer um. Se existe um security.yml, o symfony verifica o nome da action requisitada e, se ela existe,

checa os requrimentos de segurança. O que acontece quando um usuário tenta alcançar uma ação restrita depende de seus

credentials:

  • Se o ususário está autenticado e tem credenciais apropriados, a action é executada.
  • Se o usuário não está autenticado, ele será redirecionado para a action padrão de login.
  • Se o usuário está autenticado, mas não tem credenciais apropriadas, ele será rediredcionado para a action padrão de

segurança mostrada na figura 6-1.

O login default e a pagina segura são consideravelmente simples, e você irá provavélmente customiza-la. Você pode configurar

qual action serão chamdas no caso de previlegios insuficiente na aplicação settings.yml modificando o valor da propiedade

mostrada na listagem 6-24.

Figura 6-1 - A pagina padrão da action segura

Listangem 6-24 - Action padrão para segurança são definidos em apps/myapp/config/settings.yml

    all:
      .actions:
        login_module:           default
        login_action:           login

        secure_module:          default
        secure_action:          secure

Conceder Accesso

Para ter acesso em paginas restritas, usuários precisam estar autenticados e/ou ter certas credenciais. Você pode estender um

privilegio de usuário chamando o metodo do objeto sfUser. O status authenticated do usuário é feito pelo metodo

setAuthenticated(). A listagem 6-25 mostra um simples exemplo da autenticação de usuário.

Listangem 6-25 - Ajustando o status Authenticated do usuário.

    <?php
    class myAccountActions extends sfActions
    {
      public function executeLogin()
      {
        if ($this->getRequestParameter('login') == 'foobar')
        {
          $this->getUser()->setAuthenticated(true);
        }
      }

      public function executeLogout()
      {
        $this->getUser()->setAuthenticated(false);
      }
    }
    ?>

Os Credentials são um bocado mais complexo para tratar, desde que você pode checar, adicionar, remover e limpar credenciais.

A listagem 6-26 descreve o metodo credencial da classe sfuser.

Listagem 6-26 - Tratar dos Credentials do usuário em uma Action

    <?php
    class myAccountActions extends sfActions
    {
      public function executeDoThingsWithCredentials()
      {
        $user = $this->getUser();

        // Add one or more credentials
        $user->addCredential('foo');
        $user->addCredentials('foo', 'bar');

        // Check if the user has a credential
        echo $user->hasCredential('foo');                      =>   true

        // Check if the user has both credentials
        echo $user->hasCredential(array('foo', 'bar'));        =>   true

        // Check if the user has one of the credentials
        echo $user->hasCredential(array('foo', 'bar'), false); =>   true

        // Remove a credential
        $user->removeCredential('foo');
        echo $user->hasCredential('foo');                      =>   false

        // Remove all credentials (useful in the logout process)
        $user->clearCredentials();
        echo $user->hasCredential('bar');                      =>   false
      }
    }
    ?>

Se um usuário tem a credenmcial 'foo', este usuario poderá acessar as action para qual o security.yml requer esta

credencial. Credenciais podem também ser usadas para mostrar somente conteudo autorizado em um template, como mostrado na

listagem 6-27.

Listagem 6-27 - Tratar dos Credentials do usuário em um Template

    <ul>
      <li><?php echo link_to('section1', 'content/section1') ?></li>
      <li><?php echo link_to('section2', 'content/section2') ?></li>
      <?php if ($sf_user->hasCredential('section3')): ?>
      <li><?php echo link_to('section3', 'content/section3') ?></li>
      <?php endif; ?>
    </ul>

Quanto para ao status authenticated, credenciais são dados frequentemente aos usuários durante o processo de login. Isto é

porque o objeto sfUser é estendido frequentemente para adicionar métodos de login e logout, a fim ajustar o status da

segurança dos usuários em um único lugar.

**DICA** Entre os plugins do symfony, o sfGuardPlugin extende a classe sessão para fazer login e logout facilmente. Consulte o

capitulo 17 para maiores informações.

Credenciais Complexas

A sintaxe YAML usada no arquivo security.yml permite você restringir acesso para usuários tendo uma combinação de credenciais

usando associação AND ou OR. Com tal combinação, você pode construir um sistema de gerência complexo do privilégio do

workflow e do usuário por exemplo, um sistema gerenciador de conteúdo (CSM) back-office acessivel somente a usuários com

credencial de admin, onde artigos podem ser editados somente por usuarios com a credencial editor a publicado somente por

aqueles que tem credencial publisher. Listagem 6-28 mostra este este exemplo.

Listagem 6-28 - Sintaxe de combinação de credenciais

    editArticle:
      credentials: [ admin, editor ]              # admin e editor

    publishArticle:
      credentials: [ admin, publisher ]           # admin e publisher

    userManagement:
      credentials: [[ admin, superuser ]]         # admin ou superuser

Cada vez que você adiciona um novo nivel de suporte, a logica alterna entre AND e OR. Então você pode criar um uma combinação

extremamente complexa, como esta:

    credentials: [[root, [supplier, [owner, quasiowner]], accounts]]
                 # root OR (supplier AND (owner OR quasiowner)) OR accounts

« Anterior índice do Capitulo Seguinte »

Attachments