接前一篇文章:PAM从入门到精通(八)
本文参考:
《The Linux-PAM Application Developers' Guide》
先再来重温一下PAM系统架构:
更加形象的形式:
五、主要函数详解
7. pam_authenticate
概述:
对用户进行身份验证。
函数声明:
#include <security/pam_appl.h>int pam_authenticate ( pamh , flags );pam_handle_t * pamh ;int flags ;
详细描述:
pam_authenticate函数用于对用户进行身份验证。用户被要求提供一个基于身份验证服务的身份验证令牌,通常这是一个密码,但也可能是指纹。
PAM服务模块可以请求用户通过对话机制输入其用户名(参见pam_start()和pam_conv())。经过身份验证的用户名称将出现在PAM的PAM_USER项中。可以通过调用pam_get_item()来恢复此项目。
参数说明:
- pam_handle_t *pamh
pamh参数是通过先前调用pam_start()获得的身份验证句柄。
- int flags
flags参数是以下值中的零或更多的二进制或:
PAM_SILENT
不发出任何消息。
PAM_DISALLOW_NULL_AUTHTOK
如果用户没有注册的身份验证令牌,PAM模块服务应返回PAM_AUTH_ERR。
返回值:
- PAM_ABORT:应用程序应在首先调用pam_end()后立即退出。
- PAM_AUTH_ERR:用户未通过身份验证。
- PAM_CRED_INSUFFICIENT:由于某些原因,应用程序没有足够的资格(凭证)来验证用户。
- PAM_AUTHINFO_UNAVAIL:模块无法访问身份验证信息。这可能是由于网络或硬件故障等原因造成的。
- PAM_MAXTRIES:一个或多个身份验证模块已达到对用户进行身份验证的尝试次数限制。不要再次进行尝试。
- PAM_SUCCESS:用户已成功通过身份验证。
- PAM_USER_UNKNOWN:身份验证服务未知的用户。
实例:
实例1. 一般性代码
while (!authenticated && retry < MAX_RETRIES){status = pam_authenticate(pamh, 0);/* 认证,检查用户输入的密码是否正确 */}
实例2. SDDM中的代码
参见SDDM包源码目录src/helper/backend/PamHandle.cpp中的PamHandle::authenticate函数。
代码如下:
bool PamHandle::authenticate(int flags) {qDebug() << "[PAM] Authenticating...";m_result = pam_authenticate(m_handle, flags | m_silent);if (m_result != PAM_SUCCESS) {qWarning() << "[PAM] authenticate:" << pam_strerror(m_handle, m_result);}qDebug() << "[PAM] returning.";return m_result == PAM_SUCCESS;}
更多函数请看后续文章。