cas 服务器端能返回更多的信息

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

 


除此之外:

  实现返回功能的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//                }

 

 

 

至于原因嘛目前还没搞明白,有知道的可以交流下。

 

 

 

posted @ 2012-04-25 15:48  jiuzhongguo  阅读(4073)  评论(0编辑  收藏  举报