[SPRING] UserDetails getPassword는 봄 보안 3.1에서 null을 반환합니다. 현재 로그인 한 사용자의 비밀번호를 얻는 방법은 무엇입니까?
SPRINGUserDetails getPassword는 봄 보안 3.1에서 null을 반환합니다. 현재 로그인 한 사용자의 비밀번호를 얻는 방법은 무엇입니까?
스프링 보안을 사용하여 비밀번호 변경 기능을 구현했지만 ((UserDetails) principal) .getPassword ())는 로그인 한 사용자에 대해 null을 반환합니다.
내가 정확하게 기억한다면, 이전 3.0에서 사용 되곤했습니다. 3.1에서 변경 되었기 때문에 로그인 한 사용자의 현재 암호를 검색 할 수 없습니까?
아래 코드에서 웹 페이지에서 사용자 비밀번호로 입력 한 현재 비밀번호를 확인하고 있습니다. 그런 다음 로그인 한 사용자의 비밀번호가 입력 한 비밀번호와 일치하는지 확인합니다. 그렇다면 oldPasswordMatchNewPassword = true로 설정하고 싶습니다.
이 기능을 어떻게 구현합니까?
@RequestMapping(value = "/account/changePassword.do", method = RequestMethod.POST)
public String submitChangePasswordPage(
@RequestParam("oldpassword") String oldPassword,
@RequestParam("password") String newPassword) {
Object principal = SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
String username = principal.toString();
if (principal instanceof UserDetails) {
username = ((UserDetails) principal).getUsername();
System.out.println("username: " + username);
System.out.println("password: "
+ ((UserDetails) principal).getPassword());
if (((UserDetails) principal).getPassword() != null) {
if (((UserDetails) principal).getPassword().equals(oldPassword)) {
oldPasswordMatchNewPassword = true;
}
}
}
if (oldPasswordMatchNewPassword == true) {
logger.info("Old password matches new password. Password will be updated.");
changePasswordDao.changePassword(username, newPassword);
SecurityContextHolder.clearContext();
return "redirect:home.do";
} else {
logger.info("Old password did not match new password. Password will be not be updated.");
return null;
}
}
나는 두 개의 sysout ()을 써서 리턴 된 값을 볼 수있게했다. For ((UserDetails) principal) .getUsername () 올바른 로그인 한 사용자를 볼 수 있습니다. ((UserDetails) principal) .getPassword () null을 리턴합니다.
어떻게 ((UserDetails) 주체) .getPassword ()이 값을 얻습니까?
미리 감사드립니다.
해결법
-
==============================
1.이 문제를 해결하기 위해이 코드 블록 (erase-credentials = "false")을 사용했습니다. 이것이 우아한 해결책인지는 모르지만 문제는 해결되었습니다.
이 문제를 해결하기 위해이 코드 블록 (erase-credentials = "false")을 사용했습니다. 이것이 우아한 해결책인지는 모르지만 문제는 해결되었습니다.
<authentication-manager alias="authenticationManager" erase-credentials="false"> <!-- authentication-provider user-service-ref="userService" --> <authentication-provider> <jdbc-user-service data-source-ref="dataSource" /> </authentication-provider> </authentication-manager>
-
==============================
2.예, 버전 3.1에서 변경되었습니다. 자격 증명은 성공적인 인증 후에 기본적으로 지워집니다. 이를 방지하려면 ProviderManager에서 eraseCredentialsAfterAuthentication을 false로 설정할 수 있습니다. 자세한 내용은 다음을 참조하십시오. http://static.springsource.org/spring-security/site/docs/3.2.x/reference/core-services.html#core-services-erasing-credentials
예, 버전 3.1에서 변경되었습니다. 자격 증명은 성공적인 인증 후에 기본적으로 지워집니다. 이를 방지하려면 ProviderManager에서 eraseCredentialsAfterAuthentication을 false로 설정할 수 있습니다. 자세한 내용은 다음을 참조하십시오. http://static.springsource.org/spring-security/site/docs/3.2.x/reference/core-services.html#core-services-erasing-credentials
-
==============================
3.사용자가 인증 된 후에는 암호가 메모리에 유지되지 않으므로 (일반적으로 좋은 점) 암호를 사용하기 위해 명시 적으로 다시로드해야합니다. 대안적이고보다 유연한 전략은 AuthenticationManager의 인스턴스를 삽입하여 직접 사용하는 것입니다.
사용자가 인증 된 후에는 암호가 메모리에 유지되지 않으므로 (일반적으로 좋은 점) 암호를 사용하기 위해 명시 적으로 다시로드해야합니다. 대안적이고보다 유연한 전략은 AuthenticationManager의 인스턴스를 삽입하여 직접 사용하는 것입니다.
String name = SecurityContextHolder.getContext().getAuthentication(); try { authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(name, oldPassword)); // Update password here with your dao } catch (AuthenticationException e) { // Old password was wrong }
그런 식으로 암호 인코딩 전략과 같은 것에 대해 걱정할 필요가 없습니다. 암호를 일반 텍스트로 저장하면 안됩니다. 그들은 bcrypt 또는 비슷한 것을 사용하여 해시되어야합니다.
from https://stackoverflow.com/questions/14303081/userdetails-getpassword-returns-null-in-spring-security-3-1-how-to-get-password by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] "가장 먼저 10 * FROM T"구문을 사용할 수있는 휴대용 방법이 있습니까? (0) | 2019.01.19 |
---|---|
[SPRING] cvc-complex-type.2.4.c : 일치하는 와일드 카드가 엄격하지만 'mvc : annotation-driven'요소에 대한 선언을 찾을 수 없습니다. (0) | 2019.01.19 |
[SPRING] 봄 - ConstraintValidator [JSR 303 콩 검사기]에 서비스를 주입 (0) | 2019.01.19 |
[SPRING] 유레카 발견 클라이언트 - 선택적 디스 에이블 (0) | 2019.01.19 |
[SPRING] / oauth / token에 유효하지 않은 XSRF 토큰이 있습니다. (0) | 2019.01.19 |