diff --git a/lib/core/directives/logout.directive.spec.ts b/lib/core/directives/logout.directive.spec.ts index 59b5f46fa0..d7c1200740 100644 --- a/lib/core/directives/logout.directive.spec.ts +++ b/lib/core/directives/logout.directive.spec.ts @@ -20,6 +20,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { Router } from '@angular/router'; import { of, throwError } from 'rxjs'; import { AuthenticationService } from '../services'; +import { AppConfigService } from '../app-config'; import { setupTestBed } from '../testing/setup-test-bed'; import { LogoutDirective } from './logout.directive'; import { CoreTestingModule } from '../testing/core.testing.module'; @@ -41,6 +42,7 @@ describe('LogoutDirective', () => { let fixture: ComponentFixture; let router: Router; let authService: AuthenticationService; + let appConfig: AppConfigService; setupTestBed({ imports: [ @@ -55,11 +57,13 @@ describe('LogoutDirective', () => { beforeEach(() => { router = TestBed.inject(Router); authService = TestBed.inject(AuthenticationService); + appConfig = TestBed.inject(AppConfigService); fixture = TestBed.createComponent(TestComponent); fixture.detectChanges(); + appConfig.config['loginRoute'] = undefined; }); - it('should redirect to login on click', () => { + it('should redirect to login route if basic auth and loginRoute NOT defined', () => { spyOn(router, 'navigate'); spyOn(authService, 'logout').and.returnValue(of(true)); @@ -70,6 +74,32 @@ describe('LogoutDirective', () => { expect(router.navigate).toHaveBeenCalledWith(['/login']); }); + it('should redirect to loginRoute if basic auth and loginRoute defined', () => { + spyOn(router, 'navigate'); + spyOn(authService, 'isOauth').and.returnValue(false); + appConfig.config['loginRoute'] = 'fake-base-logout'; + spyOn(authService, 'logout').and.returnValue(of(true)); + + const button = fixture.nativeElement.querySelector('button'); + button.click(); + + expect(authService.logout).toHaveBeenCalled(); + expect(router.navigate).toHaveBeenCalledWith(['fake-base-logout']); + }); + + it('should redirect to redirectUriLogout on click if SSO auth', () => { + spyOn(router, 'navigate'); + spyOn(authService, 'isOauth').and.returnValue(true); + spyOn(authService, 'logout').and.returnValue(of(true)); + appConfig.config['oauth2.redirectUriLogout'] = 'fake-logout'; + + const button = fixture.nativeElement.querySelector('button'); + button.click(); + + expect(authService.logout).toHaveBeenCalled(); + expect(router.navigate).toHaveBeenCalledWith(['fake-logout']); + }); + it('should redirect to login even on logout error', () => { spyOn(router, 'navigate'); spyOn(authService, 'logout').and.returnValue(throwError('err')); @@ -167,5 +197,6 @@ describe('LogoutDirective', () => { expect(authService.logout).toHaveBeenCalled(); expect(router.navigate).not.toHaveBeenCalled(); }); + }); }); diff --git a/lib/core/directives/logout.directive.ts b/lib/core/directives/logout.directive.ts index 5e24501121..0be926ddb9 100644 --- a/lib/core/directives/logout.directive.ts +++ b/lib/core/directives/logout.directive.ts @@ -17,6 +17,7 @@ import { Input, Directive, ElementRef, OnInit, Renderer2 } from '@angular/core'; import { Router } from '@angular/router'; +import { AppConfigService } from '../app-config/app-config.service'; import { AuthenticationService } from '../services/authentication.service'; @Directive({ @@ -26,7 +27,7 @@ export class LogoutDirective implements OnInit { /** URI to redirect to after logging out. */ @Input() - redirectUri: string = '/login'; + redirectUri: string; /** Enable redirecting after logout */ @Input() @@ -35,10 +36,12 @@ export class LogoutDirective implements OnInit { constructor(private elementRef: ElementRef, private renderer: Renderer2, private router: Router, + private appConfig: AppConfigService, private auth: AuthenticationService) { } ngOnInit() { + if (this.elementRef.nativeElement) { this.renderer.listen(this.elementRef.nativeElement, 'click', (evt) => { evt.preventDefault(); @@ -47,6 +50,17 @@ export class LogoutDirective implements OnInit { } } + getRedirectUri () { + if (this.redirectUri === undefined ) { + if (this.auth.isOauth()) { + return this.appConfig.get('oauth2.redirectUriLogout'); + } else { + return this.appConfig.get('loginRoute', '/login'); + } + } + return this.redirectUri; + } + logout() { this.auth.logout().subscribe( () => this.redirectToUri(), @@ -55,8 +69,9 @@ export class LogoutDirective implements OnInit { } redirectToUri() { + const redirectRoute = this.getRedirectUri(); if (this.enableRedirect) { - this.router.navigate([this.redirectUri]); + this.router.navigate([redirectRoute]); } } }