AngularJS 和 Spring 后端 - 从数据库获取密码作为 AngularJS 中的 user.password
AngularJS and Spring backend - Obtaining password from database as user.password in AngularJS
所以我在用户登录时调用登录函数。此函数调用 UserService.GetByEmail,它执行 GET HTTP 请求从数据库中获取用户,如果有 returns 用户作为响应一个输入了登录名的电子邮件的用户。之后,我使用 if (user !== null && user.password === password) { 部分进行身份验证。但是,当我查看控制台输出时,我确实有一个用户变量对象,但我没有 user.password 可以与密码进行比较。如何将响应中的用户密码放入 user.password?
(function () {
'use strict';
angular
.module('app')
.factory('AuthenticationService', AuthenticationService);
AuthenticationService.$inject = ['$http', '$cookieStore', '$rootScope', '$timeout', 'UserService'];
function AuthenticationService($http, $cookieStore, $rootScope, $timeout, UserService) {
var service = {};
service.Login = Login;
service.SetCredentials = SetCredentials;
service.ClearCredentials = ClearCredentials;
return service;
function Login(email, password, callback) {
$http.post('/user/authenticate', { username: username, password: password })
.success(function (response) {
callback(response);
});
}
然后这是我在后端的 UserController 的一部分。
@RequestMapping(value = "/user/authenticate", method = RequestMethod.POST)
public ResponseEntity<Void> authenticateUser(@RequestBody User user, UriComponentsBuilder ucBuilder) {
}
我不确定我应该如何在后端进行身份验证。执行此操作需要哪些步骤?
有几件事:
- 这不可能是所有涉及的代码:不清楚 UserService 对象或 AuthenticationService 工厂函数是什么。
- 此外,人们预计您无论如何都不会有密码进行比较(这有点安全漏洞)。
相反,如果 HTTP 状态代码为 200(或其他 2xx 代码,具体取决于后端),则应认为身份验证成功。通常,这意味着如果您输入承诺的 then()
子句,则登录必须成功,因为 4xx 代码将被映射到失败并通过 catch()
报告。
您不应该以任何形式向客户端发送密码。如果您使用 Spring 安全性,则需要调用服务器上的登录处理程序。
您应该考虑使用 JWT 之类的东西(在此处阅读更多内容 https://www.toptal.com/java/rest-security-with-jwt-spring-security-and-java),或者如果您出于某种原因确实需要使用基于表单的安全性,您可以使用此代码块登录服务器.
this.login = function (username, password, rememberMe) {
if (rememberMe === undefined) rememberMe = false;
return $http.post(
'/j_spring_security_check',
$.param({
j_username: username,
j_password: password,
j_remember: rememberMe
}),
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'X-Requested-With': 'XMLHttpRequest'
}
}
).then(_.bind(function (response) {
if (response.data.success === true) {
//something to happen on login
}
return $q.reject(response);
}, this));
};
this.logout = function () {
$http.get('/j_spring_security_logout').then(_.bind(function () {
//something to happen on logout
}, this));
};
所以我在用户登录时调用登录函数。此函数调用 UserService.GetByEmail,它执行 GET HTTP 请求从数据库中获取用户,如果有 returns 用户作为响应一个输入了登录名的电子邮件的用户。之后,我使用 if (user !== null && user.password === password) { 部分进行身份验证。但是,当我查看控制台输出时,我确实有一个用户变量对象,但我没有 user.password 可以与密码进行比较。如何将响应中的用户密码放入 user.password?
(function () {
'use strict';
angular
.module('app')
.factory('AuthenticationService', AuthenticationService);
AuthenticationService.$inject = ['$http', '$cookieStore', '$rootScope', '$timeout', 'UserService'];
function AuthenticationService($http, $cookieStore, $rootScope, $timeout, UserService) {
var service = {};
service.Login = Login;
service.SetCredentials = SetCredentials;
service.ClearCredentials = ClearCredentials;
return service;
function Login(email, password, callback) {
$http.post('/user/authenticate', { username: username, password: password })
.success(function (response) {
callback(response);
});
}
然后这是我在后端的 UserController 的一部分。
@RequestMapping(value = "/user/authenticate", method = RequestMethod.POST)
public ResponseEntity<Void> authenticateUser(@RequestBody User user, UriComponentsBuilder ucBuilder) {
}
我不确定我应该如何在后端进行身份验证。执行此操作需要哪些步骤?
有几件事:
- 这不可能是所有涉及的代码:不清楚 UserService 对象或 AuthenticationService 工厂函数是什么。
- 此外,人们预计您无论如何都不会有密码进行比较(这有点安全漏洞)。
相反,如果 HTTP 状态代码为 200(或其他 2xx 代码,具体取决于后端),则应认为身份验证成功。通常,这意味着如果您输入承诺的 then()
子句,则登录必须成功,因为 4xx 代码将被映射到失败并通过 catch()
报告。
您不应该以任何形式向客户端发送密码。如果您使用 Spring 安全性,则需要调用服务器上的登录处理程序。
您应该考虑使用 JWT 之类的东西(在此处阅读更多内容 https://www.toptal.com/java/rest-security-with-jwt-spring-security-and-java),或者如果您出于某种原因确实需要使用基于表单的安全性,您可以使用此代码块登录服务器.
this.login = function (username, password, rememberMe) {
if (rememberMe === undefined) rememberMe = false;
return $http.post(
'/j_spring_security_check',
$.param({
j_username: username,
j_password: password,
j_remember: rememberMe
}),
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'X-Requested-With': 'XMLHttpRequest'
}
}
).then(_.bind(function (response) {
if (response.data.success === true) {
//something to happen on login
}
return $q.reject(response);
}, this));
};
this.logout = function () {
$http.get('/j_spring_security_logout').then(_.bind(function () {
//something to happen on logout
}, this));
};