cas 3.5.2 登录成功后,如何返回用户更多信息?

以下文章大部分参考  http://zxs19861202.iteye.com/blog/890965 的内容,按照文章中制作后,补充了部分细节,形成了此片文章。

文章中 CAS 基础环境:

cas-server-3.5.2    

cas-client-3.2.1

----------------------------------------------------------------------------------------------------------------------------------------

服务器端配置

----------------------------------------------------------------------------------------------------------------------------------------

 
程序中也可能遇到需要得到更多如姓名,手机号,email等更多用户信息的情况。

cas 各种版本配置方式也不尽相同,这里讲的是目前最新版本3.4.4(同样适合 3.5.2 版本)。配置方式如下,

 

 一、首先需要配置属性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>

                <entry key="username" value="loginname"/>  // 这里的key需写username,value对应数据库用户名字段

            </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>

 三、(在 CAS Server 3.5.2 中测试通过)修改 deployerConfigContext.xml 中的 org.jasig.cas.services.InMemoryServiceRegistryDaoImpl 的 属性 registeredServices

修改 registeredServices  列表中的每个协议中的 allowedAttributes 属性的值。列出的每个值,在客户端就可以访问了

<bean  id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
            <property name="registeredServices">
                <list>
                    <bean class="org.jasig.cas.services.RegexRegisteredService">
                        <property name="id" value="0" />
                        <property name="name" value="HTTP and IMAP" />
                        <property name="description" value="Allows HTTP(S) and IMAP(S) protocols" />
                        <property name="serviceId" value="^(https?|imaps?)://.*" />
                        <property name="evaluationOrder" value="10000001" />
                        <property name="allowedAttributes"> // 客户端需要使用的对象的属性名称
                                <list>
                                        <value>uid</value>
                                        <value>email</value>
                                        <value>mobile</value>
                                        <value>phone</value>
                                        <value>sex</value>
                                        <value>identify_type</value>
                                        <value>identify_id</value>
                                        <value>birth</value>
                                        <value>fax</value>
                                        <value>isMarry</value>
                                        <value>userno</value>
                                        <value>login_account</value>
                                </list>
                        </property>
                    </bean>

此步骤灰常重要,可以看看 org.jasig.cas.services.RegexRegisteredService 的源码,其中的 allowedAttributes 是关键

【提示】网上说 ignoreAttributes 属性控制,查看了 CAS 3.5.2 版本的 AbstractRegisteredService 源码后,发现其默认值就是 false,即:添加属性后,客户端就可见了

四、(按照上述配置后,万里长征就差最后一步了)修改 WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp

在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展,如下,红色为新添加部分 

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>

  <cas:authenticationSuccess>

<cas:user>${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}</cas:user>

   <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">

            <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>

<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>

 

通过完成上面四个步骤的配置后,server端的工作就完成了,那么如何在客户端获取这些信息呢?下面进行说明:

 

----------------------------------------------------------------------------------------------------------------------------------------

客户端获取用户信息

----------------------------------------------------------------------------------------------------------------------------------------

 java客户端获取用户信息:

AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();

Map attributes = principal.getAttributes();

String email=attributes .get("email");

 

php客户端;

$email=phpCAS::getAttribute('email');

参考文档: http://zxs19861202.iteye.com/blog/890965

时间: 2024-10-12 11:24:22

cas 3.5.2 登录成功后,如何返回用户更多信息?的相关文章

java-【急】求大神帮帮忙,CAS单点登录问题,登录成功后controller收不到请求(要哭了)

问题描述 [急]求大神帮帮忙,CAS单点登录问题,登录成功后controller收不到请求(要哭了) 首先说下问题,我们的项目之前SSO单点登录一直用的http的方式, 这一块登录一直都是正常的,现在要切上正式环境了,SSO服务器那边就改用了https的方式SSO配置如下: <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-cla

CAS单点登录,客户端为weblogic,登录成功后跳转到客户端应用系统时报错

