我已经成功地设置了一个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正在正确加载用户,但在身份验证期间似乎没有使用它。
2条答案
按热度按时间eqzww0vc1#
我选择将所有用户保存在数据库中,这将使项目更有条理,更干净,更易于理解。我将通过Flyway初始化一个默认用户。
谢谢你的帮助。
wrrgggsh2#
问题是JwtAuthenticationProvider没有调用UserDetailService --它假设JWT拥有所有相关的身份验证信息--所以不需要去UserDetailService获取Authorities等。
所以(如果我理解你想做什么)在你的userAuthenticationTokenConverter中,你需要从jwt中提取用户标识符,然后自己调用UserDetailService进行身份验证。
我在这里给出了类似的答案https://stackoverflow.com/a/70409011/13675557