2016-08-16 10 views
0

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.

Antwort

0

Es ist lange her, dass ich nicht am Frühling gearbeitet habe, mein Gedächtnis könnte nicht gut sein. Aber wenn ich nicht falsch liege, möchten Sie Ihren Benutzer als UserDetails verwenden, Sie müssen es implementieren, UserDetails ist eine Schnittstelle. : D Und ich empfehle, den Namen Ihrer Klasse zu ändern, Benutzer ist bereits in OAuth2-Bibliothek

vorhanden
Verwandte Themen