om dia pessoal,
Estou tentando usar o plugin vraptor-shiro, segui a documentação passo a passo, mas estou com um problema.
Seguem os códigos:
Controller inicial (login)
@Controller
public class IndexController{
private final Result result;
@Inject Subject currentUser;
@Inject Session userSession;
@Inject private HttpServletRequest request;
/**
* @deprecated CDI eyes only
*/
protected IndexController() {
this(null);
}
@Inject
public IndexController(Result result) {
this.result = result;
}
@Path("/")
public void index() {
}
@Post("/login")
public void login(LoginDTO dto) {
try {
currentUser.login(new UsernamePasswordToken(dto.getUsername(), dto.getPassword(), true));
result.redirectTo("/main");
}
catch (UnknownAccountException e) {
result.redirectTo("/");
}
catch (IncorrectCredentialsException e) {
result.redirectTo("/");
}
catch (LockedAccountException e) {
result.redirectTo("/");
}
catch (ExcessiveAttemptsException e) {
result.redirectTo("/");
}
catch (AuthenticationException e) {
result.redirectTo("/");
}
}
@Get("/logout")
public void logout() {
currentUser.logout();
request.getSession().removeAttribute("currentUser");
}
}
Classe AuthController transcrita da documentação (ipsis litteris)
@Controller
public class AuthController implements AuthorizationRestrictionListener {
@Inject private Result result;
@Override
public void onAuthorizationRestriction(AuthorizationException e) {
result.include("error", e.toString());
result.redirectTo("/");
}
}
AuthService. Para testar o plugin, simulei meu sistema ter apenas o usuário “teste” com senha “123”, com os respectivos papeis e permissões conforme o código abaixo.
public class AuthService implements Permission {
@Override
public User getUserByUsername(String username) {
User user = new User("teste","123");
return user;
}
@Override
public Set<String> getRolesByUser(String username) {
Set<String> papeis = new HashSet<String>();
papeis.add("administrador");
papeis.add("superusuario");
return papeis;
}
@Override
public Set<String> getPermissionsByRole(String role) {
Set<String> permissoes = new HashSet<String>();
permissoes.add("salvar");
permissoes.add("editar");
return permissoes;
}
}
MainController. Classe com o menu principal da minha aplicação.
@Secured
@Controller
public class MainController {
private final Result result;
@Inject Subject currentUser;
@Inject Session userSession;
@Inject HttpServletRequest request;
/**
* @deprecated CDI eyes only
*/
protected MainController() {
this(null);
}
@Inject
public MainController(Result result) {
this.result = result;
}
@RequiresAuthentication
@Path("/main")
public void index() {
//esse bloco não é executado, pois o currentUser aqui já é outro novo (anonymous).
}
}
O @Inject HttpServletRequest request;
ali em cima é apenas para verificar se a sessão permanecia a mesma, e permanece, já a sessão do usuário userSession
é uma nova em cada Controller.
Esqueci de algo? Alguma configuração?
Se eu atribuir o currentUser a seção do HttpServletRequest é possível recupera-lo depois, mas não é possível utilizar as anotações do shiro, por exemplo, @RequiresAuthentication
.
Alguma idéia pessoal?