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
Sie verwenden nicht Spring Security Sie arbeiten tatsächlich um es ... –
Danke für das Feedback, und Sie denken, dass es ein Teil des Problems ist? Wir sollten 'HttpSession' trotzdem verwenden können, oder? – Ostro23
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). –