Session 如何整合spring security和spring social,使两者的执行流程相同?

Session 如何整合spring security和spring social,使两者的执行流程相同?,session,spring-security,spring-social,Session,Spring Security,Spring Social,我在我的项目中使用spring security进行身份验证,在成功的身份验证之后,我获得了主要对象,其中存储了各种详细信息。 这个主体对象被传递给各种方法,这些方法允许在数据库中针对当前用户反映条目。简而言之,principal可以帮助我在任何需要principal.getName()的地方提供它 但现在,当我通过SpringSocial登录时,我手中并没有principal的principal对象,而是实现了MyPrincipal类--> 然后在社交登录处理程序中,我将当前用户名和标志值添加

我在我的项目中使用spring security进行身份验证,在成功的身份验证之后,我获得了主要对象,其中存储了各种详细信息。 这个主体对象被传递给各种方法,这些方法允许在数据库中针对当前用户反映条目。简而言之,principal可以帮助我在任何需要principal.getName()的地方提供它

但现在,当我通过SpringSocial登录时,我手中并没有principal的principal对象,而是实现了MyPrincipal类-->

然后在社交登录处理程序中,我将当前用户名和标志值添加到myPrincipal对象中,并将用户转发到spring security在正常登录时转发的同一主页

  MyPrincipal myPrincipal = new MyPrincipal();
                    myPrincipal.name = username;
                    myPrincipal.socialFlag = true;
                    modelMap.addAttribute("myPrincipal", myPrincipal);
                    return new ModelAndView("forward:/home");
通过使用注释类在会话中添加此对象

@SessionAttributes({"myPrincipal"})
现在,从这里开始,我希望将流移交给主页,所有功能都能正确地为用户工作。但是每个方法都以Principal作为参数,就像这样-->

在这两种情况下都有两种不同的情况- 普通登录直接给我主体,但社交登录在会话属性中给我主体

即使在正常的spring安全登录的情况下,我也不想将主体作为参数传递,相反,这里我还想将其放在session属性中。
当我实现了自己的身份验证提供程序时,我如何做到这一点以及在何处进行更改。

我不认为我完全理解……但是,一般来说,不需要传递主要实例。使用
org.springframework.security.core.context.SecurityContextHolder.getContext()
获取上下文,然后调用
SecurityContext.getAuthentication().getPrincipal()
SecurityContext.getAuthentication().getDetails()

@SessionAttributes({"myPrincipal"})
 @RequestMapping(value = {"/home"}, method = RequestMethod.POST)
 @ResponseBody
  public ModelAndView test(ModelMap modelMap, Principal principal) {
   String name = principal.getName();
 }