복붙노트

[SPRING] UserDetails getPassword는 봄 보안 3.1에서 null을 반환합니다. 현재 로그인 한 사용자의 비밀번호를 얻는 방법은 무엇입니까?

SPRING

UserDetails 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. ==============================

    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. ==============================

    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. ==============================

    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 또는 비슷한 것을 사용하여 해시되어야합니다.

  4. 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