Grails spring-security-ldap缓存问题:使用Redis实现缓存

9

新手问题,请耐心等待...

目前我有一个Grails 2.4.4应用程序,使用spring-security-ldap 2.0.1与OpenLdap服务器对用户进行身份验证和授权。

LDAP人员担心在没有缓存的情况下,该应用程序在转移到生产环境时可能会影响LDAP服务器的性能。他们建议研究使用Redis作为用户的应用级缓存,以便在访问LDAP服务器之前使用。

在开始POC之前,我想获取一些指导,确保我走在正确的道路上:

i) 我简要地查看了Grail org的'Grails 1 & 2 Plugins',当我搜索Redis时,出现了几个插件...哪些插件实际上与我试图实现的内容相关?

ii) 假设我已经将Redis缓存集成到我的Grails中,我应该在哪里告诉spring-security-ldap首先查找Redis缓存,然后再访问Ldap服务器?

感谢提前任何信息/指南..


哦,忘了提到,最好我们不想要一个用户持久性的数据库实现,只需要LDAP和Redis进行缓存。 - alchn
1
我没有足够的信息来给出完整的答案,但我已经成功地使用了这个Redis插件https://grails.org/plugin/redis?skipRedirect=true。至于自定义登录,我认为您应该扩展grails.plugin.springsecurity.LoginController并通过检查您的Redis缓存并且如果未填充则调用super auth来覆盖auth方法。 - Mike W
1个回答

5

以下是一些建议,如果您不想使用现成的解决方案:

  • 缓存任何类型的身份验证都是巨大的安全隐患,因为黑客可以利用这种缓存绕过LDAP解决方案中实施的某些规则,比如暴力破解保护(例如,在N次错误密码后封锁帐户)

  • 为了处理LDAP服务器端的负载,可以调整会话令牌过期时间(JSESSIONID或JWT,取决于Spring security的配置方式)。例如,如果令牌过期时间为1小时,则每个用户每小时只会收到1个请求。

  • 您可以添加刷新令牌机制以更新会话令牌而无需查询LDAP。在这种情况下,每个设备每个用户只有1个LDAP请求,这可能是可以接受的。这里是如何使用Grails JWT进行操作。在此文档中,您将看到可以使用REDDIS存储令牌,这与您最初的解决方案非常相关


感谢建议!由于所涉及的应用程序并不高度敏感,我仍然可以继续使用手动缓存认证(而且我已经完成了一半...:-) 如果手动缓存成为暴力攻击的问题,我可以手动滚动以阻止暴力攻击。妈呀,这听起来已经很费事了。 - alchn
但出于好奇心,我瞥了一眼Spring-Security-Rest插件文档http://alvarosanchez.github.io/grails-spring-security-rest/1.5.4/docs/guide/introduction.html。以下是一些澄清的问题: i)只要在第一次LDAP身份验证后令牌被本地存储和保持活动状态,那么LDAP服务器随后就不会被调用了吗? ii)如果不调用LDAP服务器,令牌基础流程如何防止暴力尝试(以及其他LDAP规则强制执行)? - alchn
JWT令牌受到保护,因为它使用比任何密码策略更复杂的私钥加密,就像会话cookie一样。以下是一些相关讨论:https://security.stackexchange.com/questions/87119/how-secure-are-expiring-tokens-and-refresh-tokens - Benjamin Caure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接