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>