CAS客户端获取更多用户信息.docx
- 文档编号:7002423
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:10
- 大小:252.05KB
CAS客户端获取更多用户信息.docx
《CAS客户端获取更多用户信息.docx》由会员分享,可在线阅读,更多相关《CAS客户端获取更多用户信息.docx(10页珍藏版)》请在冰豆网上搜索。
CAS客户端获取更多用户信息
CAS客户端获取更多用户信息
总述
首先,我是用的CASServer版本是3.5.2,Servlet容器是Tomcat
程序中也可能遇到客户端需要得到更多的用户信息,如姓名,手机号,email等更多用户信息的情况。
cas各种版本配置方式也不尽相同,这里讲的是3.5.2版本。
此文章中的CAS基础环境如下:
CAS服务端:
cas-server-3.5.2
CAS客户端:
cas-client-3.2.1
第一种方式
服务器端配置
一、首先需要配置属性attributeRepository
首先,你需要到WEB-INF目录找到
deployerConfigContext.xml文件,同时配置attributeRepository如下:
//这里的key需写username,value对应数据库用户名字段
//在这里key代表返回数据库对应的字段名
//value对应的是客户端获取值的时候的key值
//有的资料说返回的名称字段不能有下划线,这里特意测试了一下发现有下划线也是可以正常能拿到值的,所以如果客户端获取不到值不用担心这里的问题,可能是其它的地方导致的问题。
其中:
queryAttributeMapping是组装sql用的查询条件属性,上述配置后,结合封装成查询sql就是 select*fromlead_system_userwherelogin_name=#username#
resultAttributeMapping是sql执行完毕后返回的结构属性, key对应数据库字段,value对应客户端获取参数。
二、配置用户认证凭据转化的解析器
也是在deployerConfigContext.xml中,找到credentialsToPrincipalResolvers,为UsernamePasswordCredentialsToPrincipalResolver注入attributeRepository,那么attributeRepository就会被触发并通过此类进行解析,红色为新添部分。
三、修改属性registeredServices
修改 deployerConfigContext.xml中的 org.jasig.cas.services.InMemoryServiceRegistryDaoImpl的属性 registeredServices
修改 registeredServices 列表中的每个协议中的allowedAttributes属性的值。
列出的每个值,在客户端就可以访问了
|imaps? ): //.*"/> 此步骤灰常重要,可以看看 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字符串,里面存有所有的用户信息,整个配置完毕。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CAS 客户端 获取 更多 用户信息
![提示](https://static.bdocx.com/images/bang_tan.gif)