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: |
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.