• cas登录成功返回用户更多信息


    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: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');

    这里补充一下,实现返回功能的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//                }

  • 相关阅读:
    linux搭建svn服务器
    Cmder添加到右键菜单
    linux系统配置本地软件仓库
    pom文件parent标签的使用,parent版本号报红线(很明显引用的是本地自己的包)
    Redis学习记录-001
    (概念总结)快速了解JVM结构和工作原理
    Java 设计模式(七)《抽象工厂模式》
    多线程间通信wait(),notify(),notifyAll()
    快速了解数据结构
    JDK1.8 Consumer & Supplier 什么意思
  • 原文地址:https://www.cnblogs.com/tiantiantianlan/p/3184480.html
Copyright © 2020-2023  润新知