2016-06-01 10 views
1

Wir entwickeln eine Webanwendung, wir verwenden Spring MVC (zusammen mit Spring Boot und Spring Security) und AngularJS. Daher haben wir zwei verschiedene Server für die Anwendung ausgeführt.AngularJS/Spring MVC, HttpSession nicht persistent

Wir versuchen, das Benutzer-Session-Backend zu speichern, um ein angemessenes Sicherheitsniveau zu gewährleisten, also haben wir versucht, das HttpSession-Objekt zu verwenden, aber jedes Mal, wenn wir die vorhandene Sitzung abrufen möchten, wird eine neue Instanz erstellt. habe die Sitzungs-IDs überprüft).

Hier ist, was wir tun, um sich einzuloggen:

$scope.authenticate = function() { 

    var postObject = new Object(); 
    postObject.mail = $scope.userName; 
    postObject.password = $scope.userPassword; 

    $http({ 
    url: "http://localhost:8080/login", 
    method: "POST", 
    dataType: "json", 
    data: postObject, 
    headers: { 
     "Content-Type": "application/json" 
    } 
    }).success(function successCallback(response, status) { 
     if (status == 200) { 
     $scope.messageAuth = "Login successful" 
     $scope.go('/services'); 
     } 
    }) 
    .error(function errorCallback(error, status) { 
     $scope.messageAuth = "Error " + response; 
    }); 
}; 

Dann überprüfen wir die Anmeldeinformationen, wenn sie richtig sind, speichern wir die Benutzerinformationen in eine neue Sitzung:

@RestController 
public class UserController { 

@Resource 
UserService userService; 

@CrossOrigin 
@RequestMapping(value = "/login", method = RequestMethod.POST, produces = "application/json") 
public ResponseEntity<User> loginSubmit(@RequestBody User user, HttpServletRequest request, HttpSession session) { 
    if (isAuthorized(user)) { 
     User authenticatedUser = this.userService.getUserByMail(user.getMail()); 
     authenticatedUser.setPassword(null); 

     session.invalidate(); 
     HttpSession newSession = request.getSession(true); 
     newSession.setAttribute("USER_ROLE", authenticatedUser.getRole()); 

     System.out.println("/login : SESSION ID = " + newSession.getId()); 
     System.out.println("/login : " + newSession.getAttribute("USER_ROLE")); 

     return ResponseEntity.ok(authenticatedUser); 
    } else { 
     return ResponseEntity.status(HttpStatus.UNAUTHORIZED) 
       .body(null); 
    } 
} 

@RequestMapping("/user") 
public String user(Principal user, HttpServletRequest request, HttpSession session) { 
    System.out.println("/user : SESSION ID = " + session.getId()); 
    System.out.println("/user : " + (String) request.getSession(false).getAttribute("USER_ROLE")); 
    return (String) session.getAttribute("USER_ROLE"); 
} 

Und Von der Angular-App möchten wir die Benutzerinformationen unter folgender Nummer erhalten:

Wir haben schon so gut wie alle, die wir gefunden haben, über die Verwaltung einer Sitzung mit Spring Security ausprobiert, vielleicht kommt das Problem vom Angular-Teil?

Jede Hilfe wäre sehr dankbar,

Vielen Dank im Voraus

+0

Sie verwenden nicht Spring Security Sie arbeiten tatsächlich um es ... –

+0

Danke für das Feedback, und Sie denken, dass es ein Teil des Problems ist? Wir sollten 'HttpSession' trotzdem verwenden können, oder? – Ostro23

+0

Wenn Sie Spring Security verwenden und die Standardeinstellungen '/ login' verwenden, wird von Spring Security abgefangen und Ihr Controller macht nichts. Es sollte nichts daran hindern, eine 'HttpSession' zu verwenden (wir verwenden ein ähnliches Setup für mein aktuelles Projekt). –

Antwort

1

Wir haben die Lösung gefunden, wir brauchen nur ein paar Konfigurations Zeilen in unserer app.js Datei hinzuzufügen:

$httpProvider.defaults.useXDomain = true; 
$httpProvider.defaults.withCredentials = true; 

Mehr Informationen hier: link

Hoffentlich hilft es jemandem, eines Tages!