使用Apache Shiro从session / authenticationtoken / cache检索用户信息

时间:2014-04-16 20:53:14

标签: jsf jsf-2 shiro

我正在尝试使用JPA数据源使用Apache Shiro构建动态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()方法)。

1 个答案:

答案 0 :(得分:1)

Shiro内置了一个缓存机制,因此当用户登录时,只要用户没有注销,所有构建凭据都存储在缓存中并在每次后续调用中检索。

如果您查看AuthorizingRealm.getAuthorizationInfo的来源,您可以看到它从缓存中检索AuthorizationInfo,在配置缓存时

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

这会导致每个用户会话只有一个数据库操作用于检索凭据。