在Tomcat LockOutRealm错误/用户锁定后显示错误消息



我在Tomcat中使用JDBCRealm + LockOutRealm(8,但可以切换到9(。这一切正常,但如果用户将自己锁定,则仅在日志中可见,而不是面向登录错误页面的用户。

想象一下,一个用户输入他或她的密码,并打开大写锁定几次,因此锁定了帐户,然后注意到大写锁定,将其删除,但仍然无法登录。

有没有办法证明 LockOutRealm 而不是错误的密码是登录失败的原因?

我只在catalina.out中看到了这一点:

Aug 24, 2018 10:59:15 AM org.apache.catalina.realm.LockOutRealm authenticate
WARNING: An attempt was made to authenticate the locked user "abcd"
Aug 24, 2018 10:59:15 AM org.apache.catalina.authenticator.AuthenticatorBase invoke
FINE:  Failed authenticate() test ??/test/j_security_check

我确实找到了这个答案,恕我直言,这是该地区唯一相关的答案。但它是从2011年开始的,现在可能有更好,更简单的方法可以做到这一点。

另外(不太重要(,有没有办法从应用程序帐户解锁用户/重置 LockOutRealm,例如通过访问一些受保护的 servlet,使用管理员帐户执行此操作?有一个unlock((方法,但它似乎不是为在应用程序内使用而设计的,请参阅此处。

刚刚遇到了同样的问题。似乎什么都没有改变。为了添加另一种解决方法,我最终通过反射获得了 LockOutRealm,如此处所述。 当然,这违反了应用程序不应该知道正在使用哪些领域的设计原则。

相关代码:

ApplicationContextFacade acf = (ApplicationContextFacade) request.getSession().getServletContext();
Field privateField = ApplicationContextFacade.class.getDeclaredField("context");  
privateField.setAccessible(true);  
ApplicationContext appContext = (ApplicationContext) privateField.get(acf);

Field privateField2 = ApplicationContext.class.getDeclaredField("context");  
privateField2.setAccessible(true);  
StandardContext stdContext = (StandardContext) privateField2.get(appContext);

LockOutRealm realm = (LockOutRealm) stdContext.getRealm();  

然后使用realm.isLocked(username)决定要显示的错误消息。 (LockOutRealm 可能不是根领域,这取决于上下文中的配置.xml(

相关内容

  • 没有找到相关文章

最新更新