原理:
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; }