使用Apache Shiro从会话/身份验证令牌/缓存中检索用户信息



我正试图使用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

这将导致每个用户会话只执行一个数据库操作来检索凭据。

相关内容

  • 没有找到相关文章

最新更新