【问题标题】:Spring Boot OAuth2 and UserDetailsSpring Boot OAuth2 和 UserDetails
【发布时间】:2016-12-22 12:32:55
【问题描述】:

我正在尝试在 Spring Boot 中为我的 REST API 实现身份验证服务器,并且我正在努力将我自己的用户存储库自动连接到配置中。有人可以建议如何正确执行此操作吗?

我有以下认证服务器配置:

@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
    }

}

我正在使用 Flyway,目前将我的用户存储在内存数据库中的 H2 中(这工作正常,所以我从我的问题中省略了这部分代码以避免混淆)。

当我尝试使用此命令从我的数据库中授权某些用户时:

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"}

显然,我无法将我的用户 POJO 转换为 UserDetails 对象,但我无法弄清楚如何正确构造它,因为它是一个匿名类。

【问题讨论】:

    标签: java security spring-boot oauth-2.0


    【解决方案1】:

    好久没玩Spring了,可能记性不太好。但是如果我没记错的话,你想把你的用户用作 UserDetails,你必须实现它,UserDetails 是一个接口。 :D 我建议更改您的班级名称,用户已存在于 OAuth2 库中

    【讨论】:

      猜你喜欢
      • 2020-06-19
      • 2017-05-13
      • 2016-04-02
      • 2015-05-14
      • 2023-03-18
      • 2017-05-28
      • 2019-08-06
      • 1970-01-01
      相关资源
      最近更新 更多