2016-12-02 5 views
-1

자바 기반 웹 응용 프로그램에서 스프링 보안을 사용하고 있습니다. 확인을 위해 이전 비밀번호를 입력해야하는 비밀번호 변경 화면을 만들어야합니다.봄 보안에서 암호를 변경하는 동안 이전 암호를 일치시키는 방법은 무엇입니까?

사용자가 입력 한 이전 암호가 db의 이전 암호와 일치하는지 확인해야합니다.

봄 보안에서는 어떻게합니까?

다음은 내 스프링 보안 자바 설정입니다.

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Autowired 
    private AccessDecisionManager accessDecisionManager; 

    @Bean 
    @Autowired 
    public AccessDecisionManager accessDecisionManager(AccessDecisionVoterImpl accessDecisionVoter) { 
     List<AccessDecisionVoter<?>> accessDecisionVoters = new ArrayList<AccessDecisionVoter<?>>(); 
     accessDecisionVoters.add(new WebExpressionVoter()); 
     accessDecisionVoters.add(new AuthenticatedVoter()); 
     accessDecisionVoters.add(accessDecisionVoter); 
     UnanimousBased accessDecisionManager = new UnanimousBased(accessDecisionVoters); 
     return accessDecisionManager; 
    } 

    @Override 
    @Autowired 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); 
    } 

    @Bean 
    public PasswordEncoder passwordEncoder(){ 
     PasswordEncoder passwordEncoder = new PasswordEncoder(); 
     passwordEncoder.setStringDigester(stringDigester()); 
     return passwordEncoder; 
    } 

    @Bean 
    public PooledStringDigester stringDigester() { 
     PooledStringDigester psd = new PooledStringDigester(); 

     psd.setPoolSize(2); 
     psd.setAlgorithm("SHA-256"); 
     psd.setIterations(1000); 
     psd.setSaltSizeBytes(16); 
     psd.setSaltGenerator(randomSaltGenerator()); 

     return psd; 
    } 

    @Bean 
    public RandomSaltGenerator randomSaltGenerator() { 
     RandomSaltGenerator randomSaltGenerator = new RandomSaltGenerator(); 
     return randomSaltGenerator; 
    } 

또한 새 사용자를 만들 때 비밀번호를 다음과 같이 설정합니다.

user.setPassword(passwordUtils.encryptUserPassword(user.getPassword())); 


@Component("passwordUtil") 
public class PasswordUtils { 

    @Autowired 
    private PooledStringDigester _stringDigester; 

    public String encryptUserPassword(String originalPassword) { 
     String encryptedPassword = _stringDigester.digest(originalPassword); 
     return encryptedPassword; 
    } 
} 

답변

1

쿼리 PooledStringDigester.matches

public boolean isPasswordsMatch(String newPassword, String passwordFromDb) { 
    return _stringDigester.matches(newPassword, passwordFromDb); 
} 
을 사용합니다 PasswordUtils의 기능을 사용자 이름/이메일/사용자 ID를 사용하여 마지막으로 쓰기로 DB에 저장된 암호