`
fhqibjg
  • 浏览: 55315 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

cas单点登录反回用户多字段数据笔记

cas 
阅读更多

 

准备工作

下载cas客户端与服务器端包,这里介绍的版本为

client : 3.2.1

server : 3.5.2

 

cas部署

       CAS Server 是一套基于 Java 实现的服务,该服务以一个 Java Web Application 单独部署在与 servlet2.3 兼容的 Web 服务器上,另外,如果 Client 与 CAS Server 之间的交互采用 Https 协议通信的话,部署 CAS Server 的服务器还需要支持 SSL 协议。当 SSL 配置成功过后,像普通 Web 应用一样将 CAS Server 部署在服务器上就能正常运行了。

 

 

证书生成

 

1,我们用java的keytool工具生成store文件, 命令如下,按提示操作输入相关信息

keytool -genkey -keystore d:/tomcat.store -alias tomcat

2,生成cert文件

keytool -export -file D:/tomcat.cert -alias tomcat -keystore d:/tomcat.store

 

3,导入我们jdk

keytool -import -keystore D:\Java\jdk1.6.0_31\jre\lib\security\cacerts -file d:/tomcat.cert -alias tomcat

 

 

tomcat server.xml文件中打开https支持

 

在tomcat的config server.xml中打开 Connector结点

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" 
             maxThreads="150" scheme="https" secure="true"   
             keystoreFile="yourPath/xx.keystore" keystorePass="yourPwd"  
             clientAuth="false" sslProtocol="TLS" />  

 

 这里注意下,在tomcat6某些版本下

 protocol="HTTP/1.1 "      

 改为 

 protocol="org.apache.coyote.http11.Http11Protocol"  

否则起动会报错

 

 

 

cas server客户端配制

       这里通过mysql数据库认证,所以事先加入mysql的依赖包和cas 对jdbc支持的jar包

 

 

配制deployerConfigContext.xml

 

1,我们配制一个数据源:

<!-- 配制数据源 -->
<bean id="casDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/xxx</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>xxx</value>
</property>
</bean>

 

 

 

 

2,密码一般都采用md5或是其它算法加密,所以还要配制一个加密器(这里用内置的当然你也可以自定义)

<!-- 加密器 -->
<bean id="MD5PasswordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
<constructor-arg index="0">
<value>MD5</value>
</constructor-arg>
</bean>

 

 

 

3,AuthenticationHandler

 

【http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/ 文章中的原话】

        在 cas-server-support-jdbc-3.1.1.jar 包中,提供了 3 个基于 JDBC 的 AuthenticationHandler,分别为 BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler。其中 BindModeSearchDatabaseAuthenticationHandler 是用所给的用户名和密码去建立数据库连接,根据连接建立是否成功来判断验证成功与否;QueryDatabaseAuthenticationHandler 通过配置一个 SQL 语句查出密码,与所给密码匹配;SearchModeSearchDatabaseAuthenticationHandler 通过配置存放用户验证信息的表、用户名字段和密码字段,构造查询语句来验证。

 

       使用哪个 AuthenticationHandler,需要在 deployerConfigContext.xml 中设置,默认情况下,CAS 使用一个简单的 username=password 的 AuthenticationHandler,在文件中可以找到如下一行:<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePassword

AuthenticationHandler" />,我们可以将其注释掉,换成我们希望的一个 AuthenticationHandler,比如,使用QueryDatabaseAuthenticationHandler 或 SearchModeSearchDatabaseAuthenticationHandler

 

我们这里配制为:

<!-- 注释掉简单的登录验证 替换成下面bean
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"
/> -->

<bean
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="casDataSource" />
<property name="sql"
value="select PASSWORD from xxx where lower(LOGINNAME) = lower(?)" />
   <property name="passwordEncoder" ref="MD5PasswordEncoder" /> 
</bean>

 

 

 

 

  4,这里是反回用户的更多信息,所以还需要配制如下信息

 <!-- 反回数据字段 -->
<bean class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao"
id="attributeRepository">
 <constructor-arg index="0" ref="casDataSource" />
 <constructor-arg index="1" value="select * from xxx where {0}" />
 <property name="queryAttributeMapping">
     <map>
         <!-- 这里的key需写username,value对应数据库用户名字段 -->
         <entry key="username" value="LOGINNAME" />
     </map>
 </property>
<!-- sql执行完毕后返回的结构属性, key对应数据库字段,value对应客户端获取参数 -->
 <property name="resultAttributeMapping">
     <map>
         <entry key="USERID" value="id" />
         <entry key="LOGINNAME" value="loginName" />
         <entry key="USERNAME" value="name" />
     </map>
 </property>
</bean>

 

注: 这里反回*时,对于日期字段为'0000-00-00'这样的格式会报错,所以数据库数据要规范下,或是不用*反回所有而是直接写你需要的字段

 

 

 

5,这里还没完,对于反回多字段信息在需要如下配制

<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" />
<!-- 3.5返回自定义数据字段新添加属性-->
<property name="ignoreAttributes" value="true" /> 
<!-- 3.4属性
<property name="allowedAttributes">
<list>
<value>....</value>
</list>
</property>
-->
</bean>

 

jsp页面的扩展

     

      因为反回多个字段,所以还要对反回数据的WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp页面做扩展

 

1,页面顶部加入<%@page pageEncoding="UTF-8"%>(对中文处理)

 

2,对生成数据交互的xml做扩展

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

 

 

登录中文乱码解决

     好了现在服务器端配制基本结束,但对于登录过程带中文乱码的还末解决,这时在服务器端的web.xml中配制个过滤器

<!-- 防提交参数中文乱码 -->
<filter> 
<filter-name>encodingFilter</filter-name> 
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
          <param-name>encoding</param-name> 
          <param-value>utf-8</param-value> 
     </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
</filter-mapping> 

 

  

  

  客户端配制:

  

  这里直接贴配制

  

<!-- 用于单点退出,该过滤器用于实现单点登出功能 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<!-- 该过滤器负责用户的认证工作,必须启用 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<!--认证服务端url -->
<param-name>casServerLoginUrl</param-name>
<param-value>https://localhost:8443/cas/login</param-value>
</init-param>
<init-param>
<!-- 客户端url -->
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器负责对Ticket的校验工作,必须启用 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://localhost:8443/cas/</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
<!-- 防获取参数中文乱码 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器负责实现HttpServletRequest请求的包裹,比如允许开发者 通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder 来获取用户的登录名, 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 自动根据单点登录的结果设置本系统的用户信息,AutoSetUserAdapterFilter就是一个自定义过过滤器,它主要做一些用户数据的本系统的处理工作(如用户信息session的放入) -->
<filter>
<display-name>AutoSetUserAdapterFilter</display-name>
<filter-name>AutoSetUserAdapterFilter</filter-name>
<filter-class> com.common.filter.AutoSetUserAdapterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AutoSetUserAdapterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

  

  客户端获取用户信息:

 

AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
Map<String, Object> user = principal.getAttributes();

  这里的user的map中就是你反回的用户信息字段数据

 

 

 

分享到:
评论
1 楼 qq44056919 2014-01-24  
你好,我参考了您的这个笔记的步骤做了测试,可是还是无法返回attributes ,您能把您的源码打包发我吗? 谢谢了。 44056919@qq.com

相关推荐

    cas 单点登录 解决方案.

    cas 单点登录解决方案可以在不同的层面上进行集成,例如在数据存储层面上的“数据大集中”,在传输层面上的“通用数据交换平台”,在应用层面上的“业务流程整合”,和用户界面上的“通用企业门户”等等。cas 单点...

    CAS单点登录demo

    通过这个“CAS单点登录demo”,你可以学习并实践如何设置和配置CAS环境,理解其工作流程,为你的多应用环境提供安全便捷的单点登录解决方案。记得在实践中不断探索和调试,以便更好地理解和掌握CAS的精髓。

    基于Java集成CAS单点登录【接部署即可启用】

    基于Java中CAS的单点登录,有服务端的所有源码,将tomcat目录下的所有资源直接拷到Tomcat服务中间件的webapp目录下,阅读tomcat-webapp中的read.txt文档,查看使用说明,适用于第一次开发CAS单点登录的同学们,简单...

    CAS多数据库配置单点登录

    CAS多数据库配置单点登录 CAS(Central Authentication Service)是一种流行的单点登录解决方案,能够提供安全、...通过了解CAS单点登录的原理和配置步骤,可以更好地应用CAS单点登录,提高企业应用的安全性和可靠性。

    CAS单点登录(java)

    CAS单点登录CAS单点登录CAS单点登录CAS单点登录

    cas单点登录

    总之,CAS单点登录系统提供了统一的身份验证入口,简化了用户登录过程,提高了用户体验。通过理解和实践CAS Server的配置以及客户端的集成,开发者可以有效地在自己的应用环境中实现单点登录功能。

    CAS单点登录操作文档

    CAS单点登录操作文档 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: • 开源的企业级单点登录解决...

    CAS单点登录系统之java实现(part_1)

    资源列表(1:cas CAS Server,2:Cas_Client_One 授权系统,3:graduationDesign 用户组织管理系统,4:CAS单点登录论文.doc,5:CAS单点登录文献综述.doc,6:基于CAS的用户管理单点登录门户系统ppt.ppt)

    CAS单点登录配置

    在提供的PDF文件`cas单点登录(一).pdf`和`cas单点登录(二).pdf`中,应该详细涵盖了这些步骤,以及更深入的技术细节,包括可能出现的问题和解决方案。通过学习这些文档,你应该能够成功地配置和实施CAS单点登录...

    .net cas单点登录

    .NET CAS(Central Authentication ...综上所述,.NET CAS单点登录涉及到了身份验证、票证机制、客户端和服务器之间的交互等多个核心概念。理解和实施这些知识点,可以帮助开发者构建安全且用户友好的多应用系统环境。

    CAS单点登录多语言整合文档+源码

    这个压缩包文件包含的是关于CAS单点登录的多语言整合文档和源码,特别提到了PHP客户端和Java客户端的整合。 首先,我们来深入理解一下CAS的基本工作原理。当用户尝试访问受CAS保护的应用时,会被重定向到CAS服务器...

    基于Cas的单点登录实现

    1. **CAS服务器**:部署并配置CAS服务器,处理用户登录和票证验证。 2. **应用客户端**:使用Shiro的CasFilter,配置Cas客户端的连接参数,以及自定义的认证和授权规则。 3. **测试用例**:提供一系列的测试场景,...

    struts2+cas单点登陆例子

    Struts2和CAS单点登录(SSO)的集成是一个常见的Web应用安全实践,它允许用户在一个系统登录后,无须再次输入凭证就能访问其他相互信任的系统。在这个例子中,我们将深入探讨如何在MyEclipse环境下使用Struts2框架与...

    CAS单点登录例子,包含服务端和客户端

    CAS单点登录系统广泛应用于企业、学校等环境,用于统一管理多个内部系统,提高用户体验,同时简化安全管理。 综上所述,这个压缩包提供了一个完整的CAS单点登录实例,包括服务端和客户端的实现,可以帮助开发者理解...

    禅道开源版集成CAS单点登录

    本文在已有的禅道集成CAS单点登录的客户端插件基础上进行的修改,因原有插件在我们的系统上调试无法成功,做了一些定制,环境如下: 1. CAS server 版本:4.0.0 2. 禅道开源版本: 9.6.3 3. 禅道CAS client 插件版本...

    集成cas实现单点登录认证.zip

    集成CAS后,可以进一步提升系统的安全性,简化用户登录流程。 5. CAS协议与SAML2.0:CAS协议是CAS服务的默认认证协议,而SAML2.0是一种更复杂的身份验证标准,支持更丰富的属性传递和更灵活的授权策略。根据需求,...

    CAS单点登录实例

    总的来说,CAS单点登录实例的搭建涉及多个步骤,从下载和配置必要的jar包,到修改配置文件,再到整合客户端应用,每一个环节都需要对CAS协议和SSO原理有深入理解。同时,安全性和用户体验也是实施过程中不可忽视的...

    用cas实现mantis单点登录和登出

    单点登录(Single Sign-On,简称 SSO)是一种常见的身份认证模式,它允许用户在多个应用程序和服务中仅通过一次登录就能访问所有相关系统而无需多次输入密码。这种机制极大地提高了用户体验,并且在一定程度上增强了...

    CAS单点登录配置大全

    **CAS单点登录配置大全** CAS(Central Authentication Service,中央认证服务)是一种广泛使用的开源单点登录(Single Sign-On,SSO)协议。它允许用户通过一个统一的认证系统访问多个应用系统,而无需在每个系统...

Global site tag (gtag.js) - Google Analytics