Logon System Design

本文介绍了一种将用户资料与认证分离的设计方案,通过这种方式,系统可以轻松地集成多种认证方式,如本地密码认证、微博登录、QQ登录等,同时保证了系统的灵活性和安全性。

设计一个可扩展的用户登录系统 (1)

廖雪峰 / 编程 / 2015-7-22 10:22 / Reads: 43843

在Web系统中,用户登录是最基本的功能。要实现用户名+密码登录,很多同学的第一想法就是直接创建一个Users表,包含usernamepassword两列,这样,就可以实现登录了:

 id | username | password | name等其他字段
----+----------+----------+----------------
 A1 | bob      | a1b23f2c | ...
 A2 | adam     | c0932f32 | ...

现在问题来了,如果要让用户通过第三方登录,比如微博登录或QQ登录,怎么集成进来呢?

以微博登录为例,由于微博使用OAuth2协议登录,所以,一个登录用户会包含他的微博身份的ID,一个Access Token用于代表该用户访问微博的API和一个过期时间。

要集成微博登录,很多童鞋立刻想到把Users表扩展几列,记录下微博的信息:

 id | username | password | weibo_id | weibo_access_token | weibo_expires | name等其他字段
----+----------+----------+----------+--------------------+---------------+----------------
 A1 | bob      | a1b23f2c | W-012345 | xxxxxxxxxx         | 604800        | ...
 A2 | adam     | c0932f32 | W-234567 | xxxxxxxxxx         | 604800        | ...

加一个QQ登录Users表就又需要加3列,如果这么扩展下去,改表都得累死,不要说维护代码了。

那怎么才能设计出灵活的登录呢?

不妨换个角度考虑用户登录。当用户以任意一种方式登录成功后,我们读取到的总是Users表对应的一行记录,它实际上是用户的个人资料(Profile),而登录过程只是为了认证用户(Authenticate),无论是本地用密码验证,还是委托第三方登录,这个过程本质上都是认证。

所以,如果把Profile和Authenticate分开,就十分容易理解了。Users表本身只存储用户的Profile:

 id | name | birth等其他字段
----+------+-----------------
 A1 | Bob  |  ...
 A2 | Adam | ...

而通过用户名口令登录可视为一种Authenticate的方式,利用LocalAuth表维护:

 id | user_id | username | password
----+---------+----------+-----------
 01 | A1      | bob      | a1b23f2c
 02 | A2      | adam     | c0932f32

通过微博登录可视为另一种Authenticate方式,利用OAuth表维护:

 id | user_id | weibo_id | weibo_access_token | weibo_expires
----+---------+----------+--------------------+---------------
 11 | A1      | W-012345 | xxxxxxxxxx         | 604800
 12 | A2      | W-234567 | xxxxxxxxxx         | 604800

如果要添加另一种OAuth登录,比如QQ登录,增加一个表就可以了。不过既然大家都是OAuth家族的,不如统一到一个表,给每家起个名字区分就好了:

 id | user_id | oauth_name | oauth_id | oauth_access_token | oauth_expires
----+---------+------------+----------+--------------------+---------------
 11 | A1      | weibo      | W-012345 | xxxxxxxxxx         | 604800
 12 | A2      | weibo      | W-234567 | xxxxxxxxxx         | 604800
 13 | A1      | qq         | Q-090807 | xxx-xxx-xxx        | 86400
 14 | A2      | qq         | Q-807060 | xxx-xxx-xxx        | 86400

如果要增加一种新的登录方式,比如SAML,那就再加一种类型的表。

有些网站需要API访问,API可以使用api_key和api_secret来认证,可是怎么把一个API访问关联到一个用户?方法还是增加一种API Auth的表:

 id | user_id | api_key  | api_secret
----+---------+----------+------------
 11 | A1      | a-012345 | xxxxxxxxxx
 12 | A2      | a-234567 | xxxxxxxxxx

