[ADF-2795] SSO implicitflow (#3332)

* Enable OAUTH2

* Create SSO services

* SSO improvements

* Rollback sso login change

* Add SSO configuration from Setting component

* Refactoring

* Remove login ECM/BPM toggle and move use the userpreference instead of store

* fix host setting unit test

* Fix unit test missing instance

* use the Js api oauth

* add logout component and clean sso not used class

* fix dependencies cicle

* add translation settings

* fix style setting page

* clean

* JS APi should receive the oauth config from the userPreference and not from the config file

* change login if SSO is present

* missing spaces

* add sso test in login component

* add logout directive new properties test

* Improve host setting and remove library reference

* fix login test

* Remove unused code

* Fix authentication unit test

* fix authguard unit test

* fix csrf check login component

* fix unit test core and demo shell

* remove
This commit is contained in:
Maurizio Vitale
2018-06-07 23:19:58 +01:00
committed by Eugenio Romano
parent 3a6c12e624
commit f8e92b2fb0
57 changed files with 1295 additions and 681 deletions

View File

@@ -15,7 +15,7 @@
* limitations under the License.
*/
import { Component } from '@angular/core';
import { Component, ContentChildren } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
@@ -23,56 +23,152 @@ import { Observable } from 'rxjs/Observable';
import { AuthenticationService } from '../services';
import { setupTestBed } from '../testing/setupTestBed';
import { CoreModule } from '../core.module';
import { LogoutDirective } from './logout.directive';
describe('LogoutDirective', () => {
@Component({
selector: 'adf-test-component',
template: '<button adf-logout></button>'
})
class TestComponent {}
describe('No input', () => {
let fixture: ComponentFixture<TestComponent>;
let router: Router;
let authService: AuthenticationService;
@Component({
selector: 'adf-test-component',
template: '<button adf-logout></button>'
})
class TestComponent {
@ContentChildren(LogoutDirective)
logoutDirective: LogoutDirective;
}
let fixture: ComponentFixture<TestComponent>;
let router: Router;
let authService: AuthenticationService;
setupTestBed({
imports: [
CoreModule.forRoot(),
RouterTestingModule
],
declarations: [
TestComponent
]
});
beforeEach(() => {
router = TestBed.get(Router);
authService = TestBed.get(AuthenticationService);
fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
});
it('should redirect to login on click', () => {
spyOn(router, 'navigate').and.callThrough();
spyOn(authService, 'logout').and.returnValue(Observable.of(true));
const button = fixture.nativeElement.querySelector('button');
button.click();
expect(authService.logout).toHaveBeenCalled();
expect(router.navigate).toHaveBeenCalledWith(['/login']);
});
it('should redirect to login even on logout error', () => {
spyOn(router, 'navigate').and.callThrough();
spyOn(authService, 'logout').and.returnValue(Observable.throw('err'));
const button = fixture.nativeElement.querySelector('button');
button.click();
expect(authService.logout).toHaveBeenCalled();
expect(router.navigate).toHaveBeenCalledWith(['/login']);
});
setupTestBed({
imports: [
CoreModule.forRoot(),
RouterTestingModule
],
declarations: [
TestComponent
]
});
beforeEach(() => {
router = TestBed.get(Router);
authService = TestBed.get(AuthenticationService);
fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
describe('redirectUri', () => {
@Component({
selector: 'adf-test-component',
template: '<button adf-logout redirectUri="/myCustomUri"></button>'
})
class TestComponent {
@ContentChildren(LogoutDirective)
logoutDirective: LogoutDirective;
}
let fixture: ComponentFixture<TestComponent>;
let router: Router;
let authService: AuthenticationService;
setupTestBed({
imports: [
CoreModule.forRoot(),
RouterTestingModule
],
declarations: [
TestComponent
]
});
beforeEach(() => {
router = TestBed.get(Router);
authService = TestBed.get(AuthenticationService);
fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
});
it('should redirect to the the input redirectUri on click if present', () => {
spyOn(router, 'navigate').and.callThrough();
spyOn(authService, 'logout').and.returnValue(Observable.of(true));
const button = fixture.nativeElement.querySelector('button');
button.click();
expect(authService.logout).toHaveBeenCalled();
expect(router.navigate).toHaveBeenCalledWith(['/myCustomUri']);
});
});
it('should redirect to login on click', () => {
spyOn(router, 'navigate').and.callThrough();
spyOn(authService, 'logout').and.returnValue(Observable.of(true));
describe('redirectUri', () => {
const button = fixture.nativeElement.querySelector('button');
button.click();
@Component({
selector: 'adf-test-component',
template: '<button adf-logout [enabelRedirect]="false"></button>'
})
class TestComponent {
@ContentChildren(LogoutDirective)
logoutDirective: LogoutDirective;
}
expect(authService.logout).toHaveBeenCalled();
expect(router.navigate).toHaveBeenCalledWith([ '/login' ]);
});
let fixture: ComponentFixture<TestComponent>;
let router: Router;
let authService: AuthenticationService;
it('should redirect to login even on logout error', () => {
spyOn(router, 'navigate').and.callThrough();
spyOn(authService, 'logout').and.returnValue(Observable.throw('err'));
setupTestBed({
imports: [
CoreModule.forRoot(),
RouterTestingModule
],
declarations: [
TestComponent
]
});
const button = fixture.nativeElement.querySelector('button');
button.click();
beforeEach(() => {
router = TestBed.get(Router);
authService = TestBed.get(AuthenticationService);
fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
});
expect(authService.logout).toHaveBeenCalled();
expect(router.navigate).toHaveBeenCalledWith([ '/login' ]);
it('should not redirect if enabelRedirect is false', () => {
spyOn(router, 'navigate').and.callThrough();
spyOn(authService, 'logout').and.returnValue(Observable.of(true));
const button = fixture.nativeElement.querySelector('button');
button.click();
expect(authService.logout).toHaveBeenCalled();
expect(router.navigate).not.toHaveBeenCalled();
});
});
});

View File

@@ -15,7 +15,7 @@
* limitations under the License.
*/
import { Directive, ElementRef, OnInit, Renderer2 } from '@angular/core';
import { Input, Directive, ElementRef, OnInit, Renderer2 } from '@angular/core';
import { Router } from '@angular/router';
import { AuthenticationService } from '../services/authentication.service';
@@ -24,11 +24,18 @@ import { AuthenticationService } from '../services/authentication.service';
})
export class LogoutDirective implements OnInit {
constructor(
private elementRef: ElementRef,
private renderer: Renderer2,
private router: Router,
private auth: AuthenticationService) {
/** Uri to be redirect after the logout default value login */
@Input()
redirectUri: string = '/login';
/** Enable redirect after logout */
@Input()
enabelRedirect: boolean = true;
constructor(private elementRef: ElementRef,
private renderer: Renderer2,
private router: Router,
private auth: AuthenticationService) {
}
ngOnInit() {
@@ -42,12 +49,14 @@ export class LogoutDirective implements OnInit {
logout() {
this.auth.logout().subscribe(
() => this.redirectToLogin(),
() => this.redirectToLogin()
() => this.redirectToUri(),
() => this.redirectToUri()
);
}
redirectToLogin() {
this.router.navigate(['/login']);
redirectToUri() {
if (this.enabelRedirect) {
this.router.navigate([this.redirectUri]);
}
}
}

View File

@@ -16,20 +16,28 @@
*/
import { SimpleChange } from '@angular/core';
import { fakeAsync, tick } from '@angular/core/testing';
import { fakeAsync, tick, TestBed } from '@angular/core/testing';
import { NodeFavoriteDirective } from './node-favorite.directive';
import { AlfrescoApiServiceMock } from '../mock/alfresco-api.service.mock';
import { AppConfigService } from '../app-config/app-config.service';
import { StorageService } from '../services/storage.service';
import { AlfrescoApiService } from '../services/alfresco-api.service';
import { UserPreferencesService } from '../services/user-preferences.service';
import { setupTestBed } from '../testing/setupTestBed';
import { CoreTestingModule } from '../testing/core.testing.module';
describe('NodeFavoriteDirective', () => {
let directive;
let alfrescoApiService: AlfrescoApiService;
let alfrescoApiService;
let userPreferences;
setupTestBed({
imports: [CoreTestingModule]
});
beforeEach(() => {
alfrescoApiService = new AlfrescoApiServiceMock(new AppConfigService(null), new StorageService());
userPreferences = TestBed.get(UserPreferencesService);
alfrescoApiService = new AlfrescoApiServiceMock(new AppConfigService(null), userPreferences, new StorageService());
directive = new NodeFavoriteDirective( alfrescoApiService);
});