#angular #typescript #spring-boot #validation
Вопрос:
Это угловой код для проверки входа в систему. В весенней обуви все идеально. Но в форме входа в систему, если я дам идентификатор и пароль из базы данных. Там написано, что вход в систему прошел успешно. Даже если я дам неправильный идентификатор и пароль, это говорит об успешном входе в систему. Это не соответствует действительности. Пожалуйста, дайте мне знать, что здесь не так?!
1) auth.service.ts
import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { map } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class AuthenticationService { USER_NAME_SESSION_ATTRIBUTE_NAME = 'authenticatedUser' public patId!: number; public password!: String; constructor(private http: HttpClient) { } authenticationService(patId :number, password: String) { return this.http.get(`http://localhost:8080/patientlogins`, { headers: { authorization: this.createBasicAuthToken(patId, password) } }).pipe(map((res) =gt; { this.patId = patId; this.password = password; })); } createBasicAuthToken(patId: number, password: String) { return 'Basic ' window.btoa(patId ":" password) } isUserLoggedIn() { let user = sessionStorage.getItem(this.USER_NAME_SESSION_ATTRIBUTE_NAME) if (user === null) return false return true } getLoggedInpatId() { let user = sessionStorage.getItem(this.USER_NAME_SESSION_ATTRIBUTE_NAME) if (user === null) return '' return user } }
2)login.component.html
lt;div class="container col-lg-6"gt; lt;h1 class="text-center"gt;Loginlt;/h1gt; lt;div class="card"gt; lt;div class="card-body"gt; lt;form class="form-group"gt; lt;div class="alert alert-warning" *ngIf='invalidLogin'gt;{{errorMessage}}lt;/divgt; lt;div class="alert alert-success" *ngIf='loginSuccess'gt;{{successMessage}}lt;/divgt; lt;div class="form-group"gt; lt;label for="number"gt;PatientId:lt;/labelgt; lt;input type="text" class="form-control" id="patId" [(ngModel)]="patId" placeholder="Enter patId" name="patId"gt; lt;/divgt; lt;div class="form-group"gt; lt;label for="pwd"gt;Password:lt;/labelgt; lt;input type="password" class="form-control" [(ngModel)]="password" id="password" placeholder="Enter password" name="password"gt; lt;/divgt; lt;button (click)=handleLogin() class="btn btn-success"gt;Loginlt;/buttongt; lt;p class="message"gt;Not registered? lt;a href="#"gt;Create an accountlt;/agt;lt;/pgt; lt;/formgt; lt;/divgt; lt;/divgt; lt;/divgt;
3)login.component.ts
import { Component, OnInit } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; import { AuthenticationService } from './auth.service'; @Component({ selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.css'] }) export class LoginComponent implements OnInit { patId!: number; password!: string; errorMessage = 'Invalid Credentials'; successMessage!: string; invalidLogin = false; loginSuccess = false; constructor( private route: ActivatedRoute, private router: Router, private authenticationService: AuthenticationService) { } ngOnInit() { } handleLogin() { this.authenticationService.authenticationService(this.patId, this.password).subscribe((result)=gt; { this.invalidLogin = false; this.loginSuccess = true; this.successMessage = 'Login Successful.'; this.errorMessage='Invalid Login'; }, () =gt; { this.invalidLogin = true; this.loginSuccess = false; }); } }
4)app-routing.module.ts
import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { LoginComponent } from './login/login.component'; const routes: Routes = [ {path: 'login', component: LoginComponent}, ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }
5)app.module.ts
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { HttpClientModule } from '@angular/common/http'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { LoginComponent } from './login/login.component'; import { FormsModule } from '@angular/forms'; import { HomeComponent } from './home/home.component'; @NgModule({ declarations: [ AppComponent, LoginComponent, HomeComponent ], imports: [ BrowserModule, AppRoutingModule, HttpClientModule, FormsModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
Ответ №1:
() =gt; { this.invalidLogin = true; this.loginSuccess = false; }
Эта часть handleLogin
выполняется только в том случае, если http-сервер возвращает ошибку (500 или 503 или так далее).
В вашем случае это решит вашу проблему.
handleLogin() { this.authenticationService.authenticationService(this.patId, this.password).subscribe((result)=gt; { for (const obj of result) { if (obj.patId === this.patId amp;amp; obj.password === this.password) { this.invalidLogin = false; this.loginSuccess = true; this.successMessage = 'Login Successful.'; return; } } this.invalidLogin = true; this.loginSuccess = false; this.errorMessage='Invalid Login'; }, () =gt; { this.invalidLogin = true; this.loginSuccess = false; }); }
Но я настоятельно рекомендую вам не возвращать пароль пользователя в http-ответе. Это позволит раскрыть пароли пользователей другим пользователям. Вы должны проверить, совпадают ли идентификатор и пароль на стороне сервера, и просто ответить на результат.
Комментарии:
1. итак, что именно я должен изменить в коде?
2. Пожалуйста, поделитесь ответом
http://localhost:8080/patientlogins
. Как в случае успеха, так и в случае неудачи.3. Как вы сказали, если я пойду проверять и отвечать, я получу данные, которые отображаются в базе данных. Всякий раз, когда я нажимаю на вход, данные отображаются в ответ.
4. Если я захожу на localhost:8080/patientlogins …..[{«patId»:863,»password»:»*******»},{«patId»:544,»password»:»ededede»},{«patId»:333,»password»:»NDJEN»},{«patId»:433,»password»:»ededede»},{«patId»:2,»password»:»wswswws»},{«patId»:3444,»password»:»ededdeded»}]…………. Я получаю его на дисплее
5. Я выполнил код, который вы отправили. Когда я даю неправильный пароль/patid и нажимаю на вход, он ничего не показывает.