1

Shiro は Web アプリケーションに認証情報をキャッシュしているようです。セッション中にデータベース内のユーザーをロックしようとすると (locked = true に設定)、ユーザーは引き続き動作し、認証コード ( doGetAuthenticationInfo ) は呼び出されません。ロックは、ユーザーがログアウトして再度ログインしようとしたときにのみ適用されます。

Shiro のキャッシュはデフォルトで無効になっているはずなので、これは奇妙です。

Shiroでログアウトするのを待たずに、アクティビティ中にユーザーをロックするにはどうすればよいですか? 多分私はいくつかの概念が欠けていますか?

4

2 に答える 2

0

私は素晴らしい解決策を見つけていませんが、解決策を見つけました。この質問はおそらく元の投稿者を助けるには古すぎるかもしれませんが、同じ質問を持つ他の人を助けるかもしれません.

拡張するカスタム パーミッション フィルターが既にFormAuthenticationFilterあり、クライアントからの ajax 以外のリクエストはすべてこのフィルターを通過します。そのため、ユーザー アカウントがロックされているかどうかを確認するチェックを追加しましたisAccessAllowed(...)。ロックされている場合は、ユーザーをログアウトしてフィルターを続行します。ログインページに送信されます。

これには 1 つの大きな欠点があります。アカウントがロックされているかどうかを確認するために、基本的にユーザー主導でデータベースをポーリングすることです。

アカウントをロックするプロセスが、ユーザーのセッションから正しいサブジェクトを取得し、そのセッションをログアウトできるとよいでしょう。ユーザーのセッションを取得できますが、正しいサブジェクト オブジェクトを取得できないため、役に立たないようです。セッションの変更は役に立たないようです。

Jared Bunting は別の良いアイデアを提案しましたが、残念ながら私にはうまくいきませんでした。彼の提案は、権限と役割を取得するときに確認し、ロックされたアカウントへの権限を誰かに与えないことでした。認証のみを使用してユーザーにアクセスを許可しているため、これは機能しませんでした (他の許可は必要ありません)。

于 2013-09-27T21:37:00.057 に答える
0

データベースを変更するだけですか?shiro がセッションを保持し、この値を「キャッシュ」するのは意図された動作だと思います。

ユーザーセッションをすぐに破棄したい場合は、

//removes all identifying information and invalidates their session too.
currentUser.logout(); 
于 2012-04-20T06:35:27.843 に答える