[英]Spring Security OAuth2 Login using External Login Page
我想知道是否可以將 Spring Security 配置為在 OAuth 登錄過程中使用外部托管的登錄頁面。 沒關系,這不是一個好主意,並且違背了 OAuth 的目的之一(將登錄/憑據/身份驗證問題與客戶端和資源服務器分開)。
我有以下設置:
@EnableAuthorizationServer
驗證服務器(使用 Spring Security OAuth / @EnableAuthorizationServer
)我尋求的 OAuth 流程如下:
我可以配置 Spring Security 來指定一個絕對 url,以便重定向到我的 SPA 登錄頁面:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors()
.and()
... config ...
.and()
.formLogin()
.loginPage("http://angular-spa-app/login")
.loginProcessingUrl("/login")
.permitAll();
}
當我完成這個流程時,我看到第一個請求是向oauth/authorize?state=...&nonce=...&etc...
,然后重定向到http://angular-spa-app/login
。 但是當我登錄時,Spring 無法檢測到它應該重定向回會話中保存的oauth/authorize
url。
進一步深入研究,我發現當第一個請求oauth/authorize
,帶有 params 的完整 url 保存在會話中( HttpSessionRequestCache.saveRequest(...)
。
當登錄表單提交並且身份驗證成功時,Spring 會嘗試檢索保存的請求以獲取重定向 url 作為 302 Location 標頭發送。 但是當它這樣做時,會話為空,因此 Spring 無法檢索任何保存的請求。 為什么是這樣? 我是否需要修改 Spring 會話設置才能解決此問題?
問題根本不在於 Spring Security; 它是與 Angular SPA 一起使用的。 在從 Angular 應用程序將跨域 POST 發回 /login 時,我需要發送 JSESSION_ID cookie。
為此,我創建了一個HttpInterceptor
(如此處所述):
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor() {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
withCredentials: true
});
return next.handle(request);
}
}
withCredentials: true
位是重要的部分; 這會指示瀏覽器將 cookie 與 XHR 請求一起發送。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.