[SPRING] OAuth2 및 JWT를 사용한 스프링 보안 : 암호화 된 암호가 BCrypt처럼 보이지 않습니다.
SPRINGOAuth2 및 JWT를 사용한 스프링 보안 : 암호화 된 암호가 BCrypt처럼 보이지 않습니다.
JWT를 사용하여 Spring AuthorizationServer를 구현하려고합니다. BCWrypt를 믹스에 추가 할 때까지 JWT 토큰을 생성하고 로그인 할 수있었습니다. 이제 로그인을 시도 할 때 API에서 "잘못된 자격 증명"을받습니다.
OAuth2Configuration.java
@Configuration
@EnableAuthorizationServer
public class OAuth2Configuration extends AuthorizationServerConfigurerAdapter {
private DataSource dataSource;
private AuthenticationManager authenticationManager;
private BCryptPasswordEncoder passwordEncoder;
public OAuth2Configuration(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
this.dataSource = new Jdbc3PoolingDataSource();
this.passwordEncoder = new BCryptPasswordEncoder();
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.passwordEncoder(passwordEncoder);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("api-client")
.secret("verysecretivesecret")
.scopes("READ", "WRITE", "DELETE")
.authorizedGrantTypes("implicit", "refresh_tokens", "password", "authorization_code");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authorizationCodeServices(authorizationCodeServices())
.tokenStore(tokenStore())
.tokenEnhancer(jwtTokenEnhancer())
.authenticationManager(authenticationManager);
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(jwtTokenEnhancer());
}
@Bean
protected JwtAccessTokenConverter jwtTokenEnhancer() {
return new JwtAccessTokenConverter();
}
@Bean
protected AuthorizationCodeServices authorizationCodeServices() {
return new JdbcAuthorizationCodeServices(dataSource);
}
}
WebSecurityConfig.java
@Configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private AccountDetailsService accountDetailsService;
private BCryptPasswordEncoder passwordEncoder;
private DataSource dataSource;
WebSecurityConfig(AccountDetailsService accountDetailsService) {
this.accountDetailsService = accountDetailsService;
this.dataSource = new Jdbc3PoolingDataSource();
this.passwordEncoder = new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(accountDetailsService).passwordEncoder(passwordEncoder).and().jdbcAuthentication().dataSource(dataSource);
}
}
SeedData.java
@Override
public void run(String... args) throws Exception {
Stream.of("alan,test").map(x -> x.split(","))
.forEach(tuple -> {
Account user = new Account();
user.setUsername(tuple[0]);
user.setPassword(new BCryptPasswordEncoder().encode(tuple[1]));
user.setEmail(tuple[0]);
user.setRoles(Collections.singletonList(role));
user.setActive(true);
this.accountRepository.save(user);
});
}
당신의 도움을 주셔서 감사합니다.
해결법
-
==============================
1.나는 그것을하기 위해 다음과 같은 변화를 만들어야했다. 다른 사람이 필요하면.
나는 그것을하기 위해 다음과 같은 변화를 만들어야했다. 다른 사람이 필요하면.
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(accountDetailsService) .passwordEncoder(passwordEncoder) .and() .authenticationProvider(authenticationProvider()) .jdbcAuthentication() .dataSource(dataSource); } @Bean public DaoAuthenticationProvider authenticationProvider() { DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider(); authenticationProvider.setUserDetailsService(accountDetailsService); authenticationProvider.setPasswordEncoder(passwordEncoder); return authenticationProvider; }
-
==============================
2.이는 WebSecurity와 AuthorizationServer에 둘 다 BCrypt를 적용했기 때문입니다. 따라서 저장소에 암호화 된 사용자 암호를 BCrypt로 저장하지 말고 OAuth2에 대해 암호화 된 클라이언트 암호를 BCrypt로 유지해야합니다. 나는 이것이 당신이 접근하려고 한 것이 아니란 것 같아요.
이는 WebSecurity와 AuthorizationServer에 둘 다 BCrypt를 적용했기 때문입니다. 따라서 저장소에 암호화 된 사용자 암호를 BCrypt로 저장하지 말고 OAuth2에 대해 암호화 된 클라이언트 암호를 BCrypt로 유지해야합니다. 나는 이것이 당신이 접근하려고 한 것이 아니란 것 같아요.
코드를 작동 시키려면 다음 중 하나를 제거하십시오.
@Override public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { security.passwordEncoder(passwordEncoder); }
또는 귀하의 "비밀 자격 박탈"
from https://stackoverflow.com/questions/40699532/spring-security-with-oauth2-and-jwt-encoded-password-does-not-look-like-bcrypt by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Batch : 높은 볼륨 및 낮은 대기 시간에 사용할 ItemReader 구현 (0) | 2019.03.20 |
---|---|
[SPRING] 테스트 목적으로 스프링 부트에서 db connection을 모의 (mock) 할 수 있습니까? (0) | 2019.03.20 |
[SPRING] @Async 및 @Transactional : 작동하지 않음 (0) | 2019.03.20 |
[SPRING] Spring Data REST - 관계가있는 새로운 엔티티 POST (0) | 2019.03.20 |
[SPRING] 부두 시동 지연 (0) | 2019.03.20 |