Vraptor Authentication + AngularJs

1

I am trying to authenticate users on my system, however I am somewhat lost. How do I return the user logged in from the server pro front-end ?

Currently I can check if the user exists in my database as follows:

@Post
@Path(value = "/auth")
@Consumes(value = "application/json", options = WithoutRoot.class)
private void autenticar(Usuario usuario){
    if(usuarioDAO.autenticar(usuario.getCodigo(), usuario.getSenha()) != null){
        //Se o usúario existir retorna OK, como retornar o usuário logado caso exista?
        result.use(Results.status()).ok();      
    }else{
        //Retorna um erro
    }

}

Front-end:

Service:

angular.module("oraculo").factory("usuarioAPI", function ($http, config) {

    var _getUsuario = function(usuario){
        return $http.post(config.baseURL + "/Oraculo/usuario/usuario", usuario);
    };

    return {
        getUsuario: _getUsuario

    };
});

Controller:

angular.module("oraculo").controller("loginCtrl", function($scope, $routeParams, usuarioAPI){

    $scope.autenticar = function(usuario){
        console.log("usuario" +usuario)
        usuarioAPI.getUsuario(usuario).success(function(data) {
            sessionStorage.setItem('userLogado', data) //objeto de usuário.
            var user = sessionStorage.getItem("userLogado");
            console.log("usuario:" +user.login)
        })
        .error(function(response, status) {
            console.log("erro " + status);

        });

    }

});
    
asked by anonymous 29.09.2015 / 15:33

1 answer

1

EDIT 1

Do the following:

@Inject
private Result result;

@Inject
private UsuarioDAO usuarioDAO;

@Path(value = "/auth")
@Consumes(value = "application/json", options = WithoutRoot.class)
private void autenticar(Usuario usuario){
    Usuario usuario = usuarioDAO.autenticar(usuario.getCodigo(), usuario.getSenha());
    boolean usuarioValido = usuario != null;

    if(usuarioValido){
        result.use(json()).from(usuario).serialize();
        result.use(Results.status()).ok();      
    }else{
        //Retorna um erro
    }
}

EDIT 2

To create a global angle variable you can use a service that caches the user:

var myApp = angular.module('myApp',[]);
myApp.factory('UserService', function() {
  var usuarioLogado;
  if(usuarioLogado) 
     return usuarioLogado;
  else{
      /* aqui roda tua consulta para o back-end e com o retorno popula a variável usuario logado */
      return usuarioLogado;
  }

});

no controller:

function MyCtrl($scope, UserService) {
   console.log(UserService.usuarioLogado);
}

Another alternative is to use $ rootScope:

function MyCtrl($scope, $rootScope) {
   $rootScope.usuarioLogago = /* aqui passa o teu usuario retornado pelo back-end*/ 
}

$ rootScope is a global variable shared by all angular controllers. In other words, what you set it will be visible to other controllers.

EDIT 3

Complete example:

angular.module("oraculo").factory("$servicoGenerico", function($http, $q, $injector) {
    function ajax(url, parametros, metodo) {
        var requisicao = $http({
            method: metodo,
            url: url,
            data:parametros
        });

        var promessa = requisicao.then(function(resposta) {
                return(resposta.data);
            },
            function(resposta) {
                return($q.reject("Something went wrong"));
            }
        );
        return promessa;
    }
    return({
        ajax:ajax
    });
});

angular.module("oraculo").factory("$usuario", function($servicoGenerico, config) {
    return {
        logar : function(usuario) {
            var promessa = $servicoGenerico.ajax(config.baseURL + "/Oraculo/usuario/usuario", usuario, "POST");
            return promessa;
        }
    };
});

angular.module("oraculo").controller("loginCtrl", function($scope, $usuario, $rootScope){
    $scope.autenticar = function(usuario){
        console.log("usuario" +usuario);
        return $usuario.logar(usuario);
    };

    $scope.getUsuarioCorrente = function(){
        if($rootScope.usuarioLogado)
            return $rootScope.usuarioLogado;

        $scope.autenticar("<passa aqui o usuario>").then(function(usuarioLogado){
            $rootScope.usuarioLogado = usuarioLogado;
            return usuarioLogado;
        });
    };
});
    
29.09.2015 / 16:01