Ich versuche, einen Auth-Server für meine REST-API in Spring Boot zu implementieren, und ich habe Schwierigkeiten, mein eigenes Benutzer-Repository in die Konfiguration zu autowire. Könnte jemand vorschlagen, wie man das richtig macht?Spring Boot OAuth2 und UserDetails
Ich habe folgende Auth-Server-Konfiguration:
@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();
}
}
Benutzerservice:
@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);
}
}
Benutzer:
@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
}
}
ich Flyway bin mit und zur Zeit meine Benutzer in H2 Speicherung in Speicher-Datenbank (das funktioniert richtig, so dass ich diesen Teil des Codes aus meiner Frage weglasse, um conf zu vermeiden usion).
Wenn ich versuche, einige Benutzer aus meiner Datenbank zu genehmigen mit diesem Befehl:
curl -X POST --user 'gigsterous:secret' -d 'grant_type=password&username=peter&password=password' http://localhost:9000/gigsterous-auth/oauth/token
ich die folgende Antwort erhalten:
{"error":"unauthorized","error_description":"com.gigsterous.auth.domain.User cannot be cast to org.springframework.security.core.userdetails.UserDetails"}
Anscheinend kann ich nicht meinen Benutzer POJO in UserDetails
Objekt verdeckte aber Ich kann nicht herausfinden, wie man es richtig konstruiert, da es eine anonyme Klasse ist.