Controle de acesso ao sistema x VRaptor3

4 respostas
cinei

Para controlar permissões de acesso ao sistema, crei uma interface

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Restricao {
	String[] value();
}

Para marcar pontos de controle, nos recursos:

@Restricao({"Enviar NF-e", "Enviar CC-e"})
public void processarLote () {
...
}

Para checar se o usuário tem permissão, verifica-se no banco se há cadastro de liberação de acesso:

@Intercepts
@RequestScoped
public class VerificarAutorizacao implements Interceptor {
...
public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {
...
	if(method.getMethod().isAnnotationPresent(Restricao.class)) {
		temPermissao = verificaRestricao(userInfo.getUser().getPerfil().getId(), method.getResource().getType().getSimpleName(), 
				method.getMethod().getAnnotation(Restricao.class).value());
	} 		
...

private boolean verificaRestricao(Long idPerfil, String controller, String[] restricoes){
	boolean temPermissao = false;
	for (String restr : restricoes) {
		temPermissao =  permissaoDao().permissaoEm(idPerfil, controller, restr); //perfil do usuário, Controller e restrição anotada no Controller
		if (temPermissao) 
			break;
	}
	return temPermissao;

Se não existir permissão (conforme a anotação), o usuário recebe a informação que não tem permissão.

Alguém utiliza algo mais simples, mas que pode ter rígido controle de acesso?

4 Respostas

d34d_d3v1l

Fiz algo um pouco diferente…
Mas é só um pouquinho…

@Retention( RetentionPolicy.RUNTIME )
@Target( { ElementType.TYPE, ElementType.METHOD } ) 

public @interface AuthenticationLevelRequired {

	AuthenticationLevel value();
	
}

//Onde:
public enum AuthenticationLevel {

	PRIVATE,
	PUBLIC,
        ADMIN;
	
}

Onde:

@Override
	public boolean accepts(ResourceMethod resourceMethod) {
		Method method = resourceMethod.getMethod();

		if ( method.isAnnotationPresent( AuthenticationLevelRequired.class ) ) {
			AuthenticationLevelRequired accessContext = method.getAnnotation( AuthenticationLevelRequired.class );
			
			if ( accessContext.value().equals( AuthenticationLevel.PUBLIC ) ) {
				return false;
			}
		}
		
		return true;		
	}

e aqui eu fiz um negocio, pois é um controle de acesso para cada portal…

@Override
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object resource) throws InterceptionException {

		if (userSession.isLogged()) {
			Method classMethod = method.getMethod();
			Class<?> classe = method.getResource().getType();

			if (classe.isAnnotationPresent(AuthenticationLevelRequired.class)) {

				AuthenticationLevelRequired accessContext = classe
						.getAnnotation(AuthenticationLevelRequired.class);

				switch (userSession.getUser().getType()) {
				case 'F':
					if (accessContext.value().equals(AuthenticationLevel.ADMIN)) {
						stack.next(method, resource);

//outros codigos aqui que retirei...
		    }else if (classMethod.isAnnotationPresent(AuthenticationLevelRequired.class)) {

				AuthenticationLevelRequired accessContext = classMethod
						.getAnnotation(AuthenticationLevelRequired.class);

				switch (userSession.getUser().getType()) {
				case 'F':
					if (accessContext.value().equals(AuthenticationLevel.ADMIN)) {
						stack.next(method, resource);
					}
//outros codigos aqui que retirei
		} else {
			result.redirectTo(LoginController.class).index(
					request.getRequestURL().toString());

		}

	}

entendeu, ele verifica primeiro a permissao da classe, depois a do metodo :slight_smile:

Lucas_Cavalcanti

se vc precisa ter esse controle fino, esse é um dos jeitos mais simples mesmo…

outro seria vc externalizar essa configuração em algum arquivo, tipo um properties da vida, pelas urls:

/minha/url=Permissao 1, Permissao 2
/outra/url/(.*)=Permissao 3, Permissao 4

receber o request e pegar a uri da requisição, procurando quais são as permissões correspondentes

d34d_d3v1l

Lucas Cavalcanti:
se vc precisa ter esse controle fino, esse é um dos jeitos mais simples mesmo…

outro seria vc externalizar essa configuração em algum arquivo, tipo um properties da vida, pelas urls:

/minha/url=Permissao 1, Permissao 2
/outra/url/(.*)=Permissao 3, Permissao 4

receber o request e pegar a uri da requisição, procurando quais são as permissões correspondentes

legal essa ‘ideia’…
nem havia pensado nisso.

cinei

d34d_d3v1l e Lucas, agradeço pelas respostas.

Criado 11 de julho de 2012
Ultima resposta 12 de jul. de 2012
Respostas 4
Participantes 3