Tenho aqui um objeto simples de sessão que contém os dados do usuário autenticado:
@SessionScoped
public class UserSession implements Serializable {
private Long id;
private String name;
}
Na minha aplicação A o sistema faz autenticação via JAAS e todos os recursos são bloqueados como anonimo, ou seja, o usuário somente acessa as páginas autenticado. Como no JAAS tenho apenas o login do usuário e não os dados completos preciso ir no repositório buscar esses dados. Assim criei nesse mesmo objeto UserSession um método que carrega os dados do usuário.
@PostConstruct
public void init() {
credential = ServiceLocator.lookup(AuthenticationService.class).afterJaasAuthentication(login);
}
Isso funciona muito bem na minha aplicação A, pois como todos os links necessitam de usuário autenticado sempre que o JAAS libera o acesso o vraptor chama meu interceptor de controle de sessão, e com esse UserSession está no construtor os dados do usuário são carregados.
Tenho esse interceptor que faz o controle do usuário que está autenticado.
[code]@Intercepts
@RequestScoped
public class SecurityUserSessionHolder
implements Interceptor {
private final UserSession userSession;
public SecurityUserSessionHolder(UserSession userSession) {
this.userSession = userSession;
}
public boolean accepts(ResourceMethod method) {
// skip ajax requests
return !request.getHeader("accept").contains("application/json");
}
[…]
}[/code]
Porém agora eu tenho uma aplicação B que usa a mesma estrutura do projeto A com JAAS e após o login os dados completos do usuário são carregados do repositório. Porém nessa aplicação B nem todas as telas são bloqueadas. Há algumas telas que são públicas.
Sendo assim quando eu acesso uma página pública sem estar autenticado no JAAS o vraptor inicializa o interceptor SecurityUserSessionHolder, que automaticamente instancia o UserSession, que por sua vez chama o PostLoad e tenta colocar o objeto na http-session. Porém como eu ainda não tenho login no contexto JAAS levo uma null-pointer-exception na cara.
Enfim, o null-pointer é simples de fazer um if, porém eu não quero levar esse UserSession para a http-session, já que na verdade eu ainda não tenho usuário autenticado. Há como fazer isso?
Pensei em tentar algo no método Interceptor.accepts, porém o UserSession é inicializado antes de chamar o accepts, já que está no construtor.
