2016-05-28 38 views
8

私は春と春のセキュリティには本当に新しいです。私はSpring Securityについて読んでいましたが、のプリンシパルのコンセプトが現れました。これは現在ログインしているユーザーである必要があります。しかし、現在ログインしているユーザーが複数いる場合はどうなりますか?だから、私の質問は、春の安全保障の元本はどういうものなのでしょうか?Spring Securityの「プリンシパル」とは何ですか?

私は、例えば、このチュートリアルを読んだ:

http://www.mkyong.com/spring-security/get-current-logged-in-username-in-spring-security/

をし、彼らはしばしばそうではありません一つだけ、現在ログインしているユーザーが、ありますことを考慮しているようです。

特定のユーザーを取得するにはどうすればよいですか?また、リクエストを行っているユーザーを区別するにはどうすればよいですか?

+0

基本的にはhttp://stackoverflow.com/questions/4989063/what-is-the-meaning-of-subject-vs-user-vs-principal-in-a-security-context - それは春に固有のものではありません。 – zapl

答えて

19

プリンシパルは現在ログインしているユーザーでです。ただし、現在のスレッドにバインドされているセキュリティコンテキストを介して取得します。したがって、現在の要求とそのセッションにもバインドされています。

SecurityContextHolder.getContext()は、現在SecurityContextの実装をThreadLocal変数で内部的に取得します。要求は単一のスレッドにバインドされているため、現在の要求のコンテキストが取得されます。

セキュリティコンテキストがセッション内にあり、ユーザー/プリンシパルとロール/権限を含むと言うことができます。

特定のユーザーを取得するにはどうすればよいですか?

あなたはありません。すべてのAPIは、現在のリクエストのセッション&にアクセスできるように設計されています。ユーザーAが現在認証されている100人のユーザーのうちの1人になるようにします。 Aがあなたのサーバに対してリクエストを発行すると、そのリクエストを処理するために1つのスレッドが割り当てられます。 SecurityContextHolder.getContext().getAuthentication()を実行すると、このスレッドのコンテキストで実行されます。デフォルトでは、そのスレッド内から別のスレッドによって処理されるユーザーBのコンテキストにアクセスすることはできません。

リクエストを実行しているユーザーを区別するにはどうすればよいですか。

サーブレットコンテナはあなたのために必要なものではありません。

+0

私の結果として得られる疑問は、セッションとユーザーの間で春がどのように区別されるのでしょうか?私はこれが春の深い理解を必要とすると思います... – nbro

+0

ありがとう!いい答え。私は、Webアプリケーションの作成などの経験が少ないことから、疑問を抱いています。しかし、私が私が知っていると思うものを説明しようとする前に、私が学んだことから、HTTP要求はセッションIDで拡張できます。この情報はおそらく、ユーザーと要求を区別するためにTomcat(または何でも)によって使用されます。プリンシパルは、現在のコンテキストで現在ログインしているユーザーです。ログインしているユーザー(プリンシパル)がいることを理解するには、セッション番号が関連付けられている必要があります。 – nbro

+0

ここで、 'root'と' admin'という2人のログインしたユーザーがいて、リクエストマッピングが '/ users/{username}'のコントローラがあるとします。 さらに、 'www.host.com:3000/users/root'というURLでクライアント側のアカウントで' root'が遊んでいるとします。 この時点で、私はセッションIDがすでにrootに対して生成されていると思います。例えば、www.host.com:3000/users/admin'にURLを手動で変更して へのリクエストをしようとすると、adminも別のマシンから接続してログインした場合、この場合何が起こりますか? – nbro

関連する問題