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 アプリケーションに分離することを考えましたが、できればそうしたくありません。
編集:これがどのように機能するかの例です:
- 人がサイトに移動します。たとえば、すべてのユーザーに開かれているパス / に移動します
- ユーザーはログインをクリックし、/login で認証します。person のロールは "user" になりました
- ユーザーが /admin/* ページに移動することを決定すると、/admin/login ページが表示されます
- 個人は、/admin/login で別の一連の資格情報を使用して認証します。person は "admin" と "user" のロールを持つようになりました
- サーバーの観点からは、ユーザーが /admin/** ページにいる場合、ユーザーのプリンシパルは /admin/login に使用したユーザー名です。/** ページでは、ユーザーのプリンシパルは /login に使用したユーザー名です。
- ユーザーは管理アクティビティを終了し、/admin/logout で管理セッションからログアウトすることを決定します。ユーザーは「管理者」ロールを失いますが、「ユーザー」ロールが残ります
- ユーザーは最終的にユーザー ロールからもログアウトすることを決定し、パス /logout に移動します。個人は匿名になりました
カスタム機能をあまり書かなくても、これが達成できることを願っています。