我学习了Spring安全性,并使用Spring Security 5
和OAuth2 Login
编写了简单的Web应用程序。我想从Principal
(电子邮件,用户名等)获取信息,但找不到任何方法。写一些JSON-parser
并不是一个好主意,因为我很确定有某种获取用户帐户详细信息的方法。
配置
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and().oauth2Login();
}
}
控制器
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.security.Principal;
@Controller
public class HomeController {
@GetMapping({"", "/"})
@ResponseBody
public Principal getHome(Principal principal) {
return principal;
}
}
Application.yml
spring:
security:
oauth2:
client:
registration:
google:
client-id: xyz1
client-secret: secret1
facebook:
client-id: xyz2
client-secret: secret2
github:
client-id: xyz3
client-secret: secret3
答案 0 :(得分:0)
创建一个新对象,代表要从源中返回的数据子集, 也就是说,这些详细信息的来源具有多个值,因此请使用某些列表或集合或映射来存储该数据并表示该数据, 正如您提到的,您正在使用OAuth2:
@RequestMapping("/user")
public Authentication user(OAuth2Authentication authentication) {
LinkedHashMap<String, Object> details = (LinkedHashMap<String, Object>) authentication.getUserAuthentication().getDetails();
return details.get("email");
}
答案 1 :(得分:0)
通过反复试验,以及使用 Spring Boot 2.3.2,我发现在那个特定场景(带有 Spring Boot 的 OAuth2)中,您必须将获得的 Authentication 对象强制转换为 onAuthenticationSuccess 方法(是的,这就是我的场景,因为我在我的身份验证成功处理程序中观察到了这个对象 - 但是这个场景会大不相同吗?)到 OAuth2AuthenticationToken。如果您真的暂停执行并将 Authentication 对象添加到 Watches,您将看到它确实是那种类型。现在这个对象的 getPrincipal() 返回正确转换的 OAuth2User 对象,它有一个方法 getAttributes()。我真的希望能更容易地弄清楚这一点。
事实上,在我的场景中,OAuth2User 对象可以直接传递给我的 Controller 方法(我不确定 @AuthenticationPrincipal 注释是否必要或正确..):
@Controller
@RequestMapping("/authorized")
public class AuthorizedController {
@RequestMapping("/default")
public String handle(@AuthenticationPrincipal OAuth2User principal,
Model m) {
// ...
}
}