- 浏览: 908851 次
- 性别:
- 来自: 湖北—》上海
最新评论
-
miketwais:
janyee2012 写道楼主在不,请问下面这句配置在disc ...
cas实现单点登录,登出(java和php客户端) -
f5528710:
IOS 利用UIScrollview实现滑动筛选 -
卡卡欧克:
php 客户端 不能和 java 客户端 同时登录 怎么办
cas实现单点登录,登出(java和php客户端) -
duanyutian:
大神 我加0 或者\n都没有用 和mina的通信有没有注意点 ...
ios socket AsyncSocket使用 -
周聪龙:
楼主,我按照你的那个配置之后,怎么反而不能登录了,我以前只是简 ...
cas 3.4登录成功返回用户更多信息
我的上一篇博客介绍了cas服务端,java和php客户端的配置。今天介绍下cas 3.4登录成
功返回用户更多信息。cas登录成功默认返回的只有用户名,
java客户端获取:
AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
String username = principal.getName();
php客户端获取
$username=phpCAS::getUser();
我们的程序中也可能遇到需要得到更多如姓名,手机号,email等更多用户信息的情况。cas
各种版本配置方式也不尽相同,这里讲的是目前最新版本3.4.4。配置方式如下,
一、首先需要配置属性attributeRepository,首先,你需要到WEB-INF目录找到
deployerConfigContext.xml文件,同时配置attributeRepository如下:
<bean class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao" id="attributeRepository"> <constructor-arg index="0" ref="casDataSource"/> <constructor-arg index="1" value="select * from userinfo where {0}"/> <property name="queryAttributeMapping"> <map> //这里的key需写username,value对应数据库用户名字段 <entry key="username" value="loginname"/> </map> </property> <property name="resultAttributeMapping"> <map> <entry key="id" value="id"/> <entry key="mobile" value="mobile"/> <entry key="email" value="email"/> </map> </property> </bean>
其中queryAttributeMapping是组装sql用的查询条件属性,如下表中 结合 封装成查询sql就是select * from userinfo where loginname=#username#,resultAttributeMapping是sql执行完毕后返回的结构属性, key对应数据库字段,value对应客户端获取参数。
二、配置用户认证凭据转化的解析器,也是在deployerConfigContext.xml中,找到 credentialsToPrincipalResolvers,为UsernamePasswordCredentialsToPrincipalResolver注入attributeRepository,那么attributeRepository就会被触发并通过此类进行解析,红色为新添部分。
<property name="credentialsToPrincipalResolvers"> <list> <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver"> <property name="attributeRepository" ref="attributeRepository"/> </bean> <bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver"/> </list> </property>
三、修改WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp,在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展,如下,红色为新添加部分
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> <cas:user>${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}</cas:user> <cas:attributes> <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"> <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}> </c:forEach> </cas:attributes> </c:if> 通过完成上面三个步骤的配置后,server端的工作就完成了,那么如何在客户端获取这些信息呢?下面进行说明:
<cas:authenticationSuccess>
<c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
<c:if test="${not empty pgtIou}">
<cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
</c:if>
<c:if test="${fn:length(assertion.chainedAuthentications) > 1}">
<cas:proxies>
<c:forEach var="proxy" items="${assertion.chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(assertion.chainedAuthentications)-2}" step="1">
<cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>
</c:forEach>
</cas:proxies>
</c:if>
</cas:authenticationSuccess>
</cas:serviceResponse>
java客户端获取:
AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
Map attributes = principal.getAttributes();
String email=attributes .get("email");
php客户端;
$email=phpCAS::getAttribute('email');
这里补充一下,实现返回功能的attributeRepository在person-directory-impl-1.5.0-RC6.jar这个jar包中,其中执行查询的在类org.jasig.services.persondir.support.jdbc.AbstractJdbcPersonAttributeDao.java中,如果对返回值有其他要求,比如我的就是需要调用webservice获取返回值可以在这个文件封装自己的返回值,或者修改查询条件。
List results = this.simpleJdbcTemplate.query(querySQL, rowMapper, params);
//List中results 中保存的对象为Map<String,Object>类型的所以自定义
// Map<String, Object> map=new HashMap<String, Object>();
// map.put("ID", 3);
// map.put("LOGINNAME", "allen");
// map.put("PASSWORD","123456");
// map.put("ADDTIME", "2010-11-29 00:00:00.0");
// map.put("STATE", 0);
// map.put("MOBILE", "123456789");
// map.put("EMAIL", test@126.com);
// results.add(map);
return parseAttributeMapFromResults(results, queryUserName);
写在最后,若按照以上配置还是不能获得返回值的话,我通过调试源码发现把源码中
org.jasig.cas.CentralAuthenticationServiceImpl.java 编译后再cas-server-core-3.4.4.jar中的第360-368行代码给注释掉就ok了,
360// for (final String attribute : registeredService
361// .getAllowedAttributes()) {
362// final Object value = principal.getAttributes().get(
363// attribute);
364//
365// if (value != null) {
366// attributes.put(attribute, value);
367// }
368// }
至于原因嘛目前还没搞明白,有知道的可以交流下。
评论
String username = principal.getName();
运行后principal总是为null,我都参考了N篇文章了,就是不行,我就想在客户端得到登录的用户名。
大哥,能不能把您的服务器端和客户端代码都发给我学习学习,简单的demo就行,谢谢您了,我真的很急啊!
我邮箱756535761@qq.com
Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
AttributePrincipal principal = assertion.getPrincipal();
String username = principal.getName();
这种方式试试
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<filter-class>org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class>
这个让人怎么信服啊
<bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl"> <property name="registeredServices"> <list> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="0" /> <property name="name" value="HTTP" /> <property name="description" value="Only Allows HTTP Urls" /> <property name="serviceId" value="http://**" /> <property name="evaluationOrder" value="10000001" /> <!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--> <property name="ignoreAttributes" value="true" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="1" /> <property name="name" value="HTTPS" /> <property name="description" value="Only Allows HTTPS Urls" /> <property name="serviceId" value="https://**" /> <property name="evaluationOrder" value="10000002" /> <!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--> <property name="ignoreAttributes" value="true" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="2" /> <property name="name" value="IMAPS" /> <property name="description" value="Only Allows HTTPS Urls" /> <property name="serviceId" value="imaps://**" /> <property name="evaluationOrder" value="10000003" /> <!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--> <property name="ignoreAttributes" value="true" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="3" /> <property name="name" value="IMAP" /> <property name="description" value="Only Allows IMAP Urls" /> <property name="serviceId" value="imap://**" /> <property name="evaluationOrder" value="10000004" /> <!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--> <property name="ignoreAttributes" value="true" /> </bean> </list> </property> </bean>
private RegisteredService constructDefaultRegisteredService(final List<String> attributes) { final RegisteredServiceImpl r = new RegisteredServiceImpl(); r.setAllowedToProxy(true); r.setAnonymousAccess(false); r.setEnabled(true); r.setSsoEnabled(true); r.setAllowedAttributes(attributes); if (attributes == null || attributes.isEmpty()) { r.setIgnoreAttributes(true); } return r; }
里面已经自己设置了?
service中断点调试已经将值放进去了,但是客户端也是取不到值,你解决没。?
<bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl"> <property name="registeredServices"> <list> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="0" /> <property name="name" value="HTTP" /> <property name="description" value="Only Allows HTTP Urls" /> <property name="serviceId" value="http://**" /> <property name="evaluationOrder" value="10000001" /> <!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--> <property name="ignoreAttributes" value="true" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="1" /> <property name="name" value="HTTPS" /> <property name="description" value="Only Allows HTTPS Urls" /> <property name="serviceId" value="https://**" /> <property name="evaluationOrder" value="10000002" /> <!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--> <property name="ignoreAttributes" value="true" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="2" /> <property name="name" value="IMAPS" /> <property name="description" value="Only Allows HTTPS Urls" /> <property name="serviceId" value="imaps://**" /> <property name="evaluationOrder" value="10000003" /> <!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--> <property name="ignoreAttributes" value="true" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="3" /> <property name="name" value="IMAP" /> <property name="description" value="Only Allows IMAP Urls" /> <property name="serviceId" value="imap://**" /> <property name="evaluationOrder" value="10000004" /> <!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--> <property name="ignoreAttributes" value="true" /> </bean> </list> </property> </bean>
org.jasig.cas.CentralAuthenticationServiceImpl.java 编译后再cas-server-core-3.4.4.jar中的第360-368行代码给注释掉就ok了,
360// for (final String attribute : registeredService
361// .getAllowedAttributes()) {
362// final Object value = principal.getAttributes().get(
363// attribute);
364//
365// if (value != null) {
366// attributes.put(attribute, value);
367// }
368// }
至于原因嘛目前还没搞明白,有知道的可以交流下。
也遇见了楼主说的这个问题.
deployerConfigContext.xml文件中
<bean
id="serviceRegistryDao"
class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
这个bean的registeredServices配置了不同协议对应的一些参数.
默认是
<property name="registeredServices"> <list> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="0" /> <property name="name" value="HTTP" /> <property name="description" value="Only Allows HTTP Urls" /> <property name="serviceId" value="http://**" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="1" /> <property name="name" value="HTTPS" /> <property name="description" value="Only Allows HTTPS Urls" /> <property name="serviceId" value="https://**" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="2" /> <property name="name" value="IMAPS" /> <property name="description" value="Only Allows HTTPS Urls" /> <property name="serviceId" value="imaps://**" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="3" /> <property name="name" value="IMAP" /> <property name="description" value="Only Allows IMAP Urls" /> <property name="serviceId" value="imap://**" /> </bean> </list>
RegisteredServiceImpl有一个allowedAttributes的属性很关键,这个属性配置的list就是允许哪些属性可以传送到客户端,因为我用的是http,所以在
http对应RegisteredServiceImpl中加入配置
<property name="allowedAttributes"> <list> <value><!-- your attribute key --></value> </list> </property>
即可
tTrailManager] - <Audit trail record BEGIN
=============================================================
WHO: audit:unknown
WHAT: ST-1-91RJwKTjEtnMhRtFdBeI-cas
ACTION: SERVICE_TICKET_VALIDATED
APPLICATION: CAS
WHEN: Tue Oct 18 19:47:20 CST 2011
CLIENT IP ADDRESS: 20.1.44.218
SERVER IP ADDRESS: 20.1.44.218
=============================================================
WHO: audit:unknown 大家知道什么问题导致的吗 谢谢
String username = principal.getName();
运行后principal总是为null,我都参考了N篇文章了,就是不行,我就想在客户端得到登录的用户名。
大哥,能不能把您的服务器端和客户端代码都发给我学习学习,简单的demo就行,谢谢您了,我真的很急啊!
我邮箱756535761@qq.com
相关推荐
cas3.4集成restle所需jar文件
Liferay6.0.5 与cascas-server-3.4.3.1-release.zip 整合
基于java的cas单点登录集成,完整的源码和测试用例
cas-server-3.4.2.1-release
本项目用于实际单点登录项目中集成cas修改项目登录页,直接解压项目导入ecliplse即可以使用,脚本用原来自带的就可以
部署到tomcat上就可以了,注意修改配置文件数据库路径
CAS client 3.4.2源码以及Build jar
Yelu大学研发的CAS(Central Authentication Server) , 单点登录服务器 , 将war包放置到tomcat/webapp中即可运行
cas-server-3.4.2.1和cas-client-3.3.3 有需要的拿去, 来自 http://developer.jasig.org/cas/ 但是下载速度及慢, 我下了里面的最新版本, 有需要的拿去
CAS客户端获取用户保存至sessionUser
详细描述了cas 自定义登陆页面的配置与demo
基于springboot,cas,shiro,pac4j,实现cas rest接口获取ticket,不再跳转cas server登录页
系统采用CAS实现,一次登录多次使用,当用户成功登录系统后,就可以访问所有授权了的其他系统,而不用每次访问其他系统都要输入用户名和密码,或者被要求注册。资源列表(1:cas CAS Server,2:Cas_Client_One 授权...
cas client增加stucts框架 服务端返回用户其它信息
本文在已有的禅道集成CAS单点登录的客户端插件基础上进行的修改,因原有插件在我们的系统上调试无法成功,做了一些定制,环境如下: 1. CAS server 版本:4.0.0 2. 禅道开源版本: 9.6.3 3. 禅道CAS client 插件版本...
系统采用CAS实现,一次登录多次使用,当用户成功登录系统后,就可以访问所有授权了的其他系统,而不用每次访问其他系统都要输入用户名和密码,或者被要求注册。资源列表(1:cas CAS Server,2:Cas_Client_One 授权...
本人亲自试验的cas单点登录配置,服务端用cas-server-3.5.2,客户端用cas-client-3.2.1,里边详细描述了具体每一步的配置过程及遇到的问题及异常,相信你也会碰到的,cas-client-3.2.1中需要修改一个java类的源代码...
----------------------------使用--------------------------------- ...14.CAS-实现自定义返回用户登录信息 15.CAS-页面缓存记住我 ------------------------------建表脚本在文件里登录用户/密码:ll/123456
主要讲述了CAS单点登录多数据及获取更多用户信息配置。
使用struts2+spring+cas实现的单点登录功能,里面包括cas-server3.5.2项目一个,cas-client3.2.1 web项目两个,数据库脚本,请按照里面的说明文档进行部署,希望你们也能配置成功。