Về lỗi đăng nhập không thành công trên spring boot

Chào các bạn, mình đang viết 1 ứng dụng web bằng angular + spring boot có một chỗ ở phần thông báo cho người dùng biết username hoặc password nhập vào không đúng nhưng vẫn chưa giải quyết được, hy vọng được các bạn giúp đỡ

Phần login bằng angular

Service

constructor(private httpClient: HttpClient) { }

public login(username: String, password: String): Observable<boolean> {
	let headers = new HttpHeaders({
		"Content-Type": "application/json;charset=UTF-8"
	});
	let body = JSON.stringify({ username: username, password: password });
	return this.httpClient.post<any>(this.loginUrl, body, { headers: headers, observe: 'response' }).pipe(
		map(resp => {
			console.log(resp);
			if (resp.headers.has("Authorization")) {
				this.user = JSON.parse(JSON.stringify(resp.body));
				let token = resp.headers.get("Authorization");
				localStorage.setItem("token", token);
				return true;
			}
			return false;
		})
	);
}

Component

public login() {
    this.authService.login(username, password).subscribe(
      success => {
        // login successful
        console.log(success);
      }, error => {
        // login failed
        console.log(error);
      }
    );
}

Phần server

public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter {
	@Override
	protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response,
			AuthenticationException exception) throws IOException, ServletException {
		LOGGER.info("Failed authentication while attempting to access " + URL.getPathWithinApplication(request));
		response.setStatus(401);
		response.setContentType("application/json");
		Res res = new Res(401, "Username hoặc password is incorrect!");
		String json = JSONUtils.objectToJSON(res);
		response.getWriter().write(json);
		response.getWriter().flush();
	}
}

Kết quả test trên postman thì thấy được đoạn thông báo này

Nhưng trên trình duyệt chỉ thấy được chữ OK

Giả sử username và password bạn nhập vào là hơp lệ, có hai chi tiết bạn cần cho biết rõ hơn:

  1. Error message trong JavaScript console không giống với error message trong filter unsuccessfulAuthentication của bạn (trong filter là Username hoặc password is incorrect! nhưng trong console là Username or password is incorrect!). Vì sao vậy?
  2. Bạn không đưa ra hàm dùng để authentication ở Server, filter unsuccessfulAuthentication chỉ được gọi trong trường hợp authentication không thành công. Như vậy phần xử lý để so sánh username và pasword cũng như tạo ra token nếu username và password hợp lệ ở đâu? Bạn có dùng AuthenticationManager của Spring boot hay không? Nếu có thì bạn có thể debug để xem các giá trị được truyền vào phương thức authenticate của AuthenticationManager là gì.

Cũng không loại trừ trường hợp password của bạn sai (có thể do lỗi nhập hoặc chương trình đánh tiếng Việt sửa đổi password của bạn mà bạn không biết).

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?