如何在Java EE应用程序中添加“禁用用户”管理功能?

时间:2011-10-07 13:46:44

标签: java authentication java-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),我应该怎么做?或者,还有其他(标准)方式吗?

我想看看,如果这里有人在这方面有一些经验,可以指出我朝着正确的方向前进。

1 个答案:

答案 0 :(得分: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-constraint中设置了web.xml,则用户将无法执行任何操作(注销除外)。