我已经实现了一个自定义 UserDetailsService 来查找用户并允许他们使用密码授予获取 oauth 2 令牌。该服务指示使用 JPA userRepository 来查找用户。
这一切都有效,除了现在我有一个 /users 端点公开可用,将所有用户和密码拉入任何经过身份验证的用户。理想情况下,我希望这个端点根本不可用,但是如果我使用管理员角色对其进行预授权,那么所有用户在尝试获取登录令牌时也会被拒绝,所以这也不起作用。人们如何绕过这个问题?我可以向资源服务器添加一个匹配器以仅允许管理员用户,这似乎可行,但我根本不希望端点可用,将它放在那里很可怕,这样 UserDetailsService 就可以使用它来获取访问令牌?
任何关于你们所做的事情的意见将不胜感激。
//Example code:
// Bad public facing endpoint returning all users and passwords
public interface UserRepository extends JpaRepository<User, Long> {
User findOneByUsername(String username);
}
// Custom user details service used by oauth 2 to get access tokens
// uses userRepo above
@Service("userDetailsService")
public class UserService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return userRepository.findOneByUsername(username);
}
}
// class using user details service
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Qualifier("userDetailsService")
private UserDetailsService userDetailsService;
@Override
public void configure(AuthorizationServerEndpointsConfigurer configurer) throws Exception {
configurer.userDetailsService(userDetailsService);
}
}