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

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

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

授权服务器配置:

@Configuration
public class AuthorizationServerConfig {

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SecurityFilterChain oauthServerSecurityFilterChain(HttpSecurity http) throws Exception {
        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
        return http.build();
    }

    @Bean
    public AuthorizationServerSettings oauthServerSettings() {
        return AuthorizationServerSettings.builder().build();
    }

}

字符串

资源服务器配置:

@EnableMethodSecurity
@Configuration
@RequiredArgsConstructor
public class ResourceServerConfig {

    private final UserAuthenticationTokenConverter userAuthenticationTokenConverter;
    private final InMemoryUserDetailsManager inMemoryUserDetailsManager;

    @Bean
    public SecurityFilterChain resourceServerSecurityFilterChain(HttpSecurity http) throws Exception {
        http.oauth2ResourceServer(customizer ->
            customizer.jwt( jwt ->
                jwt.jwtAuthenticationConverter(userAuthenticationTokenConverter)
            )
        ).userDetailsService(inMemoryUserDetailsManager);
        return http.build();
    }

}

InMemoryUserDetailsManager配置:

@Configuration
@RequiredArgsConstructor
public class InMemoryUserPropertiesConfig {

    private final BasicUsersProperties basicUsersProperties;

    @Bean
    public InMemoryUserDetailsManager userDetailsManager() {
        List<UserDetails> users = basicUsersProperties.getUsers().stream()
                .map(PropertiesUserDetails::new)
                .collect(Collectors.toList());
        return new InMemoryUserDetailsManager(users);
    }

}


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

eqzww0vc

eqzww0vc1#

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

wrrgggsh

wrrgggsh2#

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

相关问题