2016-08-16 24 views
0

私は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をひそかことはできませんが、私はそれが匿名のクラスなので正しく構築する方法を理解できません。

答えて

0

私は春に取り組んでいないのですが、私の記憶は良くないかもしれません。しかし、私が間違っていない場合、あなたはUserDetailsとしてあなたのUserを使いたい、あなたはそれを実装しなければなりません、UserDetailsはインターフェイスです。 :D あなたのクラスの名前を変更することをお勧めします。ユーザーは既にOAuth2ライブラリに存在しています

関連する問題