Controle de Acesso/Login com VRaptor 3 e GAE

Ahe galera!

Estou desenvolvendo um projetinho no GAE usando o VRaptor 3.

Gostaria de saber se alguem ja faz alguma implementação de login usando a infraestrutura do Google?

Grato

Mikhas , estou modelando isso, poderíamos nos ajudar ? kafkapvh@hotmail.com —msn

Hmm, esse tópico é um pouco antigo, mas vamos lá…

Eu fiz isso. Estou criando um projetinho de testes que nada mais é que uma ferramenta de blogging que eu já tenho, porém estou portando ela para o GAE e pretendo disponibilizar sobre licença MIT ou BSB daqui há algum tempo.

O que eu fiz foi configurar o JAAS no web.xml conforme a documentação do GAE/J. Após isso basta você acessar via request.getUserPrincipal() que você tem os dados do usuário. Além disso há uma classe que disponibiliza os dados do usuário.

http://code.google.com/appengine/docs/java/gettingstarted/usingusers.html

Você também pode fazer no vraptor3 uma classe de escopo session que carrega os dados do usuário.

Configurando o web.xml: http://code.google.com/appengine/docs/java/config/webxml.html#Security_and_Authentication

Sobre o controle de usuários
http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/users/package-summary.html
http://code.google.com/appengine/docs/java/gettingstarted/usingusers.html

Lembrando que quando você cria sua APP no GAE/J você escolhe o tipo de acesso: se qualquer um ou apenas os usuários definidos como desenvolvedores e administradores do projeto.

[code]
@Component
@SessionScoped
public class UserSession {
private User theUser;

void init() {
    theUser = UserServiceFactory.getUserService().getCurrentUser();
}

public String getAuthDomain() {
    return theUser.getAuthDomain();
}

public String getEmail() {
    return theUser.getEmail();
}

public String getNickname() {
    return theUser.getNickname();
}

public String getUserId() {
    return theUser.getUserId();
}

}[/code]

Gostaria de uma ajuda referente ao controle de acesso junto ao gae?

Já consegui fazer funcionar, mas estou utilizando o vraptor agora e to perdido.

Eu comecei a esboçar a classe LoginInterception, mas realmente não sei mais o q fazer.

  • meu construtor: Sei que tem problema em colocar o UserService, dá erro dizendo que não consegue criar o bean. não sei se definitivamente tenho q tirá-lo ou está faltando algo.
private final UserService userService;  
private final Result result;  
private final HttpServletRequest req;  
private final HttpServletResponse resp;  
  
public LoginInterceptor(UserService userService, Result result,  
        HttpServletRequest req, HttpServletResponse resp) {  
    this.userService = userService;  
    this.result = result;  
    this.req = req;  
    this.resp = resp;  
}  
  • na classe intercepts eu nao sei como irei fazer o para receber o usuario e redirecionar a pagina como userService.createLoginURL(req.getRequestURI());
public void intercept(InterceptorStack stack, ResourceMethod method,  
            Object resourceInstance) throws InterceptionException {  
                         //TODO }  

Estou vendo alguns códigos, mas usam o vraptor2 …
bom … se tiver um ideia valeu.

abraço

fredericosm, você está usando o sistema de login próprio ou usando a base de usuários do GAE/J conforme eu descrevi acima?

Aqui no site do Vraptor há uma documentação bem ampla sobre Vraptor3: http://vraptor.caelum.com.br

Estou utilizando a base de usuarios do GAE/J.
Já consegui fazer bastante coisa com o vraptor, criei os controllers , as jsp’s, as classes POJO’s … estou utilizando JDO e consigo persistir dados, mostrar na tela …
Me problema está em conseguir fazer o login no GAE … tu tens alguma ideia de como partir …

Obrigado.

Eu ainda não implementei nada concreto no GAE/J, apenas testes mesmo, já que achei a infra deles um pé no saco.

Sua aplicação precisa de login para qualquer página ou apenas para algumas? Se tua aplicação precisa de login em todas as páginas você pode usar um exemplo que usei nesse post aqui: http://www.guj.com.br/posts/list/201713.java

O que eu fiz foi criar um simples pojo com as propriedades que eu queria, exemplo:

[code]@SessionScoped
public class UserSession {
private UserCredentials credentials;

public UserSession(HttpServletRequest request) {
    login = request.getUserPrincipal().getName();
}

@PostConstruct
public void init() {
    AuthenticationRemote service = ServiceLocator.lookup(AuthenticationRemote.class);
    credential = service.afterJaasAuthentication(login);
}

public String name() {
    return credentials.getName();
}

[...]

}[/code]

Depois criei um simples interceptor que serve apenas para poder inicializar o objeto UserSession. Na verdade meu interceptor é um pouco mais do que isso, pois ele tem controle de session-hijack, mas para exemplo ele pode servir assim.

[code]@Intercepts
@RequestScoped
public class SecurityUserSessionHolder
implements Interceptor {

private final UserSession userSession;

public SecurityUserSessionHolder(UserSession userSession) {
    this.userSession = userSession;
}

public boolean accepts(ResourceMethod method) {
    return true; //accept all
}

public void intercept(InterceptorStack stack, ResourceMethod method, Object object)
    throws InterceptionException {
    stack.next(method, object);
}

}[/code]

Acho que é apenas isso. O resto o pseudo-JAAS do GAE/J faz para você.

Analisando a documentação em http://code.google.com/appengine/docs/java/users/overview.html e http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/users/package-summary.html notei que dá para fazer beeeem mais simples no GAE/J. Você nem precisa de interceptor. Basta fazer algo conforme o código abaixo.

Dessa forma você tem os dados do usuário autenticado em cache e gerenciado pelo vraptor, facilitando assim injetá-lo nas suas classes. Basta apenas essa única classe. Obviamente ela só funciona se todas as páginas de sua aplicação precisam de login. Caso você tenha algumas páginas públicas será necessário fazer ajustes.

[code]@SessionScoped
public class UserSession {
private User delegate;

@PostConstruct
public void init() {
    delegate = UserServiceFactory.getUserService().getCurrentUser();
}

public String getAuthDomain() {
    return delegate.getAuthDomain();
}

public String getEmail() {
    return delegate.getEmail();
} 

public String getNickname()  {
    return delegate.getNickname();
}

public String getUserId()  {
    return delegate.getUserId();
}

}[/code]

Valeu Garcia,

Com o que vc postou vou ver o posso fazer na minha aplicação.

Minha aplicação roda nos servidores do google, então, acredito que preciso apenas a autenticação na primeira vez que faço login, pois somente assim consigo utilizar a aplicação.

Já rodei a aplicação sem o vraptor e funcionou.

valeu pelas dicas
Abraço.