0

すべてのコントローラーの before インターセプターでauthenticate()メソッドを呼び出すフィルターを使用して、カスタム認証スキームを実装しました。AuthServiceこのauthenticate()メソッドはgroovy.sql.SqlUserCredentialsDataSourceAdapterを使用してデータベースへの接続を試行し、データベース ユーザーが適切なロールを持っていることを確認します。データベースは Oracle であり、従来の ERP の一部であるため、それが認証を行う唯一の方法でした。

私が経験している問題は、無効な資格情報でリクエストを送信したときに発生します。を含む SQLException"ORA-01017: invalid username/password; logon denied"が期待どおりにスローされます。私のtry/catchブロックはそれをキャッチして抑制し、コードはリクエストを拒否する際に正しく進みます。ただし、次の要求では、提供された資格情報に関係なく、常に 500 応答で SQLException が返されます。それがなぜなのか、それを修正するために何ができるのかについてのアイデアはありますか?

def authenticate(def username, def password) {
    def authorized = false
    Sql sql

    if (username != null && !username.equals('')) {
        try {
            dataSource.setCredentialsForCurrentThread(username, password)

            sql = Sql.newInstance(dataSource)
            def row = sql.firstRow("**SQL removed for privacy**")

            if (row != null && row.has_permission == 1) {
                authorized = true
            }
        } catch (Exception e) {

        } finally {
            sql.close() 
        }
    }

    return authorized
}
4

1 に答える 1

1

dataSourceはアプリケーションのシングルトンだと思うので、この間違ったユーザー名とパスワードを設定した後、最初に(任意の場所で)接続を取得しようとすると、無効なユーザー名とパスワードがヒットします。

したがって、例外が発生した場合は、デフォルトのユーザー名とパスワードに戻す必要があります。

于 2013-01-09T11:51:30.530 に答える