我正试图使用JPA数据源与ApacheShiro构建一个动态Allowance/Permission。
最后,everithing回到了这个类:
public class CustomAuthorizationFilter extends HttpMethodPermissionFilter {
@Override
public boolean isAccessAllowed(ServletRequest r, ServletResponse r, Object m) throws IOException {
//Somehow get the user stored somewhere in the servlet memory
SysUser loggedUser = %some_code_here%
for (String allowance : loggedUser.getAllowances()) {
// Do many validations
if (pathsMatch(allowance, request)) {
return true;
}
}
return super.isAccessAllowed(request, response, mappedValue);
}
}
isAccessAllowed()方法在每个请求上都会被激发,所以我不想从数据库中获取信息。Shiro构建了许多关于用户的对象,其中一个是AuthorizationInfo。我构建了一个CustomAuthorizationInfo,其中Permissions和Allowances列表在里面。。。但是如何在不重新访问数据库的情况下检索这些信息呢?
是否可以在不访问数据库的情况下使用shiro存储/检索真实用户的信息?
(PS.:像isPermitted这样的方法并不能解决问题,因为我需要权限本身来使用pathsMatch()方法)。
Shiro内置了一个缓存机制,因此当用户登录时,所有构建凭据都存储在缓存中,并在用户未注销的每次后续调用中检索。
如果您检查AuthorizationRealm.getAuthorizationInfo的源,您可以看到它在配置缓存时从缓存中检索AuthorizationInformation。
http://svn.apache.org/repos/asf/shiro/tags/shiro-root-1.2.3/core/src/main/java/org/apache/shiro/realm/AuthorizingRealm.java
请在此处查看有关缓存的文档:https://shiro.apache.org/caching.html
快速解决方案是配置一个简单的内存缓存:
cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager.cacheManager = $cacheManager
这将导致每个用户会话只执行一个数据库操作来检索凭据。