资讯专栏INFORMATION COLUMN

yii2中session跨域名的问题

rollback / 2080人阅读

摘要:可是,我们的域名有这三个域名仅仅是不同的环境,因此,的跨域名访问就引出来了。无论是一二级域名,和不同域名下的跨域,无非要达到两点客户端访问同一个所有域名对应的服务器访问的的数据的位置必须一致。

关闭httponly引起的问题

场景1

测试A:咦,为什么test环境登录不了呢?

程序员:清缓存。

测试B:握草,dev也登录不了。。。谁看看!

程序员:清缓存。

测试们:。。。唉

场景2

程序员A:我靠,TNND,真的登录不了,怎么回事?

程序员B:可能还是要请缓存。

程序员A:没用。

程序员B:我看看吧。

一阵捣鼓后,呀,cookie中怎么会有两个sessionID呢?

这件事情的起因是这样的,前端工程师需要拿取后台管理员的cookie,用牛叉的控制台就可以看到:document.cookie,结果没有取到,再看看cookie管理器,显示是httponly为true,即开启了path=/;httponly,这个是yii2防止XSS攻击所设置的。

但是,前端工程师需要这个cookie信息,所以配置中开启了session的cookieParams参数。

"session" => [
    "class" => "yii
edisSession",
    "redis" => "redis3",
    "name" => "SID",
    "useCookies" => true,
    "cookieParams" => [
        "domain" => ".xxx.com",
        "httpOnly" => false,
    ],
],

这样就可以获取到cookie中保存的sessionID了,感觉没有任何问题。

可是,我们的域名有:admin-test.xxx.com,admin-dev.xxx.com,admin.xxx.com,这三个域名仅仅是不同的环境,因此,yii2的跨域名访问就引出来了。

那么上面问题如何解决呢?很简单,domain这个参数默认是当前的域名,如果只允许当前域名登录访问,使用默认即可。

"session" => [
    "class" => "yii
edisSession",
    "redis" => "redis3",
    "name" => "SID",
    "useCookies" => true,
    "cookieParams" => [
        "httpOnly" => false,
    ],
],

看到网上大致有很多这样的做法:

"user" => [
    "class" => "ackendextensionsAdmin",
    "identityClass" => "ackendmodelsAdmin",
    "enableAutoLogin" => false,
    "enableSession" => true,
    "loginUrl" => ["admin/login"],
    "identityCookie" => ["httpOnly" => false, "domain" => ".xxx.com"],
],

也就是把用户的cookie中的httphttponly关闭,并且指定具体的域名,最燃这样做了,但还是不能关闭客户端的cookie的httponly,依然获取不到cookie的值,建议这里的httponly一定为true。

附加:处理session跨域几种的方案

前面谈过session相关配置,在开发的时候,常需要跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn和a.9streets.cn之间,另一种是a.com b.com之间,这几天总结了一下处理方法。

无论是一二级域名,和不同域名下的跨域,无非要达到两点:

客户端访问同一个sessionId,所有域名对应的服务器访问的session的数据的位置必须一致。

1.访问共同的sessionId主要是通过把当前的sessionId写进cookie里面cookie在不同域名下是不能访问的,我们需要在访问在后台设置用户在登录的时候,把需要共用的登录信息的域名,如果是在1,2级域名下,直接把cookie设置为所属主域名,例如:

setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".a.com"); 

