Bem, deixa eu explicar isso direito, hoje minhas pastas no web-inf, se encontram assim:
jsp
- admin
- index
- login
- produto
e para cada um tenho o controller, ou seja so posso acessar /produto pq tenho o produtoController, até ai bacana, mais tem um probleminha.
no meu spring security o intercep está dessa maneira:
<intercept-url pattern="/admin/**" access="ROLE_ADMINISTRADOR" />
<intercept-url pattern="/index/**" access="ROLE_USUARIO" />
<intercept-url pattern="/produto/**" access="ROLE_USUARIO" />
<form-login login-page="/"
always-use-default-target="true"
default-target-url="/index/index.jsp"
authentication-failure-url="/?login_error=invalido" />
só que, toda nova pasta terei que adicionar a intercept-url para a mesma, o que eu queria era:
deixar da seguinte forma:
jsp -
- login
-- login.jsp (onde será o path / da minha aplicação)
- restritro
-- produto
-- index
-- admin
de forma que agora só precisarei ter
<intercept-url pattern="/restrito/admin/**" access="ROLE_ADMINISTRADOR" />
<intercept-url pattern="/restrito/**" access="ROLE_USUARIO" />
é possivel com o vraptor?
Ola maaarkin, normalmente no VRaptor vc utiliza a Annotation @Interceptor e implementa a interface Interceptor em uma classe assim:
@Intercepts
public class Autorizacao implements Interceptor{
private UsuarioWeb usuarioWeb;
private UsuarioController usuarioController;
private Result result;
public Autorizacao(UsuarioWeb usuarioWeb, UsuarioController usuarioController, Result result) {
this.usuarioWeb = usuarioWeb;
this.usuarioController = usuarioController;
this.result = result;
}
@Override
public boolean accepts(ResourceMethod method) {
return !method.containsAnnotation(Liberado.class);
}
@Override
public void intercept(InterceptorStack stack, ResourceMethod method,
Object resourceInstance) throws InterceptionException {
if(this.usuarioWeb.isLogado()){
stack.next(method, resourceInstance);
}else{
this.result.forwardTo("/nao_Autorizado.html");
}
}
}
No meu caso tudo que eu queria que ficasse liberado para qualquer usuario eu fiz uma annotation chamada “Liberado” e anotei os metodos do meu controler que eu queria que ficasse acessiveis para qualquer tipo de usuario.
Tem um documento da Caelum "FJ-28"que explica isso muito bem: http://www.caelum.com.br/curso-vraptor-hibernate/
os paths que vc vai colocar no spring security são os da URL e não os dos jsps.
na convenção do VRaptor os dois paths são parecidos, mas vc pode mudar colocando no controller:
@Resource
@Path("/restrito/bolinha")
public class BolinhaController {
public void seuMetodo() {
}
}
daí a url do método fica …/restrito/bolinha/meuMetodo
mas ai no caso, todos os meus controllers tenho que modificar para ficar
@Path("/restrito/produto")
public class ProdutoController
correto?
o que vc pode fazer pra facilitar é colocar tudo que é restrito dentro do pacote terminado em restrito e sobrescrever um componente do VRaptor pra sempre gerar os controllers com o nome do pacote.
como explicado aqui: http://vraptor.caelum.com.br/pt/docs/sobrescrevendo-as-convencoes-e-comportamento-do-vraptor/
supondo que os seus controllers estão no pacote br.com.suaempresa.controllers, vc faz:
package br.com.suaempresa.controllers.restrito;
@Resource
public class ProdutoController {..}
package br.com.suaempresa.controllers.restrito.admin;
@Resource
public class FinancasController {..}
daí vc cria a classe:
@Component
@ApplicationScoped
public class MeuRoutesParser extends PathAnnotationRoutesParser {
//delegate constructor
protected String extractControllerNameFrom(Class<?> type) {
String prefixo = type.getPackage().getName().replaceFirst("br.com.suaempresa.controllers.?", "");
return prefixo.replace(".", "/") + "/" + super.extractControllerNameFrom(type);
}
}
algo assim deve funcionar.