すべてのコントローラーの before インターセプターでauthenticate()
メソッドを呼び出すフィルターを使用して、カスタム認証スキームを実装しました。AuthService
このauthenticate()
メソッドはgroovy.sql.Sql
、UserCredentialsDataSourceAdapterを使用してデータベースへの接続を試行し、データベース ユーザーが適切なロールを持っていることを確認します。データベースは 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
}