我试图允许匿名用户访问我的应用程序,我正在使用这个库:'keycloak-angular'与Angular 5.在描述中,它要求我初始化应用程序,如下所示:
providers: [
{
provide: APP_INITIALIZER,
useFactory: keycloakInitializer,
multi: true,
deps: [KeycloakService]
}
export function keycloakInitializer(keycloak: KeycloakService): () => Promise<any> {
return (): Promise<any> => {
return new Promise(async (resolve, reject) => {
try {
await keycloak.init({
config: {
url: 'my-url',
realm: 'my-realm',
clientId: 'my-client-id'
},
initOptions: {
onLoad: 'check-sso',
checkLoginIframe: false
}
});
resolve();
} catch (error) {
reject(error);
}
});
};
这样做会自动触发keycloak服务器的登录提示。有没有办法只按需触发登录?
谢谢
是的,这可以做到。使用工厂提供程序时,angular会在解析依赖项时调用工厂。
要延迟提示,请将函数包装在返回原始函数的工厂函数中并提供该函数。
这是看起来像
export async function initializeApp(
keycloak: KeycloakService,
deferredInitializer: typeof keycloakInitializer
) {
if (someCondition) {
const initializer = await deferredInitializer(keycloak);
}
}
export async function keycloakInitializer(keycloak: KeycloakService) {
await keycloak.init({
config: {
url: 'my-url',
realm: 'my-realm',
clientId: 'my-client-id'
},
initOptions: {
onLoad: 'check-sso',
checkLoginIframe: false
}
});
}
const providers = [
{
provide: APP_INITIALIZER,
useFactory: initializeApp,
deps: [KeycloakService, keycloakInitializer]
}
];
实际的keycloakInitializer
函数编写得非常糟糕,所以我将为后代重构它。
export async function keycloakInitializer(keycloak: KeycloakService) {
await keycloak.init({
config: {
url: 'my-url',
realm: 'my-realm',
clientId: 'my-client-id'
},
initOptions: {
onLoad: 'check-sso',
checkLoginIframe: false
}
});
}