1

2 種類のユーザーを持つアプリを構築しています。

  • 通常のユーザー (役割「ユーザー」を持っている)
  • 管理ユーザー (ロール「admin」を持っていますが、「ユーザー」特権は持っていません)

誰かがユーザーと管理者として別々にログイン/ログアウトできるようにするにはどうすればよいですか?

2 つの http 要素を使用して定義された 2 つのレルムがあります (個別のログイン ページとユーザー データベースを許可するために 2 つのレルムがあります)。

<security:http pattern="/admin/**" authentication-manager-ref="adminAuthManager"
    entry-point-ref="adminLoginUrlAuthEntryPoint" use-expressions="true">
    <security:intercept-url pattern="/admin/**" access="hasRole('admin')" />
    <security:access-denied-handler error-page="/admin/login" />
    <security:logout logout-url="/admin/logout" logout-success-url="/" />
    ...
</security:http>
<security:http pattern="/**" authentication-manager-ref="userAuthManager"
    entry-point-ref="userLoginUrlAuthEntryPoint" use-expressions="true">
    <security:intercept-url pattern="/**" access="permitAll" />
    <security:intercept-url pattern="/settings" access="hasRole('user')" />
    <security:access-denied-handler error-page="/login" />
    <security:logout logout-url="/logout" logout-success-url="/" />
    ...
</security:http>

現在の設定では、1 つのセッションを認証済みユーザーと認証済み管理者の両方にすることはできません。管理者としてログインしているときにユーザーとしてログインすると、その管理者認証は失われ (または置き換えられ)、その逆も同様です。

2 つのレルムを 2 つの異なる Web アプリケーションに分離することを考えましたが、できればそうしたくありません。

編集:これがどのように機能するかの例です:

  1. 人がサイトに移動します。たとえば、すべてのユーザーに開かれているパス / に移動します
  2. ユーザーはログインをクリックし、/login で認証します。person のロールは "user" になりました
  3. ユーザーが /admin/* ページに移動することを決定すると、/admin/login ページが表示されます
  4. 個人は、/admin/login で別の一連の資格情報を使用して認証します。person は "admin" と "user" のロールを持つようになりました
  5. サーバーの観点からは、ユーザーが /admin/** ページにいる場合、ユーザーのプリンシパルは /admin/login に使用したユーザー名です。/** ページでは、ユーザーのプリンシパルは /login に使用したユーザー名です。
  6. ユーザーは管理アクティビティを終了し、/admin/logout で管理セッションからログアウトすることを決定します。ユーザーは「管理者」ロールを失いますが、「ユーザー」ロールが残ります
  7. ユーザーは最終的にユーザー ロールからもログアウトすることを決定し、パス /logout に移動します。個人は匿名になりました

カスタム機能をあまり書かなくても、これが達成できることを願っています。

4

1 に答える 1

2

同じ人に2セットのクレデンシャルを持たせたい理由がわかりませんか?このシナリオは通常、ステップアップ認証を使用して実装されます。つまり、ユーザーは常に同じですが、アプリの管理領域にアクセスしようとすると、再認証を求められます。たとえば、追加情報を入力するか、2要素トークンを使用して認証するように彼に促すことができます。

以前は、ユーザーがサイトの「より安全な」領域にアクセスしようとしているかどうかを確認し、適切な役割がない場合はInsufficientAuthenticationExceptionをスローするカスタムAccessDecisionManager/Voterを使用してこれを実装しました。次に、エントリポイントはこの例外を処理し、ユーザーに再認証を求め、Springが新しいロールを割り当てます。

于 2012-04-19T20:07:02.000 に答える