我托管了2个网站,这两个网站使用相同的数据库来填充数据。 例如:用户 - 表具有用户登录详细信息,两个网站用户都可以通过此表访问其登录信息。
现在我想这样做:
在访问这两个网站之前,他们需要登录。
我的"网站A"有链接调用"阅读更多"当用户点击它时,该用户应重定向到"网站 B"。现在我想跳过B网站的"登录"过程(因为该用户已登录 A(。怎么做,
我想到了这个选项,但安全性较低:
- 一个网站 阅读更多链接
B_website/?用户名=abc&password=123&page=12
我想这不是一个好的选择,我可以通过什么方法来保持高安全性?
不不不 - 不要在URL中以纯文本形式传递用户名+密码!
我建议您查看您如何知道用户在站点 A 上登录。您的数据库中是否有某种标志将此用户标记为已登录?站点 B 能否以某种方式意识到此标志?由于您的两个站点共享一个数据库,因此这绝对是可能的。
请考虑以下方案:
- 用户登录到站点 A。
- 生成一个唯一的"登录令牌",保存在您的数据库中,并发送到客户端。
- 用户到达站点 B。
- 用户将他们之前收到的"登录令牌"发送到服务器。
如果用户发送的登录令牌与数据库中的记录匹配,则可以跳过身份验证阶段并将该用户标记为已登录到站点 B。
服务器会话基本上是手工设计的,可以解决这个问题。如果您的网站已经访问了同一个数据库,则可以利用PHP内置功能,该功能可以创建一个session_handler,用于打开数据库连接并将会话存储在数据库表中。
我个人是Symfony的HttpFoundation的忠实粉丝(见下文(。但是,您可以在本机执行此操作,而无需依赖任何外部库。
首先创建一个表(这是一个MySQL表,但适应它应该很容易:
CREATE TABLE sessions (
sess_id VARBINARY(128) NOT NULL,
data BLOB NOT NULL,
sess_expires int(11) UNSIGNED NOT NULL
) COLLATE utf8_bin, Engine=InnoDB;
接下来,根据 PHP 文档创建一个会话处理程序session_set_save_handler()
。创建可调用的函数,并按如下方式分配每个函数:
打开
创建数据库连接。
关闭
关闭数据库连接。
读
从数据库中检索会话。
写
将会话存储在数据库中。
摧毁
销毁会话。
干净
根据您的系统设置清理旧会话数据。
下面是一些不同的实现。它们都应该起作用,因此您认为最有吸引力的任何一个都可以用作基础。确定样式后,只需在每个客户站点中复制代码,它就会拉取共享会话!
Chris Shiflett 的教程可能是最基本和最容易访问的,如果你不熟悉这种事情是如何工作的。
DevShed有一个面向对象的方法,可以在很大程度上复制和粘贴。他们还很好地解释了如何在其他地方使用会话。
HttpFoundation - 使用锁定和其他机制,几乎是起手即用。如果您遵循面向对象编程并且熟悉或对 Composer 感兴趣,那么设置起来绝对是轻而易举的。
如果您通过 PHP 内置会话存储登录,并且两个网站使用相同的session_save_path
,那么这很容易实现。只需将会话 ID 作为参数 SID 传递到 URL 中即可。然后,网站 B 应从网站 A 获取会话,并且随着用户群的共享,会话可以在其他网站上继续。
阅读更多链接应生成如下内容:
<a href="B_website/?page=12&SID=<?php echo session_id() ?>">Read more...</a>
如果您在 cookie 中手动存储某种会话 ID,则有不同的选择。登录时,您始终为两个网站的域设置 cookie。像这样,用户在两个网站上都自动登录,无论他在两个网站中的哪一个登录。
setcookie("SESSIONID", $session_id, time() + 86400, "/", $domain_A);
setcookie("SESSIONID", $session_id, time() + 86400, "/", $domain_B);
另一种方法是使网站 A 上的更多链接指向网站 A 上的特殊页面,然后设置要在网站 B 上登录的必要 cookie,然后重定向(通过 302 标头(到网站 B。该链接如下所示:
A_website/redirect_B.php?page=12
然后redirect_B.php会做这项工作:
setcookie("SESSIONID", $session_id, time() + 86400, "/", $domain_B);
header("Location: B_website/?page=12", true, 302);
将会话传递到其他服务器的最佳方法取决于您实现登录的方式。有了有关如何管理登录会话的更多详细信息,就可以给出更准确的答案。
最安全的方法是通过 SAML 使用单点登录。
您应该使用基于令牌的安全性,即当用户在网站 A 中输入他的凭据时,网站 A 返回访问令牌,然后使用此令牌您可以在两个网站上验证用户,即在每个请求中发送访问令牌。
这基本上就是社交网站登录的工作方式,它们还提供访问令牌,这称为身份验证协议。
当您单击"阅读更多"按钮时,您可以通过 AJAX 身份验证数据从网站"A"发送到网络"B":之后,您检查这些数据是否正确。如果是这样,请重定向到页面"B"(您可以通过ajax响应执行此操作(
$.ajax({
type: 'post',
url: 'b.php',
data: userauth,
error: function(errors) {
console.error(errors);
},
complete: function(data) {
if(data=="correct"){ /*redirect*/ }else{ /*nothing*/ }
}
});
我认为这将是一种选择...
问候!
我会建议的最佳方式:
1:每次用户登录时都会生成一个 seeion ID现在用户下面的表结构
uname | password | seesion id | user ip address |isloogenid
a pwd1 sessionidcreated user looged in ip
是所有参数在用户中都是相同的登录,否则没有
$seesionifdromdb
$ipfromdb
$userloggedinfromdb
$currentipwheresiteisopened
$valeofphpsessionif
if(($seesionifdromdb == $valeofphpsessionif) && ($ipfromdb == $currentipwheresiteisopened) && ($userloggedinfromdb==1)){
// here start session neede to make user logged in
}
根据您的情况,让我们有一个合乎逻辑的观点。网站:"网站A","网站B">
让有一般的登录流程 如果用户登录到"网站 A"或"网站 B",则将为该用户创建一个会话,其中包含一些会话 ID 和一些自定义会话变量,您将设置这些变量以保持用户在整个网站中登录
eg: $_SESSION['user_id'] = {some id from database};
$_SESSION['prefered_language_code']='eng';
$_SESSION['user_name'] = 'abc';
然后,您正在检查登录过程,直到这些变量在会话中可用
eg:function checkSession(){
if($_SESSION['user_id']!=''){
return true;}
else{return false;}
}
on the other pages of both website
if(checkSession()){
return true;
}else{
//send to login page of website A or Website B respectively;
}
类似于此函数,您正在使用此函数来检查用户对其余网页的访问权限。当他注销时,您必须销毁该会话变量。
所以现在你的问题的答案是:1(由于您正在管理两个网站,并且根据您的评论,即"现在我想跳过B网站的"登录"过程(因为该用户已经登录了A(",这意味着在这两种情况下,用户的登录凭据应该是相同的。现在的解决方案是达到预期的情况,您应该使用相同的会话变量(仅用于检查用户登录状态的变量(遵循相同的登录过程,并在两个网站(即"网站 A 和网站 B"(中进行登录签到。
然后它们似乎是两个不同的网站,但从逻辑上讲,它们作为一个单一的网站工作,因为它们共享登录会话变量。这意味着如果用户登录到一个站点,那么从逻辑上讲,他是通过传递另一个网站的登录过程。
2(您可以在数据库中设置一些登录跟踪字段类型,以跟踪用户登录
eg:loggin_token; comment some uniquely generated key or login_key
并使用一些会话变量设置这些
现在,您可以检查会话变量的会话,以在两个站点上保持登录检查
希望这会有所帮助,因为这是管理这些的最简单方法
忽略发送密码的任何建议。
Lix使用一次性令牌的答案是一种有效的方法。如果您不想打扰实现,您可能会对现有的单一登录实现感兴趣。
为此,您必须使用 SAML 或 Open ID 等技术。
https://github.com/onelogin/php-saml
https://github.com/openid/php-openid