0

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

但是现在当我通过 spring social 登录时,我手头没有 Principal 的主体对象,而是实现了 MyPrincipal 类--->

public class MyPrincipal implements Principal {
public String name;
public boolean flag;

public boolean isflag() {
    return flag;
}

public void setFlag(boolean flag) {
    this.flag = flag;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String getName() {
   return name;
}

}

然后在社交登录处理程序中,我将当前用户名和标志值添加到 myPrincipal 对象,并将用户转发到弹簧安全在正常登录情况下转发的同一主页。

  MyPrincipal myPrincipal = new MyPrincipal();
                    myPrincipal.name = username;
                    myPrincipal.socialFlag = true;
                    modelMap.addAttribute("myPrincipal", myPrincipal);
                    return new ModelAndView("forward:/home");

通过使用注释类在会话中添加此对象

@SessionAttributes({"myPrincipal"})

现在从这里开始,我希望将流程移交给主页,并且所有功能都可以正确地为用户工作。但是每个方法都以 Principal 为参数,就像这样 -->

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

在这两种情况下都会发生两种不同的事情——正常登录直接给我主体,但社交登录在会话属性中给我它。

即使在正常的弹簧安全登录的情况下,我也不想将主体作为参数传递,而是在这里我也想将它放在会话属性中。当我实现了自己的身份验证提供程序后,我该如何执行此操作以及在何处进行更改。

4

1 回答 1

1

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

于 2012-12-10T22:14:21.663 回答