我已經實現了一個自定義的UserDetailsService,它查找一個用戶並允許他們使用密碼授予獲取oauth 2令牌。該服務表示使用JPA userRepository來查找用戶。userRepository不安全,因爲userDetailsService需要查找用戶
這一切都有效,但現在我有一個/用戶端點公開可用,將所有用戶和密碼拉入任何經過身份驗證的用戶。理想情況下,我希望根本沒有可用的端點,但是如果我使用管理員角色對其進行preAuthorize,則所有用戶都會在嘗試獲取登錄令牌時被拒絕,所以這也不起作用。人們如何解決這個問題?我可以添加一個匹配器到資源服務器,只允許管理員用戶,這似乎工作,但我不希望終端可用,它是非常可怕的,只要這樣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);
}
}
謝謝,這是我一直在尋找。 我該如何公開它,以便通過身份驗證的用戶可以訪問他們自己的用戶信息,如電子郵件,個人資料信息,用戶名等? /用戶/ authenticateUser但沒有任何其他端點/ GET /用戶等,因爲這是可怕的打開?最好是創建一個新的控制器說/用戶信息/只有他們的信息? 謝謝 – Richard
我會創建一個獨立的端點並將Userdetails端點留給內部使用。在這個新的端點中,您必須識別用戶,然後獲取他的信息。 – JohanB