0

我已經實現了一個自定義的UserDetailsS​​ervice,它查找一個用戶並允許他們使用密碼授予獲取oauth 2令牌。該服務表示使用JPA userRepository來查找用戶。userRepository不安全,因爲userDetailsS​​ervice需要查找用戶

這一切都有效,但現在我有一個/用戶端點公開可用,將所有用戶和密碼拉入任何經過身份驗證的用戶。理想情況下,我希望根本沒有可用的端點,但是如果我使用管理員角色對其進行preAuthorize,則所有用戶都會在嘗試獲取登錄令牌時被拒絕,所以這也不起作用。人們如何解決這個問題?我可以添加一個匹配器到資源服務器,只允許管理員用戶,這似乎工作,但我不希望終端可用,它是非常可怕的,只要這樣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); 
    } 


} 

回答

0

我認爲你使用的是Spring Data?

在這種情況下,你需要告訴春天不出口端點:

@RepositoryRestResource(exported = false) 

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

+0

謝謝,這是我一直在尋找。 我該如何公開它,以便通過身份驗證的用戶可以訪問他們自己的用戶信息,如電子郵件,個人資料信息,用戶名等? /用戶/ authenticateUser但沒有任何其他端點/ GET /用戶等,因爲這是可怕的打開?最好是創建一個新的控制器說/用戶信息/只有他們的信息? 謝謝 – Richard

+0

我會創建一個獨立的端點並將Userdetails端點留給內部使用。在這個新的端點中,您必須識別用戶,然後獲取他的信息。 – JohanB

相關問題