接前一篇文章:PAM从入门到精通(四)
本文参考:
《The Linux-PAM Application Developers' Guide》
先再来重温一下PAM系统架构:
更加形象的形式:
概述:
设置PAM项。
详细描述:
pam_set_item函数允许应用程序和PAM服务模块访问和更新item_type的PAM信息。为此,将创建项参数指向的对象的副本。支持以下item_types:
服务名称(标识PAM函数将用于验证程序的PAM堆栈)。
将使用其提供身份服务的实体的用户名。也就是说,在身份验证之后,PAM_USER标识可以使用该服务的本地实体。
注意,PAM堆栈中的任何模块都可以将该值从某个事物(例如,“匿名”)映射到其它事物(例如“guest119”)。
提示输入用户名时使用的字符串。此字符串的默认值是“login:”的本地化版本。
终端名称:如果是设备文件,则前缀为/dev/;对于图形化的、基于X的应用程序,该项的值应该是$DISPLAY变量。
请求用户名:本地请求用户的本地名称或远程请求用户的远程用户名。
通常,应用程序或模块会尝试提供经过最强身份验证的值(在远程帐户之前是本地帐户)。该值的信任级别体现在与应用程序相关联的实际身份验证堆栈中,因此最终由系统管理员决定。
PAM_RUSER@PAM_RHOST应始终识别请求用户。在某些情况下,PAM_RUSER可能为NULL。在此种情况下,不清楚提出请求的实体是谁。
请求主机名(PAM_RUSER实体请求服务的机器的主机名)。这就是PAM_RUSER@PAM_RHOST确实标识了请求用户。在某些应用程序中,PAM_RHOST可能为NULL。在这种情况下,不清楚身份验证请求的来源。
身份验证令牌(通常是密码)。除了pam_sm_authenticate()和pam_sm_chauthtok()之外,所有模块函数都应该忽略此令牌。在前一个函数中,它用于将最新的身份验证令牌从一个堆叠的模块传递到另一个模块。在后一个函数中,令牌用于另一个目的。它包含当前活动的身份验证令牌。
旧的身份验证令牌。除pam_sm_chauthtok()外,所有模块函数都应忽略此令牌。
pam_conv结构。参见pam_conv。
以下附加项目是特定于Linux PAM的,不应在可移植应用程序中使用:
用于重定向集中管理的故障延迟的函数指针。参见pam_fail_delay。
X display的名称。对于图形化的、基于X的应用程序,该项的值应该是$DISPLAY变量。该值可以独立于PAM_TTY用于传递display的名称。
指向一个结构的指针,该结构包含连接到PAM_XDISPLAY指定的显示器所需的X身份验证数据(如果需要此类信息)。参见pam_xauth_data。
默认操作是模块在请求密码时使用以下提示:“New UNIX password:”和“Retype UNIX password:”。示例单词UNIX可以替换为此项,默认情况下为空。此项目由pam_get_authtok使用。
对于除PAM_CONV和PAM_FAIL_DELAY之外的所有item_type,item都是指向以
PAM_AUTHTOK和PAM_OLDAUTHTOK都将在返回应用程序之前重新设定种子。这意味着应用程序无法访问身份验证令牌。
函数声明:
#include int pam_set_item ( pamh , item_type , item );pam_handle_t * pamh ;int item_type ;const void * item ;
返回值:
实例:
实例1. 一般性代码
- /* 设置一些关于认证用户信息的参数 */
- pam_set_item(pamh, PAM_TTY, ttyn);
- pam_set_item(pamh, PAM_RHOST, remote_host);
实例2. SDDM中的代码
参见SDDM包源码目录src/helper/backend/PamHandle.cpp中的PamHandle::setItem函数。
- bool PamHandle::setItem(int item_type, const void* item) {
- m_result = pam_set_item(m_handle, item_type, item);
- if (m_result != PAM_SUCCESS) {
- qWarning() << "[PAM] setItem:" << pam_strerror(m_handle, m_result);
- }
- return m_result == PAM_SUCCESS;
- }
更多函数请看后续文章。