스프링 부트에서 내 REST API에 대한 인증 서버를 구현하려고하는데 구성에 자체 사용자 저장소를 autowire하는 데 어려움을 겪고 있습니다. 누군가가이를 정확하게 수행 할 수있는 방법을 제안 할 수 있습니까? 스프링 부트 OAuth2 및 UserDetails
나는 다음과 같은 인증 서버 구성을 가지고 :@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Autowired
@Qualifier("userDetailsService")
private UserDetailsService userDetailsService;
@Autowired
private AuthenticationManager authenticationManager;
@Value("${gigsterous.oauth.tokenTimeout:3600}")
private int expiration;
@Override
public void configure(AuthorizationServerEndpointsConfigurer configurer) throws Exception {
configurer.authenticationManager(authenticationManager);
configurer.userDetailsService(userDetailsService);
configurer.accessTokenConverter(accessTokenConverter());
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("gigsterous")
.secret("secret")
.accessTokenValiditySeconds(expiration)
.scopes("read", "write")
.authorizedGrantTypes("password", "refresh_token")
.resourceIds("resource");
}
/**
* Use custom jwt token converter to enhance the token with custom fields
*
* @return CustomTokenConverter
*/
@Bean
public CustomTokenConverter accessTokenConverter() {
return new CustomTokenConverter();
}
}
사용자 서비스 :
@Service("userDetailsService")
public class UserService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
public List<User> getUsers() {
return userRepository.findAll();
}
public User getUser(Long id) {
return userRepository.findById(id);
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return (UserDetails) userRepository.findOneByUsername(username);
}
}
사용자 :
@Entity
@Table(name = "users")
@Getter
@Setter
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id", nullable = false, updatable = false)
private Long id;
@Column(name = "email", nullable = false, unique = true)
private String email;
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(name = "password", nullable = false)
private String password;
protected User() {
// hibernate
}
}
나는 철새 이동 경로를 사용하여 현재의 H2에서 내 사용자를 저장하고 메모리 데이터베이스 (이 올바르게 작동하므로 내 질문에서이 코드 부분을 생략하면 conf를 피할 수 있습니다. usion). 나는 다음과 같은 응답을 얻을
curl -X POST --user 'gigsterous:secret' -d 'grant_type=password&username=peter&password=password' http://localhost:9000/gigsterous-auth/oauth/token
: :이 명령을 사용하여 내 데이터베이스에서 일부 사용자에게 권한을 부여 할 때
은 분명히
{"error":"unauthorized","error_description":"com.gigsterous.auth.domain.User cannot be cast to org.springframework.security.core.userdetails.UserDetails"}
를, 내가 UserDetails
개체로 내 사용자 POJO 은밀한 할 수는 없지만 익명의 클래스이기 때문에 올바르게 생성하는 방법을 알 수 없습니다.