Thinkphp5 php会员实现单点登录

最近在赶一个项目时用到了单点登录功能,一开始在百度和官网中搜了搜,得到的结果不是不我想要的,毕竟是一个小东西搞的太复杂了。所以自己想出了一个简单实现功能

要求是会员在不同的登录端登录时,退出其它已登录端。开发框架是用的Thinkphp5.1,先前想是直接用缓存实现,后面发现可以用Session和Cache一起更简单实现。

利用的是用户每次登录帐号时,先读取缓存记录单点登录的值并加1,并把此值同时记录到此登录用户信息的Session,在用户公公共类中判断,Session存的值与缓存中的值是否一致,如果不一致则为其它用户登录。则把此用户退出处理,
例如:


用户在谷歌浏览器第一次登录时:用户:ID=1、那么:SinglePoint_1 =1、Session=1,
如果为空那么赋值他为1,


用户在火狐浏览器第二次登录时:用户:ID=1、那么:SinglePoint_1 =2、Session=2,
则谷歌浏览器此时刷新是得到的值 SinglePoint_1=2、Session=1,所以被退出了

login.php (登录页)**********************************************

//以下代码只做实例功能演示,省略其它……

//获取登录状态
$_USER = Session::get('user');
//判断是否已登录,如果已是登录状态,则跳转到会员中心主页
if ($_USER['id']) {
     return $this->redirect(url('home'));
}       
//判断POST请求
if ($this->request->isPost()) {
	$user=Db::name('user')->where(['username' => $post['username']])->find();

	//缓存单点登录值
	Cache::inc('SinglePoint_'.$user['id']);
	$user['single_point']=Cache::get('SinglePoint_'.$res['id']);
	
	//设置用户信息缓存
	Session::set('user', $user);
	
	//以下进行登录成功所跳转,等操作略过//
}else{
	return $this->fetch();
}

	
common.php(这是一个公共类页面,会员登录成功后,会员页面的其它功能都继承着这个公共类)

//以下代码只做实例功能演示,省略其它……
//这里用到了控制器初始化,这是thinkphp主自定义的,其实和php中构造方法 __construct()其实是一样的, 

protected static $_UID = null;
public function initialize() {
	//获取登录状态
    $_USER = Session::get('user');
    //判断是否已登录,否则跳到登录页
    if ($_USER['id']) {
         $single_point=Cache::get('SinglePoint_'.$_USER['id']);
         if(empty($single_point) || $_USER['single_point']!=$single_point){
              return $this->logout();
         }
         self::$_UID = $_USER['id'];  //用户ID
    }else{
		return $this->redirect(url('login'));
	}
}

/**
     * Notes: 退出登录
     */
 public function logout()  {
      if(self::$_UID){
          Cache::rm('SinglePoint_'.self::$_UID);
      }
      Session::delete('user');
      $this->redirect(url('login'));
}
ThinkPHP 3.2 中单点登录(Single Sign-On,简称 SSO)通常涉及以下几个步骤: 1. 用户首次登录:用户访问应用A并输入用户名和密码,系统检查是否成功登录,并生成一个session标识存储在服务器上。 2. 第一次授权:应用A将用户的session信息保存到服务器的一个共享存储(如Redis、数据库等),同时设置过期时间。 3. 二次请求:当用户在未登出的情况下需要进入应用B时,应用B会检查当前session是否存在,并验证该session是否有效。 4. session验证:应用B向应用A发送请求,请求包含用户session的信息。应用A验证后返回确认结果,如果验证通过,应用B允许用户继续访问,否则跳转回登录页面。 5. 登出机制:在任何一个应用中登出都会清除所有关联的应用的session,保证单点登录的安全性。 这里是一个简单的示例代码片段(假设使用了Redis作为共享存储): ```php // 应用A的登录处理 if (isset($_SESSION['user_id'])) { // ...验证用户登录... $redis = new Redis(); $redis->set('sso:'.$_SESSION['user_id'], $_SESSION['user_info'], 60*60); // 设置session到Redis } // 应用B的验证处理 if (isset($_GET['token'])) { $redis = new Redis(); $user_info = $redis->get('sso:'.$_GET['token']); if ($user_info) { $_SESSION['user_info'] = $user_info; // 用户已登录,继续应用B的功能 } else { // token无效或已过期,提示用户重新登录 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值