Spring Security Sping Boot JWT Resource Server with Database Users:为用户创建添加第二种身份验证方法

wswtfjt7  于 2023-08-05  发布在  Spring
关注(0)|答案(2)|浏览(116)

我已经成功地设置了一个JWT资源服务器,它可以从数据库中检索用户信息。
现在,我需要另一种身份验证方法(最好使用Basic Auth和In-Memory Users)来创建默认的应用程序用户,这样我就可以创建数据库Users。
这就是我到目前为止所尝试的:

授权服务器配置:

  1. @Configuration
  2. public class AuthorizationServerConfig {
  3. @Bean
  4. @Order(Ordered.HIGHEST_PRECEDENCE)
  5. public SecurityFilterChain oauthServerSecurityFilterChain(HttpSecurity http) throws Exception {
  6. OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
  7. return http.build();
  8. }
  9. @Bean
  10. public AuthorizationServerSettings oauthServerSettings() {
  11. return AuthorizationServerSettings.builder().build();
  12. }
  13. }

字符串

资源服务器配置:

  1. @EnableMethodSecurity
  2. @Configuration
  3. @RequiredArgsConstructor
  4. public class ResourceServerConfig {
  5. private final UserAuthenticationTokenConverter userAuthenticationTokenConverter;
  6. private final InMemoryUserDetailsManager inMemoryUserDetailsManager;
  7. @Bean
  8. public SecurityFilterChain resourceServerSecurityFilterChain(HttpSecurity http) throws Exception {
  9. http.oauth2ResourceServer(customizer ->
  10. customizer.jwt( jwt ->
  11. jwt.jwtAuthenticationConverter(userAuthenticationTokenConverter)
  12. )
  13. ).userDetailsService(inMemoryUserDetailsManager);
  14. return http.build();
  15. }
  16. }

InMemoryUserDetailsManager配置:

  1. @Configuration
  2. @RequiredArgsConstructor
  3. public class InMemoryUserPropertiesConfig {
  4. private final BasicUsersProperties basicUsersProperties;
  5. @Bean
  6. public InMemoryUserDetailsManager userDetailsManager() {
  7. List<UserDetails> users = basicUsersProperties.getUsers().stream()
  8. .map(PropertiesUserDetails::new)
  9. .collect(Collectors.toList());
  10. return new InMemoryUserDetailsManager(users);
  11. }
  12. }


InMemoryUserDetails正在正确加载用户,但在身份验证期间似乎没有使用它。

eqzww0vc

eqzww0vc1#

我选择将所有用户保存在数据库中,这将使项目更有条理,更干净,更易于理解。我将通过Flyway初始化一个默认用户。
谢谢你的帮助。

wrrgggsh

wrrgggsh2#

问题是JwtAuthenticationProvider没有调用UserDetailService --它假设JWT拥有所有相关的身份验证信息--所以不需要去UserDetailService获取Authorities等。
所以(如果我理解你想做什么)在你的userAuthenticationTokenConverter中,你需要从jwt中提取用户标识符,然后自己调用UserDetailService进行身份验证。
我在这里给出了类似的答案https://stackoverflow.com/a/70409011/13675557

相关问题