也许你会问:如果是在不同的域名呢?采用P3P技术简单解决,实现原理,在访问网站x.com的时候,y.com程序触发y.com文件的写入sessionid值,sessionid值便可以获取,然后把seesion值存入数据库,取相同的sessionid值便可。这就要求y.com里面的程序文件必需能跨域访问,默认情况下,浏览器是不能跨域设置cookie的,加上p3p头后才行。在对应php文件加上:header("P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"");

2.session数据存储位置一致的实现方法

session该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在,而非存储在服务器的内存中,在这里我们得修改为所有域下都能访问的方式。网上介绍了数据库存储,文件形式存储,内存存储, 如果用数据库存储session数据,网站的访问量很大的话,SESSION 的读写会频繁地对数据库进行操作,效率就会明显降低,可以考虑存在内存服务器来实现,下面的session.rar里面介绍的是数据库存session的实例。

yii2中如何实现呢?

main.php中应该这般配置(同一套环境不会出现前面所说的问题,但是不同环境还会出现):

"user" => [
    "class" => "ackendextensionsAdmin",
    "identityClass" => "ackendmodelsAdmin",
    "enableAutoLogin" => false,
    "enableSession" => true,
    "loginUrl" => ["admin/login"],
    "identityCookie" => ["name" => "_identity", "httpOnly" => true, "domain" => ".xxx.com"],
],
"session" => [
    "class" => "yii
edisSession",
    "redis" => "redis3",
    "name" => "SID",
    "useCookies" => true,
    "cookieParams" => [
        "httpOnly" => false,
        "domain" => ".xxx.com", "lifetime" => 0
    ],
],

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30550.html

相关文章

  • 关于Yii2如何实现SSO登录解析

    摘要:例如,淘宝登录的,登录成功的。所以思考如何实现这种跨域的登录就显得尤为重要了。需求分析进入登录页面的地址登录成功后跳转的地址下面我主要是以框架为例解说一下我是怎么实现这种跨越的登录的。 序言 近年来网络发展很快,参与网购的人越来越多,但是大家在网购的时候不知到有没有注意到无论是淘宝还是京东,他们用的都是二级域名,登录一个URL,登录成功后又是一个URL,作为一个开发者反正我是注意到了。...

    Anchorer 评论0 收藏0
  • 关于Yii2如何实现SSO登录解析

    摘要:例如,淘宝登录的,登录成功的。所以思考如何实现这种跨域的登录就显得尤为重要了。需求分析进入登录页面的地址登录成功后跳转的地址下面我主要是以框架为例解说一下我是怎么实现这种跨越的登录的。 序言 近年来网络发展很快,参与网购的人越来越多,但是大家在网购的时候不知到有没有注意到无论是淘宝还是京东,他们用的都是二级域名,登录一个URL,登录成功后又是一个URL,作为一个开发者反正我是注意到了。...

    DirtyMind 评论0 收藏0
  • web登录分析(简单登录与单点登录)

    摘要:系统从认证中心得到校验成功的结果后,则可以认为用户已登录。认证中心发现用户未登录没有,将用户引导至登录界面。用户提交登录信息到认证中心。 简单登录 登录流程 首先让我们分析一下一个简单的登录是怎么实现的。 一个简单的登录流程 用户输入url访问站点,接受用户请求后判断用户是否已经登录,若未登录则跳转到登录页面 用户访问登录页面,填写并提交登录表单 web应用对登录表单进行验证,若...

    jasperyang 评论0 收藏0
  • Yii支持多域名cors原理

    摘要:说明测试使用的接口域名,多域名为和。设置多域名尝试直接通过的模块追加值实现,如下接口请求和响应头如下当前域为,需跨域请求的资源。故通过该方法不能设置多域名进行。 首发于 樊浩柏科学院 平常我们遇到跨域问题时,常使用 cors(Cross-origin resource sharin)方式解决。不知你是否注意到,在设置响应头 Access-Control-Allow-Origin 域的...

    Darkgel 评论0 收藏0
  • 进一步优化Yii2SSO登录

    摘要:序言本文主要是对关于如何实现跨域的登录的解析的改进,因为在那篇文章中我已经写出了登录的基本实现过程,现在是进一步优化。实现永久登录状态。只要不点击退出登录,就一直保持着登录状态。存在时,提交表单判断修改的过期时间,设置到极大值。 序言 本文主要是对关于Yii2如何实现跨域的SSO登录的解析的改进,因为在那篇文章中我已经写出了SSO登录的基本实现过程,现在是进一步优化。主要优化的部分有两...

    罗志环 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<