Nível de Acesso com Struts 2 [Resolvido]

Olá galera.

Já postei alguns tópicos aqui, com algumas dúvidas relacionadas ao meu primeiro projeto em Java (TCC da Faculdade)
Felizmente sempre obtive boas respostas e consegui resolver tudo.

Recentemente surgiu a necessidade de criar um controle de acesso de usuários no sistema, até então eu estava trabalhando de forma bem “manual” usando logicas MVC para controlar todas as funcionalidades do sistema, e estava funcionando perfeitamente.

Quando fui implementar o Login, acabei decidindo usar o Struts 2, inicialmente não gostei muito, mas com algumas horas de leitura e bastante trabalho consegui passar tudo para o padrão do Struts 2 até agora estou achando muito bom usar esse framework, a tarefa de criar actions e executar tarefas se tornou muito mais simples e prática.

Consegui também implementar o login no sistema usando Interceptors, e também está funcionando de forma perfeita.

Agora preciso de mais um passo para avançar no desenvolvimento do meu projeto. Controle de acesso utilizando nível de usuário.

Por exemplo, um usuário padrão, vai ter acesso a alguns recursos do sistema e recursos administrativos não serão acessíveis, já um usuário administrador, deve ter acesso a todo o sistema.

Já procurei bastante por uma solução em Struts 2 para resolver esse “problema” porém ainda não encontrei o que eu queria. que é exatamente uma forma de definir níveis de acesso diferentes para determinadas páginas do sistema.

Segue abaixo o código de alguns arquivos importantes do sistema, para vocês entenderem como ele funciona atualmente.

Action do Interceptor

[code]package br.com.winners.action;

import br.com.winners.modelo.Professor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class AutorizadorInterceptor implements Interceptor{

public String intercept(ActionInvocation invocation) throws Exception {

	Professor usuarioLogado = (Professor) invocation.getInvocationContext().
			getSession().get("usuarioLogado");
	if (usuarioLogado == null) {
		return "naoLogado";
	}
	return invocation.invoke();
}

@Override
public void destroy() {		
}

@Override
public void init() {
}

}[/code]

Action Login

[code]package br.com.winners.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import br.com.winners.jdbc.ProfessorDAO;
import br.com.winners.modelo.Professor;

import com.opensymphony.xwork2.ActionContext;

public class LoginAction {

private Professor professor;

@Action(value = "login", results = {
		@Result(name = "ok", location = "index-menu.jsp"),
		@Result(name = "invalido", location = "login.jsp") })
public String login() {
	if (new ProfessorDAO().existeUsuario(professor)) {
		ActionContext.getContext().getSession()
				.put("usuarioLogado", professor);
		return "ok";
	}

	return "invalido";
}

public Professor getProfessor() {
	return professor;
}

public void setProfessor(Professor professor) {
	this.professor = professor;
}

}[/code]

Página de login:

[code]<c:import url=“cabecalho.jsp” />

Página de Login do Sistema


Login:
Senha:
[/code]

Exemplo de action que só pode ser acessada após o login:

[code]package br.com.winners.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;

import br.com.winners.jdbc.CursoDAO;
import br.com.winners.modelo.Curso;

@ParentPackage(“default”)
public class AdicionaCursoAction {

private Curso curso;
@Action(value="adicionaCurso",
		results={@Result(name="ok", location= "manutencao-cursos.jsp"),},
		interceptorRefs = { @InterceptorRef("seguranca") })

public String execute(){
	new CursoDAO().adiciona(curso);
	return"ok";		
}	
public void setCurso(Curso curso) {
	this.curso = curso;				
}
public Curso getCurso() {
	return curso;
}	

}[/code]

Struts.xml

[code]

<package name="default" extends="struts-default">

	<interceptors>
		<interceptor name="autorizador"
			class="br.com.winners.action.AutorizadorInterceptor" />
		<interceptor-stack name="seguranca">
			<interceptor-ref name="autorizador" />
			<interceptor-ref name="defaultStack" />
		</interceptor-stack>
	</interceptors>
	
	<global-results>
		<result name="naoLogado">/login.jsp</result>
	</global-results>
	
	<action name="loginForm" >
		<result>/login.jsp</result>
	</action>
	
</package>

[/code]

Uffa! Bom só para complementar todas as jsp estão dentro da pasta content em WEB-INF e só podem ser acessadas pelas devidas actions.

Cara usa o Spring Security!

É muito tranquilo fazer controle de acesso com ele.
Nele voce cria grupos de acesso.
Voce pode controlar desde o acesso a uma pagina quanto o acesso a metodos.
Fica tranquilo que o Spring Security se integra com o Struts.

Spring Security Getting Started
http://static.springsource.org/spring-security/site/start-here.html

Spring Security Reference
http://static.springsource.org/spring-security/site/docs/3.0.x/reference/springsecurity.html

Abs,

Já tinha ouvido falar do Spring Deivid, mas imaginei que fosse algo muito complicado.

Obrigado pela dica, já estou lendo algumas coisas aqui e pelo que li até agora, parece ser bem tranquila sua implementação.

Vou tentar fazer com Spring Security, depois coloco aqui os resultados.

Se alguém tiver mais alguma sugestão para acrescentar será muito bem vinda.

É bem tranquilo, qualquer duvida posta ai.

Abs,

Sim,

Encontrei um tutorial aqui, muito bem explicado e detalhado. já estou implementando algumas coisas, em um projeto teste aqui.

Se tudo der certo depois vou tentar implementar no meu projeto.

O link do tutorial:

http://www.edsongoncalves.com.br/2010/04/25/seguranca-passo-a-passo-com-spring-security-3-0/

http://www.edsongoncalves.com.br/2010/05/04/seguranca-com-spring-security-3-0-utilizando-banco-de-dados-em-apenas-alguns-minutos/

Bom. depois de algumas horas consegui implementar o sistema de login do Spring Security em todo o meu sistema, com os usuários podendo acessar apenas as páginas pertinentes ao seu nível de acesso. (nunca pensei que seria tão fácil)

Achei simplesmente fantástico esse Framework, muito fácil de usar e implementar, com certeza vai ser uma das coisas que vou me dedicar a estudar para aprender ainda mais.

Mais uma vez obrigado pela dica Deivid.
E deixo a dica também para qualquer um que esteja querendo fazer esse tipo de autenticação.

Já deixei dos links na resposta anterios com um óitmo tutorial que usei para implementar o Spring aqui, recomendo fazer o projeto de exemplo usado no tutorial para entender com funciona e depois implementar no seu projeto atual ou em um novo projeto. Também achei mais um link com muitas informações interessantes e exemplos, segue ai:

http://www.javasimples.com.br/spring-2/spring-security-3-deixando-sua-aplicacao-web-segura/

Colega estou utilizando struts2, conforme sua primeira aplicação. Teria como passar um exemplo de integração com spring segurity 3.0. Estou com dúvida na action como funcionaria as suas chamadas, seria atraves do spring conectando o banco e depois para action? Teria algum exmplo de configuração?

Att.
Ricardo Silva