2

我有一个 Java EE 应用程序,用于 GlassFish 3.1 上的身份验证JDBCRealJAAS Context下面是 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);
    }

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

我现在能想到的唯一方法是在“用户”表中添加一个字段,例如“状态”,该字段将具有一个值(“启用”或“禁用”)。并在进行身份验证之前检查“状态”。

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

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

4

1 回答 1

1

我想您通过 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 在密码前加上(或任何其他字符串)即可。

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

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

于 2011-10-12T19:48:30.537 回答