显示管理器如何登录用户?

显示管理器如何登录用户?

我即将开始开发自己的显示/登录管理器。我认为我将能够处理所有 X11 的内容,但我意识到当用户输入用户名和密码时我不知道该怎么做。

一旦显示管理器有了用户名和密码,它会做什么?它如何让您登录?登录管理器是否还有其他特定要求,例如获取任何配置文件,或者这一切都取决于桌面环境?

答案1

我想我在理解这个问题上已经取得了一些进展,所以我将在这里发布我所知道的。这个答案目前适用于那些使用聚丙烯酰胺。当我遇到其他登录方法时,我会添加更多内容。

在显示管理器的字段中输入用户名和密码后,显示管理器将采用这两个字段并启动 PAM 身份验证过程。

首先它调用pam_start().这告诉 PAM 您正在使用哪个会话函数(我们将了解它是什么)以及pam_handle_t要初始化哪个结构。您将此pam_handle_t结构传递到以下所有调用中。

然后您可以使用 设置任何属性,例如用户名pam_set_item()。您不必在此处设置用户名。当您致电 时pam_authenticate(),它会询问其尚不具备的任何信息。

接下来,您致电pam_authenticate()查看用户名和密码是否有效。此时,pam_authenticate()使用以下方法获取它没有的任何信息对话功能。您可以查看该链接以获取详细信息,但简而言之,PAM 将调用您在pam_start()调用后传递给的结构中提供的对话函数pam_authenticate()。然后它将向该对话函数传递一组消息。如果msg_stylePAM_PROMPT_ECHO_ON,则要求输入用户名,如果是msg_stylePAM_PROMPT_ECHO_OFF则要求输入密码。其他两个选项在规范中进行了描述,用于错误和信息性消息。根据消息类型,使用resp响应填充数组并返回正确的错误代码。

现在如果pam_authenticate()返回PAM_SUCCESS,则表示该用户存在。然后我们必须调用pam_acct_mgmt()来确保用户此时有登录权限(我不知道这个权限在哪里或如何设置)。

此时,我们使用 获取令牌pam_setcred(),然后使用 开启会话pam_open_session()。我不知道这样做的目的是什么,也不知道令牌是如何实际使用的,但这是必需的。如果您了解更多信息,请告诉我。

现在我们可以使用 来设置我们想要的所有 bash 变量pam_putenv()。当我们的环境拥有我们需要的一切时,我们可以分叉一个新进程,然后执行exec命令startx

此过程完成后,用户将注销。此时,我们调用pam_close_session(), pam_setcred(可以选择删除凭据),并pam_end()按此顺序。

如果其中任何内容不正确或者您需要添加更多信息,请告诉我。你可以看到我的显示管理器(仍在开发中)作为例子。

相关内容