java - 如何在 Java EE 应用程序中添加 "Disable User"管理功能?

标签 java authentication jakarta-ee jaas jdbcrealm

我有一个 Java EE 应用程序,它使用 JDBCReal 作为 JAAS Context 在 GlassFish 3.1 上进行身份验证。下面是 JSF2.0 managedbean 中的身份验证代码 -

FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
try {
    if (request.getUserPrincipal() != null) {
        request.logout();
    }
    if (request.getUserPrincipal() == null) {
        request.login(this.username, this.password);
    }

我正在尝试添加一些管理功能(例如创建/删除/更新/禁用用户)。除了“禁用”一个,我几乎完成了所有这些,这让我对如何继续感到困惑。

我现在能想到的唯一方法是在“users”表中添加一个字段,例如“status”,它会有一个值(“enabled”或“disabled”)。并在进行身份验证之前检查该“状态”。

考虑到我正在使用 JAAS (JDBCRealm),我应该这样做吗?或者,还有其他(标准)方式吗?

我想看看这里是否有人在这方面有经验,可以为我指明正确的方向。

最佳答案

我假设您通过 JDBC/JPA 管理您的用户表。

在 unix/linux 中,passwd -l 将散列更改为无效值。来自 man passwd :

 -l   This option is used to lock the specified account and it is
      available to root only. The locking is performed by rendering
      the encrypted password into an invalid string (by prefixing the
      encrypted string with an !).

在实践中,来自 /etc/shadow 的解锁帐户:

test:$6$c7Lz2A2l$8AoSBy8C2U7uUns4aDRP2J/QRzUOYF...o69XPR/:15259:0:99999:7:::

passwd -l test 之后的相同帐户:

test:!$6$c7Lz2A2l$8AoSBy8C2U7uUns4aDRP2J/QRzUOYF...o69XPR/:15259:0:99999:7:::

前缀值无效,因为哈希函数总是返回相同的位数。如果您的存储值比该长度长,它们将永远不会匹配。您可以对散列密码执行相同的操作 - 只需通过 JDBC/JPA 在密码前加上 !(或任何其他字符串)即可。

当然这不适用于明文密码。

另一种解决方案是从数据库中删除用户的角色。在这种情况下,用户可以登录,但如果您在 web.xml 中设置好 security-constraint,用户将无法执行任何操作(注销除外) ).

关于java - 如何在 Java EE 应用程序中添加 "Disable User"管理功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7688155/

相关文章:

Java PrintWriter 文件覆盖

ruby-on-rails - 我可以使用 rails 的设计将 linkedin 连接到我的站点吗?

java - 将 json 对象中的日期发送到 Restful ws

javascript - Firebase Auth - 最近登录多长时间

java - 如何声明我的 Java WebSocket 端点来使用和生成 JSON?

eclipse - 创建企业应用程序项目时无法将模块添加到 Java EE 企业应用程序 - nullPointer

java - 固定大小队列的空间复杂度

Java Selenium 通过命令提示符 CMD Windows 运行,无需 IDE

java - 如何更改 CTabItem 下划线的颜色?

Apache HttpClient 在直接时能够通过 HTTPS 进行通信,但不能通过代理进行通信 错误 : javax.net.ssl.SSLPeerUnverifiedException:对等方未经过身份验证