我们正在使用Apache Shiro在我们的应用程序中管理身份验证。使用权限时,我使用开箱即用的基于内存的缓存,这是我的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
的{{1}}。似乎CacheManagerAware
清除了缓存。
标签库是否正在进行缓存?我错过了一些缓存实现吗?
我的Shiro.ini文件:
CacheManagerAware.onLogout()
(意识到Shiro的文档很少。)
答案 0 :(得分:2)
我得到了它的工作。注销工作流在我们的代码中错误地使用session.invalidate()
。所以我需要的两件事是
SecurityUtils.getSubject().logout()
而不是session.invalidate()来使用正确的注销工作流程。
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
...
SimplePrincipalCollection principals = new SimplePrincipalCollection(username, "jndiJdbcRealm");
super.doClearCache(principals);
...
}