Как использовать динамические параметры конфигурации ldap в приложении Nestjs с использованием библиотеки passport-ldapauth?

#node.js #typescript #ldap #passport.js #nestjs

#node.js #typescript #ldap #passport.js #nestjs

Вопрос:

Я пытаюсь пройти аутентификацию в Active Directory с использованием passport-ldapauth в приложении Nestjs. У меня нет учетной записи службы, и я хочу привязаться к Active Directory, используя имя пользователя в качестве DN. Я пытаюсь использовать асинхронный поиск конфигурации, но сталкиваюсь с проблемой при вызове super() в конструкторе класса strategy.

Я получаю следующую ошибку:

src/ldap.strategy.ts:12:9 — ошибка TS17009: ‘super’ должен быть вызван перед доступом к ‘this’ в конструкторе производного класса. 12 супер (this.getLdapConfig,

Есть идеи, как я могу заставить это работать в приложении Nestjs, расширив интерфейс стратегии / передав метод динамической конфигурации при вызове super()?

мой код:

 import * as Strategy from 'passport-ldapauth';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { Request } from 'express';
import { readFileSync } from 'fs';
import { callbackify } from 'util';

@Injectable()
export class LdapStrategy extends PassportStrategy(Strategy, 'ldap') {
    constructor(
    ) {     
        super(this.getLdapConfig,
         async (req: Request, user: any, done) => {
            console.log(req);
            req.user = user;
            return done(null, user);
        });
    }

    getLdapConfig(req: Request, callback: any) {
        
        process.nextTick(() => {
        let opts = {
            passReqToCallback: true,
            server: {
                url: 'ldaps://eassec.cc.corp:636',
                bindDN: `CN=${req.username}`,
                bindCredentials: '${req.password}',
                tlsOptions: {
                    ca: [
                        readFileSync('./src/public.crt')
                    ],
                    rejectUnauthorized: false
                },
                searchBase: 'ou=BU-IT',
                searchFilter: `(amp;(amp;(objectClass=person)(objectClass=user))(sAMAccountName=${req.username}))`
                searchAttributes: ['displayName', 'mail'],
            }

        };

            callback(null, opts);
        });
    }

}
  

Комментарии:

1. Вы пробовали извлекать getLdapConfig из const или функции, объявленной вне этого класса, а затем передавать ее в super ? Я не вижу причин, по которым это должен быть метод класса

2. @Jesse Carter спасибо, что сработало, глупая ошибка… Пожалуйста, добавьте это в качестве ответа.

3. Приятно! Рад, что это помогло. Это простая ошибка, которую я все время облажаюсь с такими вещами

Ответ №1:

Вы могли бы просто извлечь getLdapConfig const (функцию со стрелкой) или обычную функцию, объявленную вне класса, а затем передать ее в super вызов.

Он сам не ссылается ни на какие члены класса, поэтому нет причин, по которым он должен быть методом класса.