每一种X-Auth表都存储了用户的登录认证信息,并通过user_id关联到Users表。这样一来,不但登录过程简化了,而且一个用户可以使用多种方式登录。只要登录成功,拿到了user_id,最后读取Users表是为了获得用户的Profile,这样读出来的数据也更安全,因为Users表不包含用户口令,不会因为暴露API而不小心把口令给泄露出去。

### SAP Logon 使用指南与问题解决 SAP Logon 是 SAP 提供的一个客户端工具,用于连接和访问 SAP 系统。它支持多种连接方式,包括经典 GUI 模式、Web 模式以及通过 SNC(Secure Network Communication)的安全连接。以下是 SAP Logon 的使用指南与常见问题的解决方法。 #### 使用指南 1. **安装与配置** 安装 SAP GUI 后,SAP Logon 会自动安装。启动 SAP Logon 后,用户可以通过“新建”按钮添加新的连接配置。在连接设置中,需要输入系统名称、客户端编号、语言、用户名称等信息。对于需要安全连接的场景,可以启用 SNC 并指定 SNC 名称与安全库路径 [^3]。 2. **Logon Group 配置** 在多服务器环境中,Logon Group 可用于负载均衡和高可用性。通过事务码 SMLG,可以创建和管理 Logon Group,并将多个应用服务器加入到组中,同时设置每个服务器的优先级。这样,用户在登录时可以自动连接到最优的应用服务器 [^2]。 3. **使用 Logon Ticket 实现 SSO** 对于需要跨系统访问的场景,SAP 支持通过 Logon Ticket 实现单点登录(SSO)。用户首次登录时,系统会生成一个带有数字签名的 Logon Ticket,并存储在浏览器中。当用户访问其他受信任的 SAP 系统时,该 Ticket 会被自动验证,从而实现无需重复输入用户名和密码的无缝登录体验 [^1]。 4. **脚本自动化登录** 对于需要频繁登录特定系统的用户,可以通过批处理脚本实现快速登录。例如,使用 `sapshcut.exe` 命令行工具并传入用户名、密码、系统参数等,即可快速启动 SAP GUI 并自动登录到目标系统 [^5]。 #### 常见问题与解决方法 1. **SAP Logon 无法正常启动** 如果 SAP Logon 启动失败,可能是由于注册表项 `CoreLandscapeFileOnServer` 指向的配置文件路径错误。可以通过修改注册表,将该值更改为正确的 `SAPUILandscape.xml` 文件路径,然后重新启动 SAP Logon [^4]。 2. **连接失败或系统无法识别** 确保输入的系统名称、客户端编号和语言设置正确。同时,检查网络连接是否正常,并确认目标 SAP 系统正在运行。如果使用了 SNC,还需要验证 SNC 名称格式是否正确,以及安全库路径是否配置正确 [^3]。 3. **Logon Ticket 验证失败** 如果 SSO 无法正常工作,可能是由于 Logon Ticket 的签名验证失败。需要检查生成 Ticket 的系统是否为受信任的源,并确保所有系统之间的时间同步和信任关系配置正确 [^1]。 4. **自动化脚本执行失败** 如果使用 `sapshcut.exe` 进行自动化登录失败,可能是由于路径错误或参数格式不正确。确保 `sapshcut.exe` 的完整路径正确无误,并且所有参数(如用户名、密码、系统编号)均以正确的格式传递 [^5]。 ```batch "D:\SAP GUI\SAPGUI\sapshcut.exe" -user=YOUR_USER -pw=YOUR_PASSWORD -language=en -SYSTEM=DEV -CLIENT=110 -sysname=YOUR_SYSNAME -maxgui ``` #### 相关问题 1. 如何在 SAP Logon 中配置 SNC 以实现安全连接? 2. SAP Logon Group 的作用是什么?如何通过 SMLG 进行配置? 3. 如何通过批处理脚本实现 SAP Logon 的自动化登录? 4. SAP Logon 启动失败时应如何排查和修复? 5. 在实现 SSO with Logon Ticket 时,如何确保跨系统的信任关系正确建立?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值