로컬 개발에 사용하기 위해 어떻게 가짜 keycloack 호출을 할 수 있습니까?

넬슨 테이 세이라

우리 회사는 LDAP와 연결된 인증을 위해 Keycloak을 사용하고 기업 데이터로 채워진 사용자 개체를 반환합니다. 그러나이 기간 동안 우리는 모두 집에서 일하고 있으며, 앱을 다시로드 할 때마다 회사 서버에서 인증을 받아야하는 일상 업무에서 비용이 많이 드는 오버 헤드로 입증되었습니다. 특히 간헐적 인 인터넷 연결의 경우.

Keycloak 호출을 가짜로 만들고 성공한대로 keycloak.protect ()가 작동하도록하려면 어떻게해야합니까?

내 컴퓨터에 Keyclock 서버를 설치할 수 있지만, 그 외에 다른 서버가 실행될 것이기 때문에 그렇게하지 않겠습니다. vagrant VM, Postgres 서버, be server 및 내가 열어 둔 다른 모든 것. 모의 호출을하고 고정 된 하드 코딩 된 객체를 반환하는 것이 가장 좋습니다.

내 프로젝트의 app-init.ts는 다음과 같습니다.

import { KeycloakService } from 'keycloak-angular';
import { KeycloakUser } from './shared/models/keycloakUser';
<...>

