2016-08-16 4 views
0

스프링 부트에서 내 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 은밀한 할 수는 없지만 익명의 클래스이기 때문에 올바르게 생성하는 방법을 알 수 없습니다.

답변

0

나는 봄에 일한 적이 없어서 오랜 시간이 지났지 만, 내 기억이 좋지 않을 수 있습니다. 하지만 내가 틀리지 않다면 User를 UserDetails로 사용하고 UserDetails를 구현해야하며 UserDetails는 인터페이스입니다. : D 그리고 클래스 이름을 변경하는 것이 좋습니다. 사용자는 이미 OAuth2 라이브러리에 있습니다.

관련 문제