单点登录问题

本文探讨了单点登录的实现,包括长连接和短连接应用。在长连接示例中,服务器能主动断开重复登录的客户端连接。短连接应用中,通过更新SessionID确保只有一个有效会话。流程梳理部分解释了如何管理和切换不同浏览器的登录状态。最后,提供了代码整合展示实际操作过程。
摘要由CSDN通过智能技术生成

本文实现的功能:为了只让⼀个设备登陆⽽设置的⼀种机制。

1. ⻓连接应⽤

  • ⽹络协议: TCP ⻓连接协议

  • 代表性案例: QQ、⽹络游戏、QQ⻜⻋、魔兽世界、传奇

  • 特点: 实时性⾼

  • 处理⽅式:

    • 服务器和客户端可以主动与对端通信
    • 服务器可以确定每⼀个客户端,当同⼀个账号进⾏第⼆次登陆的时候,服务器可以 主动断开与第⼀个客户端的连接
    • 代码示例:
    import socket
    
    all_connections = {
        # 'user_id': {'conn': 'xxx', 'addr': 'xxx'}
    }
    
    server_sock = socket.socket()
    server_sock.bind(('0.0.0.0', 12345))
    server_sock.listen(2048)
    
    while True:
        cli_sock, cli_addr = server_sock.accept()  # 接受客户端的连接
        uid = cli_sock.recv(1024)  # 接受客户端的数据
        if uid in all_connections:
            # 关闭旧连接(将旧的客户端踢下线)
            cli_sock, cli_addr = all_connections.pop(uid)
            cli_sock.close()
    
        # 将新的连接加入到全局连接容器中
        all_connections[uid] = {
            'conn': cli_sock,
            'addr': cli_addr
        }
    

2. 短连接应用

  • 网络协议:

  • ⽹络协议: HTTP / HTTPS / UDP

  • 代表性案例: 今⽇头条、淘宝、等各种⽹站或各种APP

  • 特点: 实时性不⾼,⽤户刷新时才能看到效果

  • 处理流程:

    • 登陆时:

      1.根据 user_id 从缓存⾥找到旧的 SessionID

      2.根据旧的 SessionID 找到之前的 Session 记录,并将其删除

      3.将最新的 SessionID 记录到缓存

普通登录代码:

# 此时只要服务端将对应 user 的登录状态进行保存即可
if check_password(user, pwd):
    session['user_id'] = user.id

然后我们来通过实验来验证一下,首先我们打开两个浏览器,分别对程序进行登录。

这里我分别用 safari 和 chrome 来进行登录,通过 network 面板截取到了下面两个 sessionid。

safari: 1efd2a8a-0f82-435d-ac8f-e038a7293205
chrome: 36506cf4-5b74-45e6-abc0-f9a2fc5f8549

然后我们来看下 redis 当中存的 session:

oMmPEVtSTyHsgFO

可以看到,两者的内容,完全一样。

这个时候我们如果将 redis 当中某一个的 sessionkey 给删除,此时对应的浏览器就会被踢下线。

3. 流程梳理

当一个 用户A 在一个浏览器登录进来之后,此时登录状态的 session_key 存储在了服务端的 redis 当中,而客户端的 session_key 存储在了 cookie 当中,两者的值相互一致。

当用户A 在另一个浏览器中打开网站,并进行登录,在正常的登录验证完成后,此时取出前端传递过来的 session_key。对此,我们首先将服务端对应 用户A 原来的 session_id 从 redis 里面删掉,然后按原有的方式进行登录状态的设置,最后将传递过来新的 session_key 放入缓存当中。

4.代码整合

# 简单的流程:
...
if check_password(user, pwd):
    kick_out(user.id)
    session['user_id'] = user.id
    checkin(user.id, session.sid)
...

对应的函数代码:

# CHECKIN_K = 'CHECKIN-%s' 
def checkin(uid, session_id):
    """缓存中记录某人的 session_id"""
    key = CHECKIN_K % uid
    rds.set(key, session_id, 3600)


