|imaps?
):
//.*"/>
//客户端需要使用的对象的属性名称
user_name
user_email
user_mobile
此步骤灰常重要,可以看看 org.jasig.cas.services.RegexRegisteredService的源码,其中的 allowedAttributes是关键
【提示】网上说 ignoreAttributes属性控制,查看了CAS3.5.2版本的 AbstractRegisteredService 源码后,发现其默认值就是false,即:
添加属性后,客户端就可见了
四、修改WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp
在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展,如下,红色为新添加部分
serviceResponsexmlns:
cas='http:
//www.yale.edu/tp/cas'>
authenticationSuccess>
user>${fn:
escapeXml(assertion.chainedAuthentications[fn:
length(assertion.chainedAuthentications)-1].principal.id)}
user>
iftest="${fn:
length(assertion.chainedAuthentications[fn:
length(assertion.chainedAuthentications)-1].principal.attributes)>0}">
attributes>
forEachvar="attr"items="${assertion.chainedAuthentications[fn:
length(assertion.chainedAuthentications)-1].principal.attributes}">
${fn:
escapeXml(attr.key)}>${fn:
escapeXml(attr.value)}
${fn:
escapeXml(attr.key)}>
forEach>
attributes>
if>
iftest="${notemptypgtIou}">
proxyGrantingTicket>${pgtIou}
proxyGrantingTicket>
if>
iftest="${fn:
length(assertion.chainedAuthentications)>1}">
proxies>
forEachvar="proxy"items="${assertion.chainedAuthentications}"varStatus="loopStatus"begin="0"end="${fn:
length(assertion.chainedAuthentications)-2}"step="1">
proxy>${fn:
escapeXml(proxy.principal.id)}
proxy>
forEach>
proxies>
if>
authenticationSuccess>
serviceResponse>
通过完成上面四个步骤的配置后,server端的工作就完成了,那么如何在客户端获取这些信息呢?
下面进行说明
客户端获取用户信息
java客户端获取用户信息:
直接根据key值获取:
AssertionHolder.getAssertion().getPrincipal().getAttributes().get("user_name");
获取全部返回信息后通过map获取
AttributePrincipalprincipal=(AttributePrincipal)request.getUserPrincipal();
Mapattributes=principal.getAttributes();
Stringuser_username=attributes.get("user_name");
Stringuser_mobile=attributes.get("user_mobile");
Stringuser_email=attributes.get("user_email");
注意事项
如果都配置成功后遇到客户端访问报如下错误:
出现这种问题的原因是由于返回用户的信息中有中文值,由于cas中默认返回用户信息的时候的编码是ISO-8859-1,而我们的客户端可能是UTF-8或者是GBK的,在解析的时候由于乱码解析报错,所以要解决这种问题就必须要服务端和客户端统一编码,解决方式如下:
首先在CAS的服务端找到如果页面,其实就是上面我们加上代码的jsp文件
/sso-server/WebRoot/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp
找到这个文件修改这个文件的编码,我这里统一UTF-8的编码。
服务端修改完毕。
然后在CAS客户端修改,找到Cas20ProxyReceivingTicketValidationFilter过滤器源码,路径为:
/org/jasig/cas/client/validation/Cas20ProxyReceivingTicketValidationFilter.java文件
找到getTicketValidator方法
在这个方法中进行设置编码
默认为null,现在我们统一设置为utf-8的编码,如下
在进行重启服务进行访问就可以获取更多的用户信息了包括中文值的也可以获取得到了。
到这里整个配置完成。
第二种方式:
编写实现类
通过实现CredentialsToPrincipalResolver类来实现客户端获取更多用户信息
自己写一个java类/sso-server/src/org/jasig/cas/authentication/principal/MyCredentialsToPrincipalResolver.java实现方式如下代码:
@Override
publicPrincipalresolvePrincipal(Credentialscredentials){
//TODOAuto-generatedmethodstub
finalUsernamePasswordCredentialsusernamePasswordCredentials=(UsernamePasswordCredentials)credentials;
Stringusername=usernamePasswordCredentials.getUsername();
Connectionconn=null;
PreparedStatementstmt=null;
ResultSetrs=null;
StringloginStr="";
try{
conn=InitCacheConfig.getConnection();
stmt=conn.prepareStatement("SELECT*FROMLEAD_SYSTEM_USERWHERELOGIN_NAME=?
");
stmt.setString(1,username);
rs=stmt.executeQuery();
if(rs!
=null){
if(rs.next()){
Loginlogin=newLogin();
login.setResourceId(rs.getString("RESOURCEID"));
login.setLoginName(rs.getString("LOGIN_NAME"));
login.setUserName(rs.getString("USER_NAME"));
login.setUserEmail(rs.getString("USER_EMAIL"));
//如果需要返回更多字段在这里添加
loginStr=JSON.toJSONString(login);
}
}
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(SQLExceptione){
e.printStackTrace();
}finally{
InitCacheConfig.closeAllConn(rs,stmt,conn);
}
returnnewSimplePrincipal(loginStr,null);
}
@Override
publicbooleansupports(Credentialscredentials){
returncredentials!
=null&&UsernamePasswordCredentials.class.isAssignableFrom(credentials.getClass());
}
当前类主要是直接通过jdbc方式通过username像数据库查询所有数据信息通过json方式返回出来。
配置
再到deployerConfigContext.xml中做如下配置:
找到
注释如下配置
添加如下配置
最后变成
客户端获取
StringuserJson=AssertionHolder.getAssertion().getPrincipal().getName();
返回的是一串json字符串,里面存有所有的用户信息,整个配置完毕。