上一篇记录了关于cas-server的服务端安装
服务端搭建完毕后,开始使用客户端请求了。客户端的下载地址: http://developer.jasig.org/cas-clients/
那么客户端的使用例子,在下载包里面,我们可以得到example例子,但是全部是英文可能会看起来不太舒服。
由于cas-server默认采取的是https协议,所以cas-client逻辑里也有一些地方默认用https协议,如果你不是https协议,请打开client.php搜索https,把这个地址替换成自动检测地址类型,即自动识别https或者http。或者你直接写死为http.
简单的例子如下:
session_start();
include_once './CAS-1.3.4/CAS.php';
phpCAS::client(CAS_VERSION_3_0,"cas.jiankongbao.com",8080,"/cas");
phpCAS::setNoCasServerValidation(); //去除https的验证
phpCAS::handleLogoutRequests(); //保持与其他语言同步登录或者同步登出
if(phpCAS::checkAuthentication()) {
//获取登陆的用户名
$username = phpCAS::getUser();
$data1 = phpCAS::getAttribute('email'); //获取emial(前提需要cas-server配置)
$data2 = phpCAS::getAttributes(); //获取所有属性(前提需要cas-server配置)
echo '用户名:'.$username.'
';
echo 'email:'.$data1.'
';
echo '数组集合:';
var_dump($data2);
echo "我要退出";
//退出地址不一定写服务端地址
}else{
echo '还没登录,请登录';
//登录地址不一定写服务端地址
}
以上这是一个很简单的判断用户是否已经单点登录过了,以及获取用户信息。
那么基于我这次的任务,它是两套系统,且各自有自己独立的业务和库。所以基于cas作为中间服务,我需要做一个类似拦截器的封装,每次进入系统优先请求中cas-server,拿到用户信息后,判断该用户在自己的库中是否存在,存在则请求api接口进行自动登录,不存在则创建该用户并请求api接口完成自动登录。
而以上这个例子,就是客户端实现单点登录的逻辑
cas-server配置,返回用户的更多信息
上面有获取信息的getAttribute以及getAttributes方法,前提必须是server端已经配置,配置如下
cas4.0 没有了 UsernamePasswordCredentialsToPrincipalResolver,而是提供了 org.jasig.cas.authentication.principal.PersonDirectoryPrincipalResolver,需要配置 attributeRepository 属性
//将原来的ref="AttributeRepository"改为带上sso
再添加一个id为ssoAttributeRepository
然后将 RegexRegisteredService 的配置改为
username
password
phone
sex
最后,修改 WEB-INFiewjspprotocol.0casServiceValidationSuccess.jsp,加入(3.0中也要加入)
${fn:escapeXml(attr.value)}
配置是有点复杂,我也是费了很大劲,才配置出来的,这个配置的基于4.0的服务端版本,配置完后的xml文件,有需要请点击下载