Spring Security ACLがAccessDeniedExceptionを投げた後、資格情報を求めるにはどうすればいいですか?
-
22-12-2019 - |
質問
Grails 2.2.3とSpring Security ACLプラグイン1.1.1を使用しています。ユーザーが特定のオブジェクトにアクセスできるかどうかを判断するために、最初にオブジェクトを見る必要があるかどうかを判断するためにこれをやります。
コントローラレイヤーにAccessDeniedExceptionをキャッチしてから、ブラウザが認証情報を求めてもう一度やり直してください。応答ステータスを401に設定し、再度試すためにそれ自身に戻すという素朴なアプローチを試みました。私が走った問題は、ブラウザが信任状を求められたことがないということです。
これをコードに入れたいことはコントローラ層にあります:
@Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])
def controllerAction() {
try {
someService.action()
} catch (AccessDeniedException ade) {
// if logged in show FORBIDDEN, if not ask for credentials and try again
}
}
.
とサービス層は単に次のものを持っています:
@PostAuthorize("""returnObject.availability == 'ALL'""")
def action() {
PersistedObject.findById(1)
}
.
助けてくれてありがとう!
解決
私は問題を解決しました、そしてそれは私が401のステータスコードと一緒に送る必要があるヘッダーを欠けていました。
あなたがやりたいことを超えているものを修正することは:
@Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])
def controllerAction() {
try {
someService.action()
} catch (AccessDeniedException ade) {
if (!springSecurityService.isLoggedIn()) {
response.setHeader 'WWW-Authenticate', 'Basic realm="Grails Realm"' // the missing line
response.sendError HttpServletResponse.SC_UNAUTHORIZED
}
}
.
資格情報が提出された後、私がブラウザ内で自動的に開催された「リダイレクト」。リダイレクトに特有の何かを必要とすることについて誤解しました。
所属していません StackOverflow