def kick_out(uid):
    key = CHECKIN_K % uid
    session_id = rds.get(key, '')
    full_session_key = SESSION_KEY_PREFIX + session_id
    rds.delete(full_session_key)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 致远OA单点登录问题是指在企业内部使用致远OA系统时,需要通过一个登录账号和密码即可访问多个不同的子系统,而不需要重复登录。致远OA单点登录的实现可以提高工作效率,简化用户操作,提升系统安全性等。 首先,实现致远OA单点登录需要建立一个统一的认证中心,负责管理用户的登录信息和权限。用户在首次登录致远OA系统时,需要输入账号和密码,并通过认证中心进行验证。 认证中心会生成一个令牌(Token),并将其返回给用户。用户在访问其他子系统时,只需要通过持有的令牌即可完成登录。令牌一般具有一定的时效性,以保证系统安全性。 其次,子系统需要与认证中心建立信任关系,以实现令牌的识别和验证。每次用户访问子系统时,子系统会向认证中心发送令牌,认证中心进行验证后返回用户的认证信息。 如果用户在一段时间内没有操作,令牌可能会过期,需要用户重新进行认证登录。此时,用户再次登录到致远OA系统,认证中心会生成新的令牌并替换旧的令牌。 总的来说,致远OA单点登录通过集中管理用户认证信息和权限,实现了用户在多个子系统间的无缝切换。这不仅提高了工作效率,也提升了系统的安全性,简化了用户的操作流程。 ### 回答2: 致远OA是一种用于企业管理的办公自动化软件系统,具有多个模块和功能。而“单点登录问题”指的是用户只需要登录一次就可以访问多个相关系统或应用的需求。 致远OA的单点登录问题主要是指当用户需要访问致远OA系统的不同模块时,每次都需要重新登录的情况。这种情况下,用户体验较差,因为他们需要频繁地输入账号和密码,浪费了他们的时间和精力。 为了解决致远OA的单点登录问题,可以考虑以下方法: 1. 集成单点登录功能:通过与其他相关系统或应用集成单点登录功能,用户只需要登录一次就能够访问所有相关系统。这样可以提高用户体验,减少重复登录的麻烦。 2. 使用统一身份认证系统:引入统一身份认证系统,用户只需要在认证系统中登录一次,就可以无缝地访问致远OA系统和其他相关系统。这样就实现了单点登录的目标。 3. 使用统一账号管理系统:建立一个统一的账号管理系统,将用户的账号和权限集中管理。当用户登录致远OA系统时,可以通过该账号管理系统验证用户身份,从而实现单点登录。 4. 增强用户体验:除了解决单点登录问题,还要注意提高用户体验。比如,使用记住密码功能、提供快速登录等功能,使用户能够更方便快捷地登录系统。 总之,致远OA的单点登录问题可以通过集成单点登录功能、引入统一身份认证系统、建立统一账号管理系统等方法进行解决。这样可以提高用户体验,降低用户的登录负担。 ### 回答3: 致远OA单点登录是一种通过身份验证,实现用户在多个系统中无需重复登录,只需登录一次就可以访问其他系统的功能的功能。 首先,致远OA单点登录可以提高用户的使用效率,不需要记忆多个系统的用户名和密码,只需要登录一次就可以方便地使用其他系统的功能,减少了用户的重复操作和时间浪费。 其次,致远OA单点登录可以提高系统的安全性。通过单点登录,用户只需在一个系统中进行身份验证,并获得了一个安全令牌,可以在其他系统中使用这个令牌进行访问。这样可以减少用户密码泄露的风险,提高了系统的整体安全性。 此外,致远OA单点登录还可以简化系统的管理和维护。在没有单点登录的情况下,系统管理员需要维护多个独立的用户账户和密码,当出现用户账户变更或密码遗忘时需要进行大量的人工操作。而通过单点登录,管理员只需要维护一个用户账户就可以方便地管理和维护用户的访问权限。 最后,致远OA单点登录还可以提高用户体验和满意度。用户只需要登录一次,就可以方便地使用其他系统的功能,不需要反复输入用户名和密码,大大提高了用户的使用便利性和满意度。 总之,致远OA单点登录是一种方便、安全、高效的身份验证方式,可以提高用户的使用效率,加强系统的安全性,简化系统的管理和维护,同时提升用户的满意度和体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值