Plugin Vraptor-shiro. Sempre retorna uma nova instância do Subject

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?

Bom dia. Você conseguiu resolver esse problema? Qual configuração estava faltando?

Boa tarde, @admwagner,

Rapaz, fiz diversas implementações, inclusive tentei re-implenentar algumas classes do shiro pra usar a sessão do servidor, mas sem sucesso. o Subject não é um objeto serializável, ou seja, não dá pra colocar a aplicação com Shiro (original) em cluster. Portanto, usei o Shiro apenas como modelo e implementei meu próprio componente de segurança. Não consegui fazer o Shiro funcionar a contento. Desisti.