Golang如何通过PAM进行用户身份验证

Golang如何通过PAM进行用户身份验证 大家好,

我想通过PAM(可插拔认证模块)来验证我的用户身份,在Go语言中如何实现呢?我看到其他语言如PHP对此有内置支持。

需要帮助。

谢谢

3 回复

谢谢 @lutzhorn 抱歉回复晚了

更多关于Golang如何通过PAM进行用户身份验证的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


有许多与PAM相关的包,请参阅pam - 搜索结果 - Go Packages。也许这个就是您要找的:

包 pam 包含了与 Linux 可插拔认证模块(PAM)交互的所有功能。目前,此包仅用于检查用户登录密码的有效性。更多信息请参阅 http://www.linux-pam.org/Linux-PAM-html/

pkg.go.dev

pam package - github.com/google/fscrypt/pam - Go Packages

包 pam 包含了与 Linux 可插拔认证模块(PAM)交互的所有功能。

在Go中实现PAM身份验证,可以使用第三方库github.com/msteinert/pam。以下是一个完整的示例:

package main

import (
    "fmt"
    "log"
    "github.com/msteinert/pam"
)

func authenticateWithPAM(username, password string) (bool, error) {
    t, err := pam.StartFunc("", username, func(s pam.Style, msg string) (string, error) {
        switch s {
        case pam.PromptEchoOff:
            return password, nil
        case pam.PromptEchoOn:
            return username, nil
        case pam.ErrorMsg:
            log.Printf("PAM Error: %s\n", msg)
            return "", nil
        case pam.TextInfo:
            log.Printf("PAM Info: %s\n", msg)
            return "", nil
        }
        return "", fmt.Errorf("unexpected PAM style")
    })
    if err != nil {
        return false, fmt.Errorf("failed to start PAM: %w", err)
    }
    defer t.End()

    err = t.Authenticate(0)
    if err != nil {
        return false, fmt.Errorf("authentication failed: %w", err)
    }

    err = t.AcctMgmt(0)
    if err != nil {
        return false, fmt.Errorf("account management failed: %w", err)
    }

    return true, nil
}

func main() {
    username := "testuser"
    password := "testpass"

    authenticated, err := authenticateWithPAM(username, password)
    if err != nil {
        log.Fatalf("Authentication error: %v", err)
    }

    if authenticated {
        fmt.Println("Authentication successful")
    } else {
        fmt.Println("Authentication failed")
    }
}

首先安装依赖:

go get github.com/msteinert/pam

关键点说明:

  1. pam.StartFunc 初始化PAM会话,第二个参数是用户名
  2. 回调函数处理不同类型的PAM消息:
    • PromptEchoOff: 用于密码输入
    • PromptEchoOn: 用于用户名输入
    • ErrorMsg/TextInfo: 处理信息消息
  3. Authenticate 执行身份验证
  4. AcctMgmt 检查账户状态(密码过期、账户锁定等)

注意:运行此程序需要root权限或相应的PAM配置权限。PAM服务名称(第一个参数)默认为空,会使用系统默认配置,也可以指定如"login"、"sudo"等具体服务。

编译时需要链接libpam:

go build -o pam_auth main.go
回到顶部