3

即時通訊嘗試將春季安全與自定義角2登錄,這是我的應用程序的特定端點是保護與春季安全,試圖訪問它將重定向到/登錄處理角2.現在,我不知道如何執行登錄和授予訪問後端API一旦記錄。角度2登錄與彈簧安全

我正在配置Spring安全如下:

@Override 
protected void configure(final HttpSecurity http) throws Exception { 
    http 
     .csrf().disable() 
     .cors().and() 
     .authorizeRequests() 
     .antMatchers("/api/someEndpoint/**") 
     .hasRole(ADMIN_ROLE).and().formLogin() 
     .loginPage("/login").and().logout(); 
} 


@Override 
protected void configure(final AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); 
} 

因爲我有默認的登錄一切運行良好,但我發現自己無法創建工作角2登錄集成。 我試着在角2以下代碼無濟於事:

login(loginDetails:Object) { 
    console.log(loginDetails) 
    const headers = new Headers({ 'Content-Type': 'application/json' }); 
const options = new RequestOptions({ headers: headers }); 
const body = JSON.stringify(loginDetails); 
    console.log(headers); 
    console.log(body); 
return this.http.post(this.loginUrl, body, options) 
} 

據我知道用戶名和密碼的變量名春季安全默認值是「用戶名」和「密碼」,我確信正在傳遞在請求正文所以當傳遞一些無效的用戶數據,如{"username":"admin", "password" : "pass"}我應該被重定向到/登錄?錯誤或什麼,並且當成功通過身份驗證時,我應該被重定向到/歡迎並保持身份驗證

我有用戶和通過定義在我的分貝和我的自定義userDetailsS​​ervice檢查它 任何答案,意見或問題,歡迎

+1

'formLogin'預計內容類型的參數'應用/ x-www-form-urlencoded'而不是'application/json'。因爲你正在使用API​​,所以你必須使用HTTP Basic或OAuth2 – WildDev

+0

並不是我嘗試這樣做的方式現在HTTP基本? –

+0

其實你不是 – WildDev

回答

6

一旦您使用API​​,您必須使用HTTP Basic或OAuth2,而不是表單1。使用它們時需要使用HTTPS。

要使用角2登錄服務應像這樣在HTTP基本方式權威性:然後

loginNow() { 
    this 
    .loginService 
    .login(this.loginDetails) 
    .subscribe(next => { 
     this.router.navigateByUrl("/"); // login succeed 
    }, error => { 
     this.error = "Bad credentials"; // or extract smth from <error> object 
    }); 
} 

,您可以:

login (loginDetails: any): Observable<LoginResponse> { // custom class, may be empty for now 

    let headers = new Headers({ 
      'Authorization': 'Basic ' + btoa(loginDetails.login + ':' + loginDetails.pass), 
      'X-Requested-With': 'XMLHttpRequest' // to suppress 401 browser popup 
    }); 

    let options = new RequestOptions({ 
      headers: headers 
    }); 

    return this 
       .http 
       .post(this.loginUrl, {}, options) 
       .catch(e => this.handleError(e); // handle 401 error - bad credentials 
} 

...那麼你就可以在組件訂閱此在組件模板中使用loginNow()方法,如(click)="loginNow()

一旦服務器接受授權,由於Spring Security功能,JSESSIONID將被自動存儲在您的瀏覽器中,您將不會被迫每次發送憑證詳細信息以訪問私人資源。

登錄服務器方法可能如下:

@PreAuthorize("hasRole('USER')") 
@PostMapping("/login") 
public ResponseEntity login() { 
    return new ResponseEntity<>(HttpStatus.OK); 
} 

...它將與401 UNAUTHORIZED一旦授權失敗拒絕或200 SUCCESS,如果它不會接受。

如何建立與有道的服務器有一些Spring Security的示範項目 - https://github.com/spring-guides/tut-spring-security-and-angular-js

代碼沒有進行測試,雖然:(

+0

謝謝你的回答,我有一個問題,你:(whops,編輯:) {「username」:「admin」,「password」:「pass」}這是我發送的字符串,我沒有管理員和通行證分開,我從formGroup.value得到他們。 請問如何修改?'Authorization':'Basic'+ btoa(loginDetails.login +':'+ loginDetails.pass) 會被修改嗎? –

+0

最好的選擇是從'formGroup'拒絕,並使用雙向綁定的組件字段,像這樣:'[(ngModel)] =「this.username」'由它指定'input'元素。否則,無論如何,你必須解析它們,可能是像這樣 - >'JSON.parse(this.loginDetails).username'等 – WildDev

+0

我綁定了用戶名並傳遞給組件並將它們傳遞給登錄服務,但它總是重定向到歡迎頁面,即使輸入的憑據不正確,我也沒有進行身份驗證,因爲當我鍵入正確的憑據我重定向到歡迎,但無法訪問安全端點 –