私はSpring BootでREST API用のAuthサーバを実装しようとしています。自分のユーザリポジトリを設定にautowireしようとしています。誰かがこれを正しく行う方法を提案できますか? Spring Boot OAuth2とUserDetails
I次認証サーバーの構成を有する:@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 )。
私は、このコマンドを使用して、私のデータベースから一部のユーザーを認証するために試してみてください。私は次の応答を取得
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をひそかことはできませんが、私はそれが匿名のクラスなので正しく構築する方法を理解できません。