如何使用 passport-ldapauth 库在 Nestjs 应用程序中使用动态 ldap 配置选项?

Posted

技术标签:

【中文标题】如何使用 passport-ldapauth 库在 Nestjs 应用程序中使用动态 ldap 配置选项?【英文标题】:How to use dynamic ldap config options in a Nestjs app using passport-ldapauth library? 【发布时间】:2021-01-03 18:20:29 【问题描述】:

我正在尝试在 Nestjs 应用程序中使用 passport-ldapauth 对活动目录进行身份验证。我没有服务帐户,想使用用户名作为 DN 绑定到 Active Directory。我正在尝试使用异步配置检索,但在策略类的构造函数中调用 super() 时遇到问题。

我收到以下错误:

src/ldap.strategy.ts:12:9 - 错误 TS17009:在派生类的构造函数中访问“this”之前必须调用“super”。 12 超级(this.getLdapConfig,

知道如何通过在调用 super() 时扩展策略接口/传递动态配置方法在 Nestjs 应用程序中实现这一点吗?

我的代码:

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: `(&(&(objectClass=person)(objectClass=user))(sAMAccountName=$req.username))`
                searchAttributes: ['displayName', 'mail'],
            

        ;

            callback(null, opts);
        );
    


【问题讨论】:

您是否尝试过将getLdapConfig 提取到在此类之外声明的常量或函数,然后将其传递给super?我看不出它需要成为类方法的任何理由 @Jesse Carter 谢谢你的工作,愚蠢的错误......请添加这个作为答案。 不错!很高兴它有所帮助。让我总是搞砸这样的事情是一个容易的错误 【参考方案1】:

您可以将getLdapConfig 提取到类外部声明的常量(箭头函数)或常规函数,然后将其传递给super 调用。

它本身不引用任何类成员,因此没有理由需要它是类方法。

【讨论】:

以上是关于如何使用 passport-ldapauth 库在 Nestjs 应用程序中使用动态 ldap 配置选项?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用`openpyxl`库在Excel中的合并单元格中写入?

如何使用 Retrofit 库在 Android 中下载文件?

如何使用 reactstrap 库在 React 中设置发布表单?

如何使用 Appium 库在我的代码中使用 javascript

如何使用 CSV 库在 python 中打开 CSV? [复制]

如何使用 C# 中的 Emgu CV 库在图像上绘制矩形。举个例子