2

GlassFish 3.1 での認証にJDBCRealasを使用する Java EE アプリケーションがあります。JAAS Context以下は、JSF2.0 マネージド Bean の認証コードです。

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 を介して users テーブルを管理していると思います。

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 に答える