VRaptor - Controle de acesso através de URL

5 respostas
D

Olá,
Tenho um sistema modular e gostaria de fazer o controle de acesso através de URL, segue objetivo:

URL: /admin/* -> Só será acessado se Usuario (UsuarioSession) estiver autenticado e em sessão
URL: /conta/* -> Só será acessado se Cliente (ClienteSession) estiver autenticado e em sessão

Perguta: Qual a melhor forma de fazer esse controle:

  • criando interceptor???
  • poderia usar Spring Security para fazer esse controle das url’s, como???

5 Respostas

G

JAAS faz tudo isso para você.

Em um sistema meu usando JBoss AS 7 com VRaptor, apenas configurei o adapter do JAAS no standalone.xml, depois defini as roles no web.xml, e acabou.

Ficou algo assim:
URL com /* são públicas
URL com /admin precisam de login
Ações do tipo PUT, DELETE, etc precisam de uma role ADMIN
Ações de readonly precisam apenas de uma role do tipo SUPERVISOR.

Além disso a forma de login pode ser feita por ele via BASIC ou DIGEST, ou então você pode implementar um FORM, ou até mesmo usar certificados, etc.

guivirtuoso

A solução do garcia-jj é bem prática.

No entanto se você não estiver utilizando JBoss, e quiser ter um controle semelhante, você pode anotar seus métodos que devem ter restrição.

Ex:

Crie uma Classe de Anotação

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RestritoApenasAdmins {

}

Depois você anota os métodos que devem ficar sujeitos a esta restrição nas suas classes de Controller

...
@Put
@Path("/administracao/parametrosSistema/{parametroSistema.id}")
@RestritoApenasAdmins
@Transactional
public void atualizaParametrosSistema(ParametroSistema parametroSistema) {
    //TODO
}
...

E por fim, crie um Interceptor, para verificar, se o método chamado está anotado com a classe que você criou (RestritoApenasAdmins). Caso esteja, ele faz uma determinada ação se não atender aos seus pré-requisitos.

@Intercepts
public class AutenticacaoInterceptor implements Interceptor {

    private final Result result;
    private final LoginSession loginSession;

    public AutenticacaoInterceptor(Result result, LoginSession loginSession) {
        this.result = result;
        this.loginSession = loginSession;
    }

    @Override
    public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {
         //TODO - Faz alguma coisa caso o metodo accepts retorne false. Redireciona para algum outro lugar.. uma tela de login por exemplo
         //result.redirectTo(AppController.class).login();
    }

    @Override
    public boolean accepts(ResourceMethod method) {
        return !loginSession.isUsuarioLogado() && method.containsAnnotation(RestritoApenasAdmins.class);
    }
}

Espero ter ajudado. :wink:

G

guivirtuoso:
A solução do garcia-jj é bem prática.

No entanto se você não estiver utilizando JBoss, e quiser ter um controle semelhante, você pode anotar seus métodos que devem ter restrição.

JAAS funciona em qualquer application server ou servlet container. Até mesmo o Tomcat possui suporte a JAAS, que aliás, faz parte da especificação JEE/SE. Note, por exemplo, o método HttpServletRequest.getRemoteUser. Ele retorna o usuário autenticado. Ou seja, ele não faz parte apenas do JBoss.

guivirtuoso

Opa, desculpa a ignorância… :oops:

Inclusive… vou dar uma estudada nesse JAAS … :wink:

D

Realmente também não sabia que poderia usar JAAS no tomcat, muito bom saber disso!!!
Implementei uma restrição de acesso por url bem simples utilizando um interceptor, mas vou evoluir esse controle usando o JAAS, já que estou usando o tomcat.

Obrigado pelas dicas.

Criado 8 de abril de 2012
Ultima resposta 9 de abr. de 2012
Respostas 5
Participantes 3