В настоящее время я участвую в проекте, который использует Angular со службой аутентификации IdentityServer4. В настоящее время, когда пользователь впервые попадает на нашу страницу, мы показываем ссылку для входа. Когда пользователь щелкает эту ссылку, он перенаправляется на страницу входа в систему IdentityServer. После успешного входа в систему пользователь перенаправляется обратно в наш сервис, благодаря чему становятся доступными новые ссылки меню.
Проблема в том, что существует задержка, в результате которой используемая библиотека OidcSecurityService может определить, аутентифицированы мы или нет. Во время этой задержки ссылка для входа по-прежнему доступна до тех пор, пока она не исчезнет после подтверждения аутентификации.
Я подумал о том, чтобы скрыть логин по умолчанию и показать только его, однако эта ссылка должна быть доступна, когда мы не вошли в систему, а у OidcSecurityService нет доступных методов, которые, как я вижу, позволяют нам узнать, была ли проверка аутентификации сделанный.
Есть ли рекомендуемый подход к тому, чтобы ссылка для входа вообще была недоступна на начальной странице?
HTML
<li routerLinkActive="active" class="hide"
*ngIf="!userIsAuthorized"
[ngClass]="{'show': showLogin, 'hide': !showLogin }">
<a style="cursor:pointer;" (click)="onLogin()">Login</a>
</li>
Эта служба активируется на уровне OidcSecurityService при определении аутентификации.
Пользовательская служба
constructor(private securityService: OidcSecurityService,
private userApiService: UserApiService,
private spinnerService: SpinnerService) {
console.log('userService() start');
//this will allow us to get the user details, needed to get the user permissions
this.securitySubscription = this.securityService.onUserDataLoaded
.subscribe(() => {
console.log('loading user data');
this.userLoadStarted.next(true);
this.loadAllUserDetails();
});
//We must check the local storage and IF user details saved, use these values and emit event, else make/use empty
var userAuthorized = this.securityService.isAuthorized;
if (userAuthorized != undefined && userAuthorized === true) {
console.log('userService() isw auth');
this.userPermissions = LocalStorageService.read('userPermissions');
this.userDetails = LocalStorageService.read('userDetails');
this.userDetailsAlreadyLoaded = true;
} else {
console.log('userService() not auth');
this.userPermissions = [];
this.userDetailsAlreadyLoaded = false;
}
console.log('userService() end');
}