Răsfoiți Sursa

fix(core): Improved resolution of Administrator.user

Relates to #1489. The previous resolution method would fail when using a
non-native auth strategy that was not based on an email identifier.
Michael Bromley 2 ani în urmă
părinte
comite
c2a468598f

+ 1 - 2
docs/docs/guides/core-concepts/auth/index.md

@@ -546,8 +546,7 @@ export class KeycloakAuthenticationStrategy implements AuthenticationStrategy<Ke
         return this.externalAuthenticationService.createAdministratorAndUser(ctx, {
             strategy: this.name,
             externalIdentifier: userInfo.sub,
-            // identifier and emailAddress should be equal
-            identifier: userInfo.email,
+            identifier: userInfo.preferred_username,
             emailAddress: userInfo.email,
             firstName: userInfo.given_name,
             lastName: userInfo.family_name,

+ 7 - 7
packages/core/src/api/resolvers/entity/administrator-entity.resolver.ts

@@ -1,25 +1,25 @@
 import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
 
-import { EntityNotFoundError, InternalServerError } from '../../../common/error/errors';
+import { TransactionalConnection } from '../../../connection/index';
 import { Administrator } from '../../../entity/administrator/administrator.entity';
 import { User } from '../../../entity/user/user.entity';
-import { UserService } from '../../../service/services/user.service';
 import { RequestContext } from '../../common/request-context';
 import { Ctx } from '../../decorators/request-context.decorator';
 
 @Resolver('Administrator')
 export class AdministratorEntityResolver {
-    constructor(private userService: UserService) {}
+    constructor(private connection: TransactionalConnection) {}
 
     @ResolveField()
     async user(@Ctx() ctx: RequestContext, @Parent() administrator: Administrator): Promise<User> {
         if (administrator.user) {
             return administrator.user;
         }
-        const user = await this.userService.getUserByEmailAddress(ctx, administrator.emailAddress);
-        if (!user) {
-            throw new EntityNotFoundError('User', '<not found>');
-        }
+        const { user } = await this.connection.getEntityOrThrow(ctx, Administrator, administrator.id, {
+            relations: {
+                user: { roles: true },
+            },
+        });
         return user;
     }
 }