JASIG CAS学习(六): 服务端返回自定义信息

在上一篇中,CasRealm的roleAttributeName和permissionAttributeName属性,用于解析服务端传递的角色和权限,并将其赋给当前登录的用户。目前,服务端默认的是仅仅将用户名返回,不带其他的信息,现在就在服务端完成返回自定义信息这一功能。

服务端返回的用户信息都存在Principal中,其中id为用户名,attributes就是一些其他额外的信息了。因此自定义的信息应该是添加到Principal的attitudes属性中,那么如何才能将他添加到Principal中呢?参考官网,给出了一个解决方案就是使用  PrincipalResolver(官网介绍)。CAS 也提供了一些内置的PrincipalResolver可供使用,在 deployerConfigContext.xml中,其默认使用了一个 personDirectoryPrincipalResolver (官网介绍),它可以JDBC方式来添加用户额外属性,一般用户的详细信息都是存在数据库中的,所以这种方式可以很轻松的完成添加额外信息。

personDirectoryPrincipalResolver 会注入一个id为 attributeRepository 的bean,用于执行具体的获取用户信息的操作,其实是一个 IPersonAttributeDao 接口的实现,参考官网的介绍,这里使用 SingleRowJdbcPersonAttributeDao。要使用它首先需要引入一个依赖,随后需要更改 deployerConfigContext.xml 文件中的配置,就是讲 attributeRepository  的bean改为使用 SingleRowJdbcPersonAttributeDao。


      org.apache.commons
      commons-collections4
      4.1


          
    	
     
    
     
    
        
          
       
      
     
      
      
      
     
 

这个类使用构造器注入了 数据源dataSource和具体执行的sql,queryAttributeMapping中key username 不能更改,他是在登录页中输入的用户名,value是你数据库中对应的字段;resultAttributeMapping就类似于mybatis的resultMap,key为数据库中字段名,value为你添加到attributes中的key。(对于如何使用多条件查询以及返回多条结果,这个我还没试过)

这些配置完成之后,principal中就会存在这些属性了,但是执行登录之后发现客户端并没有获取到这些属性?

原因在于,这些属性仅仅是写在了principal中,但是并没有把它写到返回给客户端的response中。认证ticket和承载转发到cas client的信息是由casServiceValidationSuccess.jsp页面来完成的。可以看到在overlay中有两个casServiceValidationSuccess.jsp文件,分别位于/WEB-INF/view/jsp/protocol/2.0 和 /3.0文件夹下,说明CAS认证是有2.0和3.0版本的协议的。我在客户端中使用的是2.0,所以要改写 2.0文件夹下的 casServiceValidationSuccess.jsp文件。

之前改写都是直接在/resources/cas_views.properties文件中定义,但是这个文件无法这么操作,只能跟它一样在工程建立一个一模一样的文件路径 /WEB-INF/view/jsp/protocol/2.0,在将 casServiceValidationSuccess.jsp 拷贝进来,然后改写;改写完成之后就可以在客户端获取到自定义的属性啦。

<%@ page session="false" contentType="application/xml; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

    
        ${fn:escapeXml(principal.id)}
        <%-- 添加属性  begin --%>
        
          
              
                   ${fn:escapeXml(attr.value)}
                
            
         
        <%-- 添加属性  end --%>
        
            ${pgtIou}
        
        
            
                
                    ${fn:escapeXml(proxy.principal.id)}
                
            
        
    

 

你可能感兴趣的:(JAVA,CAS)