0

私は自分のプロジェクトで認証目的で春のセキュリティを使用しています。認証が成功した後、さまざまな詳細が保存されているプリンシパルオブジェクトを取得します。このプリンシパル オブジェクトは、現在のユーザーに対してエントリをデータベースに反映できるようにするさまざまなメソッドに渡されます。要するに、プリンシパルは、必要なすべての場所で principal.getName() を提供するのに役立ちます。

しかし、Spring Social からログインすると、プリンシパルのプリンシパル オブジェクトが手元になく、代わりに 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();
 }

どちらの場合も、2 つの異なることが起こっています。通常のログインではプリンシパルが直接提供されますが、ソーシャル ログインではセッション属性で提供されます。

通常のSpringセキュリティログインでもprincipalをパラメータとして渡したくはなく、代わりにここでもsession属性に入れたい。独自の認証プロバイダーを実装した場合、これを行う方法と変更する場所。

4

1 に答える 1

1

私は完全には理解していないと思います...しかし、一般的にはプリンシパルインスタンスを渡す必要はありません。を使用してコンテキストを取得してから、またはorg.springframework.security.core.context.SecurityContextHolder.getContext()を呼び出します。SecurityContext.getAuthentication().getPrincipal()SecurityContext.getAuthentication().getDetails()

于 2012-12-10T22:14:21.663 に答える