Ola pessoal do forum, estou aqui quebrando a cabeça para tentar resolver a parte de permissões da apostila. Ele esta funcionando com uma permisão unica, se existe o Role ele acessa se não existe o Role, não acessa
Seguinte, tenho as seguintes paginas:
Role.jsp
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Role {
String value();
}
Autorizadorintercept.java
public class AutorizadorInterceptor implements Interceptor {
@In(scope=ScopeType.SESSION, required=false)
private Usuario usuario;
public void intercept(LogicFlow flow) throws LogicException, ViewException {
// pega request e response
HttpServletRequest request = flow.getLogicRequest().getRequest();
HttpServletResponse response = flow.getLogicRequest().getResponse();
try {
// usuario nao esta logado
if (this.usuario == null) {
// redireciona pro login
response.sendRedirect("admin.login.logic");
}else{ // usuario esta logado
//pega anotacao @Role no metodo da logica
Role role = flow.getLogicRequest().getLogicDefinition()
.getLogicMethod().getMetadata().getAnnotation(Role.class);
// tem role definido
if (role != null) {
// se usuario tem o role pedido, executa
if (this.usuario.hasRole(role.value())) {
flow.execute();
} else {
// sem permissao, vai pra admin.semrole.logic
request.getRequestDispatcher("semrole.jsp").forward(request, response);
}
} else {
//nao tem role, entao pode executar
flow.execute();
}
}
} catch (Exception e) {
throw new LogicException(e);
}
}
}
UsuarioLogic.java
//adiciona um usuario
@Role("admin")
public void adiciona(Usuario usuario) {
// ... logica de adicionar no banco aqui...
this.daoFactory.beginTransaction();
this.daoFactory.getUsuarioDao().adiciona(usuario);
this.daoFactory.commit();
//System.out.println("Adiciona usuario");
}
//remove um Usuario
@Role("admin")
public void remove(Usuario usuario) {
this.daoFactory.beginTransaction();
this.daoFactory.getUsuarioDao().remove(usuario);
this.daoFactory.commit();
}
Como fazer sua anotação aceitar mais de um Role para o mesmo método?
Role.jsp
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Role {
String[] value();
}
E usar esses valores nos métodos assim:
UsuarioLogig.java
//adiciona um usuario
@Role({"admin", "operador"})
public void adiciona(Usuario usuario) {
// ... logica de adicionar no banco aqui...
this.daoFactory.beginTransaction();
this.daoFactory.getUsuarioDao().adiciona(usuario);
this.daoFactory.commit();
//System.out.println("Adiciona usuario");
}
//remove um Usuario
@Role({"admin", "operador"})
public void remove(Usuario usuario) {
this.daoFactory.beginTransaction();
this.daoFactory.getUsuarioDao().remove(usuario);
this.daoFactory.commit();
}
Como posso mudar o Autorizadorintercept.java para aceitar essas novas permissões?
Aguardo um help.