2012-04-19 55 views
1

Shiro似乎在Web应用程序中缓存身份验证信息。当我尝试在会话期间将用户锁定在数据库中时(set locked = true),他继续工作,并且没有验证代码(doGetAuthenticationInfo)被调用。锁定仅在用户注销并尝试再次登录时应用。Shiro立即锁定用户

这很奇怪,因为Shiro的缓存默认应该被禁用。

我怎么能锁定用户在他的活动期间不等他注销Shiro?也许我错过了一些概念?

回答

0

你只是修改数据库?我猜想这是行为,shiro保持一个会话,从而“缓存”这个值。

如果你想立刻要破坏用户会话,做一个

//removes all identifying information and invalidates their session too. 
currentUser.logout(); 
+1

我发现Shiro在会话中缓存了认证信息,但不缓存授权信息。如果我更改用户权限,它将立即应用,但用户帐户的更改不会。 – 2012-04-20 08:26:57

+0

我想这与事情变化的频率有关。权限更改的频率比认证信息更频繁。这也取决于领域的实施。 – rdmueller 2012-04-20 08:44:31

+0

btw:开箱即用的锁定功能是什么?我只使用shiro作为grails插件,我的领域不支持锁定用户... – rdmueller 2012-04-20 15:46:49

0

我还没有找到一个很好的解决方案,但我没有找到一个解决方案。虽然这个问题可能太老,不能帮助原始的海报,但它可能会帮助其他人提出同样的问题。

我已经有了一个自定义权限筛选器,它可以扩展FormAuthenticationFilter,我的所有来自客户端的非Ajax请求都会通过这个筛选器。所以,我添加了一个检查,看看用户帐户是否被锁定在isAccessAllowed(...)。如果它被锁定,那么我将用户注销并让过滤器继续。它会将它们发送到登录页面。

这有一个主要缺点:它基本上是用户驱动的数据库轮询,以查看帐户是否被锁定。

如果锁定帐户的过程会从用户会话中获得正确的主题并将该会话记录下来,那将会更好。我可以获得用户的会话,但这似乎没有帮助,因为我无法获得正确的主题对象。改变会话似乎没有帮助。

为了什么值得,Jared Bunting提出了另一个好主意,很不幸没有为我工作。他的建议是检查何时获得许可和角色,并授予某人锁定帐户的权限。这对我来说不起作用,因为我单独使用身份验证来让用户拥有一些访问权限(不需要其他权限)。