问题描述 CAS单点登录,客户端为weblogic,登录成功后跳转到客户端应用系统时报错 CAS单点登录部署在tomcat中,客户端应用中间件为weblogic.能成功进入单点登录首页并能成功登录,但是跳转到客户端应用系统(weblogic)时报下文中的错误.但是客户端应用系统中间件替换成tomcat却没有问题,能够成功跳转到系统.求高手帮忙! Error 500--Internal Server Error javax.net.ssl.SSLKeyException: FATAL Alert:

ASP.net实现从首页弹出登录窗体,登录成功后返回到首页

问题描述 就如题目所说,从首页点击一个超链接,弹出登录窗体,登录成功后,又返回首页,只是这时候有些内容发生改变了,但是登录后的页面只有自己可以看见,别人看见的是,没有登录钱的:.......类似于百度文库的登录 解决方案 解决方案二:弄一个隐藏的层做好登录界面.点连接弹出层,点登录去验证,通过再次隐藏登录的层,同时刷新一下首页.

android-新手求解,在登录页面判断登录成功后怎么在弹出框的“确定”实现跳转

问题描述 新手求解,在登录页面判断登录成功后怎么在弹出框的"确定"实现跳转 如图所示,不知道这个在哪里设置监听器,因为在 "判断输入的用户是否正确 "那边弹出框设置的,.setMessage("成功登录").setPositiveButton("确定",null).show();......之前class里边设置过监听器如ss,然后null就填ss,但好像不行,发现是两边没在一起.一个在class,一个在public Bool

iis7-iis发布网站,登录成功后不跳转

问题描述 iis发布网站,登录成功后不跳转 在iis发布网站后,,网站使用表单身份验证,网站登录后闪了一下不跳转到指定页面. 解决方案 是不是权限没有设置???

求教extjs问题:用户登录成功后,用户ID是如何保存的?

问题描述 问题是这样的:当用户登录成功后,用变量保存之,然后在各个控件中使用.问题有二:一.用户登陆成功后,用什么保存用户ID? 我目前用cookies,这方法可用,但是不知道大家有没有更好的办法二.我用cookies读到值后,但是当要在控件中使用的时候,读取不到值.具体代码如下:布局代码:var cookiesuid = "";Ext.onReady(function() { // 修改该空白背景图的路径,指向你服务端一个有效的图片路径. Ext.BLANK_IMAGE_URL =

求教模拟登录成功后怎么打开新页面?

问题描述 我利用HttpWebRequest类模拟登录对方的网页已经成功了,而且能获取到成功后的跳转页面信息.但是在浏览器中打开跳转页面依旧返回到登陆页..等于现在成功页面只能在Httpwebreque类里面的webresponse里面才能看见..我怎么才能将其呈现在浏览器中呢? 解决方案 解决方案二:快来人回一个,我好结贴给分了!!解决方案三:这个说的有点模糊,没怎么看懂...发送消息到多方的网页,不管是登录成功或者失败,都会返回值根据返回值判断返回成功Response.Redirect("x

android进行二维码的扫描后,扫描成功后如何返回到指定的活动

问题描述 android进行二维码的扫描后,扫描成功后如何返回到指定的活动 现在是扫描成功返回到点击扫描按钮的那个活动,我想让他返回到我指定的活动,我使用的是ZXing库扫描二维码,另外我想知道,二维码中是图片,我如何将扫描的图片在android布局文件中显示出来,我试过,如果是图片扫描的是一串url,希望各位前辈大神教教我这个大三学生,不甚感激 解决方案 用的是zxing的话在CaptureActivity里面可以这么写,就是普通的两个高activity跳转而已 public void han

ajax请求成功后的返回数据

问题描述 ajax请求成功后的返回数据 我用ajax发送请求做注册,若请求成功且注册成功,用了alert("注册成功"), 若验证码或其他问题,导致访问成功但是未注册成功,会有其他的信息弹出. 在不同情况下,其他信息都会根据各种情况正确的弹出,但是当注册成功时(查了后台数据,能够查到新注册的信息),"注册成功"字样不弹出来. 解决方案 你在success回调里面return内容无用,没有任何对象接收返回值,而且ajax是异步的,如果你userLive要返回数据,也需