A segurança com o SEAM é super simples. Abaixo o bean de exemplo que eu utilizo em meu projeto:
package br.com.infosolo.snrd.controle.seguranca;
import java.util.HashSet;
import java.util.Set;
import javax.ejb.Stateless;
import org.jboss.seam.ScopeType;
import
org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import
org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.bpm.Actor;
import org.jboss.seam.log.Log;
import org.jboss.seam.security.Credentials;
import org.jboss.seam.security.Identity;
import br.com.infosolo.snrd.dominio.entidades.Estado;
import br.com.infosolo.snrd.dominio.entidades.Grupo;
import br.com.infosolo.snrd.dominio.entidades.Unidade;
import br.com.infosolo.snrd.dominio.entidades.Usuario;
import br.com.infosolo.snrd.negocio.ejb.UsuarioNegocioLocal;
import br.com.infosolo.snrd.seam.util.ConstantesSNRD;
@Name("autenticador")
@Stateless
public class Autenticador implements AutenticadorLocal {
@Logger private Log log;
@In
Identity identity;
@In
Credentials credentials;
@In
@Out(scope=ScopeType.SESSION)
Actor actor;
@In (create=true)
UsuarioNegocioLocal usuarioNegocio;
@Out(required=false, scope=ScopeType.SESSION)
Usuario usuarioLogado;
@Out(required=false, scope=ScopeType.SESSION)
Set<Estado> estadosUsuarioLogado;
@Out(required=false, scope=ScopeType.SESSION)
Set<Unidade> unidadesUsuarioLogado;
/**
* Método utilizado para Autenticar o usuário.
* @return boolean
*/
public boolean autenticar() {
log.info("Autenticando {0}", credentials.getUsername());
String login = credentials.getUsername();
String senha = credentials.getPassword();
Usuario usuario = new Usuario();
usuario.setLogin(login);
usuario.setSenha(senha);
//actor = Actor.instance() ;
actor.setId(login);
usuarioLogado = usuarioNegocio.retornarUsuarioPorLoginSenha(usuario); // método que verifica se existe usuario com a senha informada.
if(usuarioLogado!=null){
Set<Grupo> grupos = usuarioLogado.getGrupos();
Set<Unidade> unidades = usuarioLogado.getUnidades();
estadosUsuarioLogado = new HashSet<Estado>();
unidadesUsuarioLogado = unidades;
for(Unidade unidade : unidades) {
log.info("Role adicionada: {0}", unidade.getDescricao());
identity.addRole(unidade.getDescricao());
Set<Estado> estadosUnidade = unidade.getEstados();
estadosUsuarioLogado.addAll(estadosUnidade);
}
for(Grupo grupo : grupos) {
log.info("Role adicionada: {0}", grupo.getDescricao());
identity.addRole(grupo.getDescricao());
}
definirActorsIdUsuario();
return true;
}
log.info("Usuário não possui acesso ao sistema: {0}", credentials.getUsername());
return false;
}
/**
* Define as filas de trabalho do usuário.
*/
private void definirActorsIdUsuario() {
long grupoRegistradorOficial = Long.parseLong(ConstantesSNRD.IDENTIFICADOR_GRUPO_REGISTRADOR_OFICIAL);
long grupoAdministrador = Long.parseLong(ConstantesSNRD.IDENTIFICADOR_GRUPO_ADMINISTRADOR);
for(Grupo grupo : usuarioLogado.getGrupos()) {
if(grupo.getIdGrupo()==grupoRegistradorOficial){ // fila de registrador independe da unidade.
String actorId = ConstantesSNRD.IDENTIFICADOR_GRUPO + grupo.getIdGrupo();
actor.getGroupActorIds().add(actorId);
log.info("Actor ID para Grupo {0}: {1}", grupo.getDescricao(),actorId);
}else if(grupo.getIdGrupo()==grupoAdministrador){ // administrador enxerga fila de assinador / registrador.
String actorId = ConstantesSNRD.IDENTIFICADOR_GRUPO + ConstantesSNRD.IDENTIFICADOR_GRUPO_REGISTRADOR_OFICIAL;
actor.getGroupActorIds().add(actorId);
log.info("Actor ID para Grupo {0}: {1}", grupo.getDescricao(),actorId);
} else {
for(Unidade unidade: usuarioLogado.getUnidades()){// Demais filas do usuário dependem da unidade.
String actorId = ConstantesSNRD.IDENTIFICADOR_GRUPO + grupo.getIdGrupo() +
ConstantesSNRD.IDENTIFICADOR_UNIDADE + unidade.getIdUnidade();
log.info("Actor ID para Grupo {0}, unidade {1}: {2}", grupo.getDescricao(),unidade.getDescricao(), actorId);
actor.getGroupActorIds().add(actorId);
}
}
}
}
}
--------
Lembrando de que como utilizo JBPM a parte onde existe actorID é para carregar as filas de trabalho que o usuário logado tem direito.
Para testar se o usuário tem acesso (testar a role do usuário) é através do código abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="
http://jboss.com/products/seam/pages"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.2.xsd">
<restrict>
#{s:hasRole('Administradores')}</restrict>
</page>
Lembrando que para proteger componentes do SEAM podemos utilizar @Restrict e para renderizar ou não campos na tela com richfaces podemos utilizar rendered com a mesma sintaxe.
Se você criar um Seam Project utilizando o JBOSSTOOLS ele já gera o esqueleto desta classe e ficará bem mais fácil de entender.