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
Attachments
- F0601.jpg (18.3 kB) - added by adell on 10/11/07 10:33:56.
