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;
		}

 

ajax 跨域cookie问题 (CORS support in a browser)

介绍

http://software.dzhuvinov.com/cors-filter-tips.html

封装好的js

https://github.com/dkastner/jquery.iecors

请求头部分的设置参考

HTML5 跨域提交和上传实现 及 nginx $_SERVER[‘HTTP_X_FILENAME’]解决

请求头时不可以直接设置:

Access-Control-Allow-Headers: *

不然会冲突下面配置

$.ajax({
	url : 'http://xxxxxx',
	xhrFields : {
		withCredentials : true
	},
	crossDomain : true,
	success : function(result) {
		alert('ajax调用成功' + result)
	}
});

withCredentials 开启时,跨与登录的cookie才会记录到域名中.

如a 域名调用 b域名。b域名中才会记录对应的cookie,否则即使在chrome中看到成功返回cookie,直接访问b时,会不存在。

且withCredentials 只支持html5特性的浏览器 ie8需要参考上面的处理

 

 

 

修复Yii ar 在win环境下 oci_pconnect 访问慢问题

同样的代码,在linux 环境下的 apache访问速度就正常,一样是链接外部数据库。

在开发环境中win(php5.2)链接测试机linux数据库访问里,速度会慢。还是用oci_pconnect的情况下.

折腾过php的不同版本 5.4 ts nts 这些版本。速度依旧烂。

测试机内部apache访问时,速度不慢。觉得是出在win上。

这块无解。尝试分析各sql访问上的速度问题.

log 补充 trace 打印出sql访问日志,单条进行数据分析

				'log' => array (
						'class' => 'CLogRouter',
						'routes' => array (
								array (
										'class' => 'CFileLogRoute',
										'levels' => 'trace, error, warning'
								)
						) 
				),

 

发现ar 在获取结构时,一次要花费约1s左右。

其它访问速度正常。

ar开启缓存。第一次访问时较慢,后续访问均明显变快,和原来mysql环境下差不多。

'db' => array (
              'class'=>'ext.oci8Pdo.OciDbConnection',
				'connectionString' => 'oci:dbname=//xxx/xx;charset=UTF8;',
				// 开启表结构缓存(schema caching)提高性能
				'schemaCachingDuration'=>3600,
		),

 

php array cover to xml

参考

http://stackoverflow.com/questions/1397036/how-to-convert-array-to-simplexml

<?php
class FileTools {
	/**
	 * 内部函数
	 *
	 * @param array $arr        	
	 * @param SimpleXMLElement $xml        	
	 * @return SimpleXMLElement
	 */
	static function _array_to_xml(array $arr, SimpleXMLElement $xml) {
		foreach ( $arr as $k => $v ) {
			$attrArr = array ();
			$kArray = explode ( ' ', $k );
			$tag = array_shift ( $kArray );

			if (count ( $kArray ) > 0) {
				foreach ( $kArray as $attrValue ) {
					$attrArr [] = explode ( '=', $attrValue );
				}
			}

			if (is_array ( $v )) {
				if (is_numeric ( $k )) {
					self::_array_to_xml ( $v, $xml );
				} else {
					$child = $xml->addChild ( $tag );
					if (isset ( $attrArr )) {
						foreach ( $attrArr as $attrArrV ) {
							$child->addAttribute ( $attrArrV [0], $attrArrV [1] );
						}
					}
					self::_array_to_xml ( $v, $child );
				}
			} else {
				$child = $xml->addChild ( $tag, $v );
				if (isset ( $attrArr )) {
					foreach ( $attrArr as $attrArrV ) {
						$child->addAttribute ( $attrArrV [0], $attrArrV [1] );
					}
				}
			}
		}
		return $xml;
	}
	/**
	 *
	 * @param array $array
	 *        	需要转化的数组
	 * @param string $root
	 *        	根标签
	 * @param boolean $formatoutput
	 *        	是否需要格式化输出
	 * @param boolean $preserveWhiteSpace
	 *        	是否过滤标签之间的空白
	 * @throws Exception
	 * @return mixed Ambigous mixed>
	 */
	static function array_to_xml($array = array(), $root, $formatoutput = false, $preserveWhiteSpace = false) {
		if (empty ( $root )) {
			throw new Exception ( '根标签不能为空' );
		}
		if (! preg_match ( '/^<w+/?>$/', $root )) {
			throw new Exception ( '标签格式异常' );
		}
		$xml = self::_array_to_xml ( $array, new SimpleXMLElement ( $root ) )->asXML ();
		if ($formatoutput || $preserveWhiteSpace) {
			if (! class_exists ( "DOMDocument" ))
				return $xml;
			$dom = new DOMDocument ();
			$dom->preserveWhiteSpace = $preserveWhiteSpace;
			$dom->loadXML ( $xml );
			$dom->formatOutput = $formatoutput;
			$xml = $dom->saveXml ();
		}
		return $xml;
	}
}

 

dompdf html cover to pdf

http://www.digitaljunkies.ca/dompdf/

常见问题:

1.页面和生成后的pdf各种不对应

需要通过table进行布局。原文件示例代码也是以表格布局为主,否则会引发各种变形。

如果涉及布局太复杂的页面,需要慢慢调试。如果有别的解决方案,请分享

尺寸不是以像素为参考,如pdf 840的页面尺寸,会实际铺满一个1300+的屏幕。所以需要进行特殊设置,不要在页面中尝试精确定位。

 

2.页面尺寸大小

配置文件中有个page_size参数

something like ‘letter’, ‘A4’, ‘legal’, etc. Thee default is ‘letter’,还有其它各种尺寸可以设置,直接源码搜letter即可看到配置文件.

3.页面如果为一个表格,当夹在中间页面时,要报frames的溢出异常。需要将表格调整到当前页。或者直接压到下一页

4.特殊字符无法正常显示,原因不明。google.code上有提供demo实例中有。但是官网本身demo已隐藏相关特殊字符实例。如 欧元符号 €.这边有个项目比较特殊,通过替换成图片进行解决。