userDetails不需要查找userDetailsS​​ervice需要查找用户

时间:2017-10-10 21:57:10

标签: spring jpa spring-security spring-security-oauth2 userdetailsservice

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

这一切都有效,但现在我有一个/ users端点公开可用,将所有用户和密码拉入任何经过身份验证的用户。理想情况下,我希望根本不提供此端点,但如果我使用admin角色对其进行preAuthorize,则在尝试获取登录令牌时也会拒绝所有用户,因此这也不起作用。人们如何解决这个问题?我可以向资源服务器添加一个匹配器,只允许管理员用户,这似乎工作,但我不希望端点可用,将它放在那里是非常可怕的,因此UserDetailsS​​ervice可以使用它来获取访问令牌? / 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);
    }


}

1 个答案:

答案 0 :(得分: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