cas 登录各种虐

原理:

http://steven-wiki.readthedocs.org/en/latest/security/sso/

麻烦一:

出现一个比较奇葩的逻辑。是有一套系统已经成形了。cas 登录是后补充的.

需要由原页面登录页面进行提交。

麻烦二:

cas是其它合作公司处理,竞争公司,你懂的。。

 

解决方式:

1.直接post 提交

1.1 各种逻辑处理问题相对麻烦,特别是对于已经成形的

1.2页面各种跳转不好看

2.ajax 进行提交(前提目标公司要合作。。。。要合作。。。)

2.1目标服务器需要有权限,设置头

参考:http://haibin.info/?p=532

2.2需要考虑兼容问题(ie8+,chrome 这些ok,ie7以下的请无视看3)

参考:http://haibin.info/?p=973

2.3页面不用跳转,可在原逻辑的支持下实现,修改少。

3.隐藏post 表单 js 提交到 隐藏的iframe (通过target 指定对应的提交地址)

3.1 修改相对较少,没有兼容性问题。因为post提交,只要是浏览器都支持.

3.2不过本身就是通过跳来跳去实现的,只是包装到iframe中,再通过外部函数调用。如果原页面逻辑复杂,推荐这种处理方式

4.jsonp登录,类似ajax(前提目标公司要合作。。。。要合作。。。)

4.1参考http://www.cnblogs.com/jifeng/p/3511219.html(页面图大。。。谨慎 ~.~ )

http://www.cnblogs.com/jifeng/p/3511219.html

5. cas/service 手动写入cookie.(需要有服务器的操作权限或配置)

5.1 最简单的实现方式,影响最小,通过模拟登录获取最终CASTCG ,通过客户端GET 直接设置到cookie

6. 模拟登录,登录成功之后 iframe 进行隐藏post提交,即是登录两次。相对修改较少

7.这边的最终解决方案,搞一个同域名下的服务器.让目标公司配合cookie 设置成顶级域名下

setcookie ( 'name', 'value' ,null,'/','.xxxxxx.com');

 

注意事项:

登录检查

1.http://casservice/cas/login?servce=跳转的目标地址

1.1访问以上地址,会返回对应的ticket ,ticket 只能抓取一次数据

1.2 这种跳转是直接控制top.location ,无法进行iframe 检查

2.http://casservice/cas/remoteLogin?service=跳转的目标地址&loginUrl=跳转的目标地址

2.1登录地址也可以用来进行登录检查判断

2.2只跳转当前location ,可以当前iframe进行跳转

ticket获取用户信息

1 ticket 只能抓取一次数据

2 http://caservice/cas/serviceValidate?service=获取ticket的地址&ticket=返回的ticket

3.补充xml转array代码

		// 过滤标签头
		$result = preg_replace ( '/<cas:/i', '<', $xml );
		// 过滤结束标签头
		$result = preg_replace ( '/</cas:/i', '</', $result );
		$res = @simplexml_load_string ( $result, NULL, LIBXML_NOCDATA );
		if (! $res) {
			return false;
		}
		$res = json_decode ( json_encode ( $res ), true );
		if (isset ( $res ['authenticationSuccess'] )) {
			/**
			 * Array
			 * (
			 * _[authenticationSuccess] => Array
			 * _(
			 * __[user] => xxxxx
			 * __[attributes] => Array
			 * __(
			 * ____[login_flag] => xxx
			 * ____[employeeId] => xxx
			 * ____[asHelp] => xxxx
			 * __)
			 * _)
			 * )
			 */
			//$res ['authenticationSuccess'];
			return true;
		}

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注