3

アプリで認証を管理するために Apache Shiro を使用しています。Permission を使用する場合、すぐに使用できるメモリ ベースのキャッシュを使用しています。これが私の shiro.ini です。

私のJSPではshiro:taglib、hasPerimissionタグとlacksPemrissonsタグをチェックするために使用しています。データベースのユーザー ロールを更新すると(したがって、対応するアクセス許可)、ユーザーがログアウトすると、そのアクセス許可が更新されます。予想通り、不正なページが表示されます。ただし、リンクは引き続きレンダリングされますが、レンダリングされるべきではありません。これらのリンクは、次の構文を使用してレンダリングされます。(注: これらのリンクは共通の一部でありheader.jsp、すべてのページに含まれています)

<shiro:hasPermission name="admin:viewPage">
        <a href="/pages/admin.jsp">Admin</a>
</shiro:hasPermission>

私のクラスは、JNDIAwareJDBCRealm継承するJdbcRealmものを継承しCacheManagerAwareます。CacheManagerAware.onLogout()キャッシュをクリアするようです。

タグライブラリはキャッシュを行っていますか? キャッシングの実装が不足していますか?

私の Shiro.ini ファイル:

[main] 
jndiJdbcRealm=com.my.domian.JNDIAwareJDBCRealm
jndiJdbcRealm.jndiDataSourceName=jdbc/mySQLConnection 
jndiJdbcRealm.authenticationQuery = select password FROM users where email_id=?
jndiJdbcRealm.userRolesQuery= select role from user_roles, user where user.email_id =? AND user.id = user_roles.user_id 
jndiJdbcRealm.permissionsQuery= SELECT permission FROM role_permission WHERE role=? jndiJdbcRealm.permissionsLookupEnabled=true

bcryptCredentialsMatcher=com.my.domain.BCryptCredentialsMatcher
jndiJdbcRealm.credentialsMatcher = $bcryptCredentialsMatcher

securityManager.realms = $jndiJdbcRealm builtInCacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager.cacheManager = $builtInCacheManager

# unauthorized page
perms.unauthorizedUrl = /pages/unauthorized.jsp

(Shiro のドキュメントが非常に少ないことに気付きました。)

4

1 に答える 1

2

私はそれを働かせました。session.invalidate()ログアウト ワークフローがコードで間違って使用されていました。だから私が必要とした2つのことは

  1. SecurityUtils.getSubject().logout()session.invalidate() の代わりに呼び出して、正しいログアウト ワークフローを使用します。
  2. ログイン時に、次のようにキャッシュをクリアします。

.

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
     throws AuthenticationException {
    ...
    SimplePrincipalCollection principals = new SimplePrincipalCollection(username, "jndiJdbcRealm");
    super.doClearCache(principals);

    ...
}
于 2013-07-17T06:07:15.260 に答える