export function initializer(
    keycloak: KeycloakService,
    <...>
): () => Promise<any> {
    return (): Promise<any> => {
        return new Promise(async (res, rej) => {
            <...>    
            await keycloak.init({
                config: environment.keycloakConfig,
                initOptions: {
                    onLoad: 'login-required',
                    // onLoad: 'check-sso',
                    checkLoginIframe: false
                },
                bearerExcludedUrls: [],
                loadUserProfileAtStartUp: false
            }).then((authenticated: boolean) => {
                if (!authenticated) return;
                keycloak.getKeycloakInstance()
                    .loadUserInfo()
                    .success(async (user: KeycloakUser) => {
                       // ...
                       // load authenticated user data
                       // ...
                    })    
            }).catch((err: any) => rej(err));
            res();
        });
    };

고정 된 로그인 사용자 한 명만 있으면됩니다. 그러나 고정 된 사용자 지정 데이터를 반환해야합니다. 이 같은:

{ username: '111111111-11', name: 'Whatever Something de Paula',
  email: 'whate[email protected]', department: 'sales', employee_number: 7777777 }

편집하다

@BojanKogoj의 아이디어를 보려고했지만 Angular Interceptor 페이지 및 기타 예제 및 자습서에서 AFAIU를 구성 요소에 삽입해야합니다. Keycloak 초기화는 구성 요소가 아닌 앱 초기화시 호출됩니다. 또한 Keycloak의 반환은 init () 메서드의 직접 반환이 아닙니다. .getKeycloakInstance().loadUserInfo().success()시퀀스의 다른 개체를 통과 합니다. 아니면 완전히 이해하지 못한 것은 나뿐 일 수도 있습니다. 누군가 호출을 가로 채서 올바른 결과를 반환 할 수있는 인터셉터의 예를 가지고 올 수 있다면 가능성이있을 수 있습니다.

편집 2

내가 필요로하는 것을 보완하는 것은 전체 keycloak의 시스템이 작동하는 것입니다. 것을 통지 바랍니다 (user: KeycloakUser) => {함수에 전달되는 successkeycloak의 내부 시스템의 방법을. 위에서 말했듯이 경로에는 작동해야하는 keycloak.protect ()가 있습니다. 따라서 사용자와 약속을 반환하는 단순한 경우가 아닙니다. 전체 .getKeycloakInstance (). loadUserInfo (). success () 체인을 모의 처리해야합니다. 아니면 적어도 그것이 내가 그것을 이해하는 방법입니다.

@yurzui의 답변을 기반으로 만든 솔루션에 답변을 포함했습니다.

누군가가 더 나은 해결책을 찾을 수 있는지보기 위해 현상금을 수여하기 위해 며칠을 기다릴 것입니다 (나는 의심 스럽습니다).

Yurzui

Angular 환경 (또는 심지어 process.env) 변수를 활용 하여 실제 구현과 모의 구현간에 전환 할 수 있습니다 .

다음은이를 수행하는 방법에 대한 간단한 예입니다.

app-init.ts

...
import { environment } from '../environments/environment';

export function initializer(
  keycloak: KeycloakService
): () => Promise<any> {

  function authenticate() {
    return keycloak
      .init({
        config: {} as any,
        initOptions: {onLoad: 'login-required', checkLoginIframe: false},
        bearerExcludedUrls: [],
        loadUserProfileAtStartUp: false
      })
      .then(authenticated => {
        return authenticated ? keycloak.getKeycloakInstance().loadUserInfo() : Promise.reject();
      });
  }

  // we use 'any' here so you don't have to define keyCloakUser in each environment    
  const { keyCloakUser } = environment as any; 

  return () => {
    return (keyCloakUser ? Promise.resolve(keyCloakUser) : authenticate()).then(user => {
      // ...
      // do whatever you want with user
      // ...
    });
  };
}

environment.ts

export const environment = {
  production: false,
  keyCloakUser: {
    username: '111111111-11',
    name: 'Whatever Something de Paula',
    email: '[email protected]',
  }
};

environment.prod.ts

export const environment = {
  production: true,
};

최신 정보

KeycloakService클라이언트 측 에서 조롱하고 싶다면 Angular 종속성 주입에이를 처리하도록 지시 할 수 있습니다.

app.module.ts

import { environment } from '../environments/environment';
import { KeycloakService, KeycloakAngularModule } from 'keycloak-angular';
import { MockedKeycloakService } from './mocked-keycloak.service';

@NgModule({
  ...
  imports: [
    ...
    KeycloakAngularModule
  ],
  providers: [
    {
      provide: KeycloakService,
      useClass: environment.production ? KeycloakService : MockedKeycloakService
    },
    {
      provide: APP_INITIALIZER,
      useFactory: initializer,
      multi: true,
      deps: [KeycloakService]
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

mocked-keycloak.service.ts

import { Injectable} from '@angular/core';
import { KeycloakService } from 'keycloak-angular';

@Injectable()
class MockedKeycloakService extends KeycloakService {
  init() {
    return Promise.resolve(true);
  }

  getKeycloakInstance() {
    return {
      loadUserInfo: () => {
        let callback;
        Promise.resolve().then(() => {
          callback({
            userName: 'name'
          });
        });
        return {
          success: (fn) => callback = fn
        };
      }
    } as any;
  }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

주기적인 호출을 위해 어떻게 실행 파일을 RAM에로드 할 수 있습니까?

분류에서Dev

DateTime 변수에 시간을 추가하기 위해 AddHours 및 AddMinutes를 어떻게 사용할 수 있습니까?

분류에서Dev

하위 배열의 다른 컬렉션에있는 속성을 어떻게 호출 할 수 있습니까?

분류에서Dev

C #의 입력을 위해 개체 매개 변수를 사용하여 Oracle 저장 프로 시저를 어떻게 호출 할 수 있습니까?

분류에서Dev

웹 개발 및 프로그래밍을 위해 Vim을 어떻게 사용자 정의 할 수 있습니까?

분류에서Dev

로컬 개발 중에 CF 정의 대상을 어떻게 사용할 수 있습니까?

분류에서Dev

함수 호출 여부를 결정하기 위해 두 개의 스크립트에서 bool을 어떻게 사용할 수 있습니까?

분류에서Dev

웹 앱 개발자에게 가장 간단한 용어로 블록 체인이란 무엇입니까? 무엇을 위해 사용할 수 있습니까?

분류에서Dev

QTP에서 개발 한 테스트 스크립트에 vbscript를 통해 로컬 객체가 존재하는지 어떻게 확인할 수 있습니까?

분류에서Dev

"ctor ca n't be resolved"리플렉션 경고, 즉 생성자 호출을 수정하기 위해 clojure에 typehint를 어떻게 추가 할 수 있습니까?

분류에서Dev

Arduino에서 다른 함수를 호출하기 위해 변경되는 int 값을 어떻게 사용할 수 있습니까?

분류에서Dev

함수에서 COPY TO 대상을 지정하기 위해 변수를 어떻게 사용할 수 있습니까?

분류에서Dev

확인하는 데 사용할 수있는 Atom에 대해 허용 가능한 pkgver를 제공하기 위해 git을 어떻게 얻습니까?

분류에서Dev

Reactjs Material UI에서 makeStyles로 반응하기 위해 CSS @media를 어떻게 사용할 수 있습니까?

분류에서Dev

Rmarkdown에서 PDF 생성을 자동화하기 위해 neovim을 어떻게 사용할 수 있습니까?

분류에서Dev

JS에서 중복을 확인하기 위해 some ()을 어떻게 사용할 수 있습니까?

분류에서Dev

Keras에서 숨겨진 스칼라 출력에 가중치를 부여하기 위해 스칼라 상수를 어떻게 사용할 수 있습니까?

분류에서Dev

chroot 환경을 식별하기 위해 bashrc에서 debian_chroot를 어떻게 사용할 수 있습니까?

분류에서Dev

함수 정의 모음에서 시작하는 함수 이름 배열을 만들기 위해 매크로를 어떻게 사용할 수 있습니까?

분류에서Dev

로그인 세부 정보에 대해 userInput을 확인하기 위해 메서드 추상화를 어떻게 사용할 수 있습니까?

분류에서Dev

내 C # 프로그램에서 dll 파일을 어떻게 사용하고 호출 할 수 있습니까?

분류에서Dev

PMD, FindBugs 및 Checkstyle을 Java 개발 프로젝트에 함께 사용할 수 있습니까? 기능이 광범위하게 겹치는가?

분류에서Dev

페이지에 추가하기 위해 json 데이터에 액세스하려면 jquery .when을 어떻게 사용할 수 있습니까?

분류에서Dev

이 React Spring 프로젝트에서 슬라이드를 자동으로 변경하기 위해 setInterval ()을 어떻게 사용할 수 있습니까?

분류에서Dev

로컬 아파치 개발 서버 (localhost)에서 TLS를 어떻게 사용할 수 있습니까?

분류에서Dev

포트 블록이 발생하는 위치를 어떻게 (로깅을 통해) 증명할 수 있습니까?

분류에서Dev

O / S 구축을 위해 로컬 chroot 환경에서 액세스 할 수있는 로컬 저장소를 생성하려면 어떻게해야합니까?

분류에서Dev

동일한 테이블에서 두 개의 값을 계산하고 출력에서 두 개의 고유 한 값을 가져 오기 위해 선택 개수 (고유 x)를 어떻게 사용할 수 있습니까?

분류에서Dev

QML 프로그램에서 Unity7 알림을 활용하려면 어떻게해야합니까? 사용할 수있는 API가 있습니까?

Related 관련 기사

  1. 1

    주기적인 호출을 위해 어떻게 실행 파일을 RAM에로드 할 수 있습니까?

  2. 2

    DateTime 변수에 시간을 추가하기 위해 AddHours 및 AddMinutes를 어떻게 사용할 수 있습니까?

  3. 3

    하위 배열의 다른 컬렉션에있는 속성을 어떻게 호출 할 수 있습니까?

  4. 4

    C #의 입력을 위해 개체 매개 변수를 사용하여 Oracle 저장 프로 시저를 어떻게 호출 할 수 있습니까?

  5. 5

    웹 개발 및 프로그래밍을 위해 Vim을 어떻게 사용자 정의 할 수 있습니까?

  6. 6

    로컬 개발 중에 CF 정의 대상을 어떻게 사용할 수 있습니까?

  7. 7

    함수 호출 여부를 결정하기 위해 두 개의 스크립트에서 bool을 어떻게 사용할 수 있습니까?

  8. 8

    웹 앱 개발자에게 가장 간단한 용어로 블록 체인이란 무엇입니까? 무엇을 위해 사용할 수 있습니까?

  9. 9

    QTP에서 개발 한 테스트 스크립트에 vbscript를 통해 로컬 객체가 존재하는지 어떻게 확인할 수 있습니까?

  10. 10

    "ctor ca n't be resolved"리플렉션 경고, 즉 생성자 호출을 수정하기 위해 clojure에 typehint를 어떻게 추가 할 수 있습니까?

  11. 11

    Arduino에서 다른 함수를 호출하기 위해 변경되는 int 값을 어떻게 사용할 수 있습니까?

  12. 12

    함수에서 COPY TO 대상을 지정하기 위해 변수를 어떻게 사용할 수 있습니까?

  13. 13

    확인하는 데 사용할 수있는 Atom에 대해 허용 가능한 pkgver를 제공하기 위해 git을 어떻게 얻습니까?

  14. 14

    Reactjs Material UI에서 makeStyles로 반응하기 위해 CSS @media를 어떻게 사용할 수 있습니까?

  15. 15

    Rmarkdown에서 PDF 생성을 자동화하기 위해 neovim을 어떻게 사용할 수 있습니까?

  16. 16

    JS에서 중복을 확인하기 위해 some ()을 어떻게 사용할 수 있습니까?

  17. 17

    Keras에서 숨겨진 스칼라 출력에 가중치를 부여하기 위해 스칼라 상수를 어떻게 사용할 수 있습니까?

  18. 18

    chroot 환경을 식별하기 위해 bashrc에서 debian_chroot를 어떻게 사용할 수 있습니까?

  19. 19

    함수 정의 모음에서 시작하는 함수 이름 배열을 만들기 위해 매크로를 어떻게 사용할 수 있습니까?

  20. 20

    로그인 세부 정보에 대해 userInput을 확인하기 위해 메서드 추상화를 어떻게 사용할 수 있습니까?

  21. 21

    내 C # 프로그램에서 dll 파일을 어떻게 사용하고 호출 할 수 있습니까?

  22. 22

    PMD, FindBugs 및 Checkstyle을 Java 개발 프로젝트에 함께 사용할 수 있습니까? 기능이 광범위하게 겹치는가?

  23. 23

    페이지에 추가하기 위해 json 데이터에 액세스하려면 jquery .when을 어떻게 사용할 수 있습니까?

  24. 24

    이 React Spring 프로젝트에서 슬라이드를 자동으로 변경하기 위해 setInterval ()을 어떻게 사용할 수 있습니까?

  25. 25

    로컬 아파치 개발 서버 (localhost)에서 TLS를 어떻게 사용할 수 있습니까?

  26. 26

    포트 블록이 발생하는 위치를 어떻게 (로깅을 통해) 증명할 수 있습니까?

  27. 27

    O / S 구축을 위해 로컬 chroot 환경에서 액세스 할 수있는 로컬 저장소를 생성하려면 어떻게해야합니까?

  28. 28

    동일한 테이블에서 두 개의 값을 계산하고 출력에서 두 개의 고유 한 값을 가져 오기 위해 선택 개수 (고유 x)를 어떻게 사용할 수 있습니까?

  29. 29

    QML 프로그램에서 Unity7 알림을 활용하려면 어떻게해야합니까? 사용할 수있는 API가 있습니까?

뜨겁다태그

보관