0

我已经实现了一个自定义 UserDetailsS​​ervice 来查找用户并允许他们使用密码授予获取 oauth 2 令牌。该服务指示使用 JPA userRepository 来查找用户。

这一切都有效,除了现在我有一个 /users 端点公开可用,将所有用户和密码拉入任何经过身份验证的用户。理想情况下,我希望这个端点根本不可用,但是如果我使用管理员角色对其进行预授权,那么所有用户在尝试获取登录令牌时也会被拒绝,所以这也不起作用。人们如何绕过这个问题?我可以向资源服务器添加一个匹配器以仅允许管理员用户,这似乎可行,但我根本不希望端点可用,将它放在那里很可怕,这样 UserDetailsS​​ervice 就可以使用它来获取访问令牌?

任何关于你们所做的事情的意见将不胜感激。

//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);
    }


}
4

1 回答 1

0

我想你正在使用 Spring Data?

在这种情况下,您需要告诉 Spring 不要导出端点:

@RepositoryRestResource(exported = false)

https://docs.spring.io/spring-data/rest/docs/current/api/org/springframework/data/rest/core/annotation/RepositoryRestResource.html

于 2017-10-12T09:21:31.243 回答