OAuth2 和 Spring 框架的新功能。到目前为止,已经遵循了两个介绍指南(例如 this 一个),并且
OAuth2User
对象 (org.springframework.security.oauth2.core.user.OAuth2User) 的“name”属性始终具有 null 值,如下教程所示,显然不应为空。最终克隆存储库只是为了确保我有相同的代码并且值仍然为空。
@SpringBootApplication
@RestController
public class SocialApplication extends WebSecurityConfigurerAdapter {
@GetMapping("/user")
public Map<String, Object> user(@AuthenticationPrincipal OAuth2User principal) {
// for(String key : principal.getAttributes().keySet()) {
// System.out.println(String.format("key= %s value=%s", key, principal.getAttribute(key)));
// }
return Collections.singletonMap("name", principal.getAttribute("name"));
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests(a -> a
.antMatchers("/", "/error", "/webjars/**").permitAll()
.anyRequest().authenticated()
)
.exceptionHandling(e -> e
.authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))
)
.oauth2Login();
// @formatter:on
}
public static void main(String[] args) {
SpringApplication.run(SocialApplication.class, args);
}
}
}
public static void main(String[] args) {
SpringApplication.run(SocialApplication.class, args);
}
}
取消注释上面的 for 循环将从
principle.getAttributes()
获取的大多数键都为空(包括 name、email 等)。我不清楚我在这里做错了什么 - 我在我的属性文件中正确配置了 clientId 和 clientSecret (通过创建 github OAuth 应用程序获得)。任何帮助将不胜感激
我遇到了同样的问题,我通过访问我的 github 个人资料并更新我的名字解决了它(在我的例子中我没有提供它)!
我在使用谷歌登录时也面临同样的问题。有人有解决办法吗?我遵循同样的步骤
@GetMapping("/loginSuccess")
public String loginSuccess(@AuthenticationPrincipal OAuth2User oauthUser) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
System.out.println("Authentication principal: " + authentication.getPrincipal());
if (oauthUser == null) {
return "Error: OAuth2User is null. Authentication failed.";
}
String username = oauthUser.getAttribute("name");
JwtToken jwtToken = jwtUtils.generateTokenFromUsername(username);
return "Login successful! JWT Token: " + jwtToken;
}
这是我的安全配置
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(auth -> {
auth.requestMatchers(
antMatcher("/api/auth/**"),
antMatcher("/oauth2/**"),
antMatcher("/login/**")
).permitAll()
.anyRequest().authenticated();
})
.oauth2Login(oauth2 -> oauth2
.defaultSuccessUrl("/api/auth/loginSuccess")
.failureUrl("/api/auth/loginFailure")
)
.httpBasic()
.and()
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.exceptionHandling()
.authenticationEntryPoint(unauthorizedHandler)
.and()
.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class)
.authenticationProvider(authenticationProvider());
return http.build();
}