如何从java.security.Principal获取所有属性?

时间:2019-10-19 12:43:18

标签: spring spring-boot spring-security oauth-2.0

我学习了Spring安全性,并使用Spring Security 5OAuth2 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

2 个答案:

答案 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) {
         // ...
    }
}
相关问题