我已经实现了一个自定义UserDetailsService,它可以查找用户并允许他们使用密码授予获取oauth 2令牌。该服务指示使用JPA userRepository来查找用户。
这一切都有效,但现在我有一个/ users端点公开可用,将所有用户和密码拉入任何经过身份验证的用户。理想情况下,我希望根本不提供此端点,但如果我使用admin角色对其进行preAuthorize,则在尝试获取登录令牌时也会拒绝所有用户,因此这也不起作用。人们如何解决这个问题?我可以向资源服务器添加一个匹配器,只允许管理员用户,这似乎工作,但我不希望端点可用,将它放在那里是非常可怕的,因此UserDetailsService可以使用它来获取访问令牌? / p>
对你们所做的事情的任何意见都将不胜感激。
//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);
}
}
答案 0 :(得分:0)
我认为您使用的是Spring Data?
在这种情况下,您需要告诉Spring不要导出端点:
@RepositoryRestResource(exported = false)