Struts2 Duvida controle de acesso com interceptor

0 respostas
S

Olá boa tarde a todos, estou com dificuldades para desenvolver um controle de acesso, o sistema de login está funcionando
consigo verificar se o usuário está na sessao e tudo mais o problema começa no seguinte, algumas actions vao ter nivel de
acesso de acordo com o perfil do usuário, mas não estou conseguindo recuperar o valor do nivelDeAcesso da action tentei
fazer utilizando uma annotation que criei mas nao consigo recuperar o valor da mesma na action.

uma outra questão seria o proximo passo, o formulário de login redireciona o usuario para home(logado) mas como fazer
para o usuário ser redirecionado para action de origem ? ao invés de sempre ser redirecionado para home(logado)

desde já obrigado a todos!

action

/**
 * @author Hugnei
 * @category configuracoes 
 * Definição de conteudo do portal
 */
public class SistemaConfiguracoes extends ActionSupport {
	private final String apelido = "SistemaConfiguracoes";
	private final String nivelRequirido = "0";
	private Conteudo conteudo;
	
	private static final long serialVersionUID = -5906252338087030662L;
	
	/**
	 * @return nivel de acesso a classe.
	 */
	@ControleAcesso(nivelRequirido = 0)
	public String getNivelRequirido() {
		return nivelRequirido;
	}

	
	
	/**
	 * @return tiles
	 * adiciona/altera conteudo da home(boas vindas)
	 * e redireciona para pagina onde alterações foram 
	 * efetuadas.
	 */
	public String salvarHome(){
			return "success";
	}

annotation

package sys.controle.annotations;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * @author Hugnei
 * @category Annotation/Segurança
 * Annotation (interface) para implementação 
 * nas actions, para que o nível de acesso
 * seja interceptado pelo autenticador de acesso. 
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface ControleAcesso {

	 /**
	 * @return int NivelRequerido
	 */
	int nivelRequirido();
	
}

interceptor

package sys.controle.interceptor;

import sys.controle.annotations.ControleAcesso;
import sys.model.bean.UsuarioSistema;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

/**
 * @author Hugnei
 * @category Seguranca
 * Verifica se Existe usuario logado para autenticação
 * caso não exista será redirecionado para sistema de login.
 * 
 * Com usuario devidamente autenticado será verificado se o mesmo
 * possui nivel de acesso (int) compativel ou  superior  a action 
 * solicitada.
 * 
 * Todos os requisitos de segurança atendidos a action será ivocada.
 */
public class AutenticadorAcesso implements Interceptor{

	private static final long serialVersionUID = -1082014110105815290L;


	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.interceptor.Interceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
	 */
	@Override
	public String intercept(ActionInvocation ai) throws Exception {
		System.out.println("Inicializando verificação Interceptor (AutenticadorAcesso)");
		try {
			UsuarioSistema usuario = (UsuarioSistema) ai.getInvocationContext().getSession().get("Usuario logado");
			System.out.println("Verificando acesso para:"+usuario.getLogin()+" Nível de Acesso do usuário:"+usuario.getNivelAcesso()+
			                            "\n Classe: "+ai.getClass().getSimpleName()+" Medoto invocado: "+ai.getInvocationContext().getName()+"\n");
			
			
			if(ai.getInvocationContext().getClass().getAnnotation(ControleAcesso.class) != null){
					ControleAcesso nivelAction = ai.getInvocationContext().getClass().getAnnotation(ControleAcesso.class);
					if(usuario.getNivelAcesso()>= nivelAction.nivelRequirido()){
						System.out.println("Nivel de acesso minimo requerido: "+nivelAction.nivelRequirido()+"\n");
						System.out.println("finalizando verificação Interceptor (AutenticadorAcesso)");
						return ai.invoke();
					}else{
						System.out.println("Nivel de acesso minimo requerido: "+nivelAction.nivelRequirido()+"\n Acesso não autorizado para usuário:"+usuario.getLogin()+"\n"+"Classe: "+ai.getClass().getSimpleName()+"Medoto invocado: "+ai.getInvocationContext().getName());
						System.out.println("finalizando verificação Interceptor (AutenticadorAcesso)");
						return "permissaoNegada";
					}
			}else{
				System.out.println("Anotação de nível de acesso não encontrada. o acesso será concedido ao usuario:"+usuario.getLogin()+" Classe: "+ai.getClass().getSimpleName()+" Medoto invocado: "+ai.getInvocationContext().getName());
				System.out.println("finalizando verificação Interceptor (AutenticadorAcesso)");
				return ai.invoke();
			}
		} catch (Exception e) {
			System.out.println("Acesso não autorizado motivo informacoes do usuario: "+e);
			System.out.println("finalizando verificação Interceptor (AutenticadorAcesso)");
			return "erroAutenticacao";
		}
	}
	
	
	

	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.interceptor.Interceptor#init()
	 */
	@Override
	public void init() {
		System.out.println("Iniciando Interceptor \"Autenticador de Acessos\"");
	}
	
	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.interceptor.Interceptor#destroy()
	 */
	@Override
	public void destroy() {
		System.out.println("Destroindo Interceptor \"Autenticador de Acessos\"");		
	}
}

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<constant name="struts.enable.DynamicMethodInvocation" 	value="false" />
	<constant name="struts.devMode" value="false" />
	<constant name="struts.custom.i18n.resources" value="SystemaMensagens" />
	<constant name="struts.i18n.encoding" value="LATIN1" />

	
	<package name="default" extends="struts-default" namespace="/">
		
		<result-types>
			<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
		</result-types>
		
		<interceptors>
			<interceptor name="ValidaAcesso"  class="sys.controle.interceptor.AutenticadorAcesso"></interceptor>
			<interceptor-stack name="loggingStack">
				<interceptor-ref name="ValidaAcesso" />
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
		</interceptors>


		<global-results>
			<result name="erroAutenticacao" type="tiles">loginForm</result>
		</global-results>
		
		
		<action name="*LINK"
				method="{1}" class="sys.controle.action.Links">
			<result name="home" type="tiles">home</result>
			<result name="loginForm" type="tiles">loginForm</result>
			
		</action>
		

		<action name="login" 
			class="sys.controle.action.LogOnOut">
			<result name="logado" type="tiles">logado</result>
			<result name="erro">Login.jsp</result>
			<result name="index">index.jsp</result>
		</action>
		
		
		<action name="*LINKPRO"
				method="{1}" class="sys.controle.action.LinksProtegidos">
			<interceptor-ref name="loggingStack"></interceptor-ref>
			<result name="home" type="tiles">homePro</result>
		</action>
		
		
		<action name="departamento!*" 
				method="{1}" class="sys.controle.action.DepartamentoAction">
			<interceptor-ref name="loggingStack"></interceptor-ref>
			<result name="input" type="tiles">departamento</result>			
		</action>
		
		<action name="cargo!*" 
				method="{1}" class="sys.controle.action.CargoAction">
			<interceptor-ref name="loggingStack"></interceptor-ref>
			<result name="input" type="tiles">cargo</result>			
		</action>
		
		<action name="curriculo!*" 
				method="{1}" class="sys.controle.action.FuncionarioAction">
			<interceptor-ref name="loggingStack"></interceptor-ref>
			<result name="input" type="tiles">curriculo</result>			
		</action>
		
	</package>
</struts>
Criado 30 de novembro de 2010
Respostas 0
Participantes 1