`
itace
  • 浏览: 181010 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

CAS4.0集成OpenLdap返回用户属性

 
阅读更多

我们知道,CAS SSO可以把username(uid)带入到客户端登录成功后的页面中去,可是一个uid在LDAP中还关联着许多其它有用的信息如:email,address。我们也想把这些信息同时带到客户端登录成功的画面中去.网上大多数是CAS3的一些方法,CAS4与CAS3相比在配置上有着很大的不同。我就把我  的整合在此分享下。
其实CAS验证成功到跳转客户端这个过程中,CAS SERVER 会返回登录的相关信息给客户端,客户端只要进行获取,就能知道登录的具体是哪个用户了。不过CAS 默认只返回用户名给客户端,那么怎么定义CAS SERVER返回的信息呢? 
首先,先了解下几个相关的接口:
Credentials
Principal
IPersonAttributeDao
PrincipalResolver
Credentials (org.jasig.cas.authentication.Credentials)接口:这个接口是用来定义我们登录页上输入的认证信息的,比如用户名、密码、验证码等,可以理解为用户认证的相关凭据。
Principal (org.jasig.cas.authentication.principal.Principal) 接口:这个主要是用来保存用户认证后的用户信息,信息保存在一个Map中。
IPersonAttributeDao (org.jasig.services.persondir.IPersonAttributeDao) 接口,这个是用来定义我们需要返回给客户端相关信息的接口,CAS SERVER 默认有提供许多实现,比如
LdapPersonAttributeDao :通过查询 LDAP 目录 ,来返回信息
SingleRowJdbcPersonAttributeDao : 通过JDBC SQL查询,来返回信息等等,还有许多,大家可以参考源码中的实现,CAS SERVER 提供了各种功能的实现,有时候我们可以直接使用这个现成的就行了。
PrincipalResolver(org.jasig.cas.authentication.principal.PrincipalResolver) 接口,上面有说到 Credentials 是从登录页面上进行获取相关用户信息的。那么认证成功后,怎么把Credentials里面的信息转换到 Principal  中呢,这就是这个接口的作用了。由于认证本身是没有返回用户信息的,只是确定认证是通过还是没有通过。这时还要用到我们上面的IPersonAttributeDao 接口,在这接口中我们就可以定义我们需要返回的信息了。接口中有两个方法
resolve : 解析Credentials中的信息,返回 Principal 接口
supports : 判断Credentials 是否支持 Principal 协议。
ps: 在3.x版本中没有 PrincipalResolver接口,对应的是CredentialsToPrincipalResolver, PrincipalResolver这个是在4.0版本中加入的.


整合流程:
1、配置安全证书:生成证书->导出证书->导入证书到jdk 在cmd中敲以下3行代码:
keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keystore d:\keys\.keystore -validity 3600
keytool -export -trustcacerts -alias tomcat -file d:\keys\tomcat.cer -keystore d:\keys\.keystore -storepass changeit
keytool -import -trustcacerts -alias tomcat -file d:\keys\tomcat.cer -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -storepass changeit
2、下载cas-server-4.0.0-release.zip 
3、解压cas-server-4.0.0-release.zip,并把里面的modules文件夹中的cas-server-webapp-4.0.0.war改名成cas(仅仅是为了方便)拷出来放到tomcat中的webapp中 
4、修改tomcat里面的8443端口内容,修改成如下:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true" 
               maxThreads="150" scheme="https" secure="true" 
               clientAuth="false" sslProtocol="TLS" 
               keystoreFile="d:/keys/.keystore"      <!--你的证书所放的位置-->
               keystorePass="xxxx" />   <!--认证证书的密码-->
5、下载这些jar包,将这些jar包放入cas中的lib文件夹中 
cas-server-support-ldap-4.0.0.jar 
spring-ldap-core-2.0.2.RELEASE.jar 
ldaptive-1.0.5.jar
6、CAS整合LDAP: 
 6.1 修改deployerConfigContext.xml文件
 6.1.1首先需要的是修改认证入口:
 

<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
     <constructor-arg>
            <map>
                <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
                <!--新增ldap认证的入口-->
		<entry key-ref="ldapAuthHandler" value-ref="primaryPrincipalResolver"/>
            </map>
       </constructor-arg>
<span style="white-space:pre">	</span><property name="authenticationPolicy">
            <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
        </property>
</bean>




 6.1.2 然后就是新增ldap中的LDAP配置文件,可以直接把下面的代码拷贝到你的deployerConfigContext.xml,将相应的参数修改成自己的就可以了

<!--ldap认证的入口-->
	<bean id="ldapAuthHandler"
          class="org.jasig.cas.authentication.LdapAuthenticationHandler"
          p:principalIdAttribute="uid"
          c:authenticator-ref="authenticator">
        <property name="principalAttributeMap">
            <map>
                <!--
                   | This map provides a simple attribute resolution mechanism.
                   | Keys are LDAP attribute names, values are CAS attribute names.
                   | Use this facility instead of a PrincipalResolver if LDAP is
                   | the only attribute source.
                   -->
                 <entry key="uid" value="uid" />
                 <!-- <entry key="ip_address" value="ip_address" />
                 <entry key="device_number" value="device_number" />
                 <entry key="expired_time" value="expired_time" /> -->
                 <entry key="displayName" value="displayName" />
            </map>
        </property>
    </bean>
    <bean id="authenticator" class="org.ldaptive.auth.Authenticator"
              c:resolver-ref="dnResolver"
              c:handler-ref="authHandler" />
      <!--
          | The following DN format works for many directories, but may need to be
          | customized.
          -->
	<bean id="dnResolver"
             class="org.ldaptive.auth.FormatDnResolver"
             c:format="uid=%s,ou=People,dc=sumscope,dc=com" /> 
	<bean id="authHandler" class="org.ldaptive.auth.PooledBindAuthenticationHandler"
             p:connectionFactory-ref="pooledLdapConnectionFactory" />
	<bean id="pooledLdapConnectionFactory"
             class="org.ldaptive.pool.PooledConnectionFactory"
             p:connectionPool-ref="connectionPool" />        
    <!--连接池-->
	<bean id="connectionPool"
             class="org.ldaptive.pool.BlockingConnectionPool"
             init-method="initialize"
             p:poolConfig-ref="ldapPoolConfig"
             p:blockWaitTime="3000"
             p:validator-ref="searchValidator"
             p:pruneStrategy-ref="pruneStrategy"
             p:connectionFactory-ref="connectionFactory" />
  	<bean id="ldapPoolConfig" class="org.ldaptive.pool.PoolConfig"
             p:minPoolSize="3"
             p:maxPoolSize="10"
             p:validateOnCheckOut="true"
             p:validatePeriodically="true"
             p:validatePeriod="300" />
  	<bean id="connectionFactory" class="org.ldaptive.DefaultConnectionFactory"
		p:connectionConfig-ref="connectionConfig" />
 	<bean id="connectionConfig" class="org.ldaptive.ConnectionConfig"
             p:ldapUrl="ldaps://iam.sumscope.com:637"  
             p:connectTimeout="3000"    
             p:useStartTLS="false"
             p:sslConfig-ref="sslConfig" />
	<!--证书配置-->
	 <bean id="sslConfig" class="org.ldaptive.ssl.SslConfig">
		<property name="credentialConfig">
			<bean class="org.ldaptive.ssl.X509CredentialConfig"
					p:trustCertificates="file:/D:/keys/iam.sumscope.com.crt" />  <!--证书地址-->
		</property>
	</bean>
	<bean id="pruneStrategy" class="org.ldaptive.pool.IdlePruneStrategy"
              p:prunePeriod="300"
              p:idleTime="600" />
	<bean id="searchValidator" class="org.ldaptive.pool.SearchValidator" />          
      <!--ldap认证结束-->        



6.1.3 找到primaryPrincipalResolver,配置attributeRepository的bean属性,增加LDAP查询数据并设置返回的字段信息:

<bean id="attributeRepository"
      class="org.jasig.cas.persondir.LdapPersonAttributeDao"
      p:connectionFactory-ref="pooledLdapConnectionFactory"
      p:baseDN="ou=People,dc=sumscope,dc=com" p:searchControls-ref="searchControls" p:searchFilter="uid={0}">


        <property name="queryAttributeMapping">
            <map>
                <entry key="username" value="uid" />
            </map>
        </property>
        <property name="resultAttributeMapping">
            <map>
                 <entry key="uid" value="uid" />
               <!--   <entry key="ip_address" value="ip_address" />
                 <entry key="device_number" value="device_number" />
                 <entry key="expired_time" value="expired_time" /> -->
                 <entry key="displayName" value="displayName" />
            </map>
        </property>
    </bean>



配置<util:list id="registeredServicesList">,配置p:ignoreAttributes="true",默认是false不返回属性信息。

<util:list id="registeredServicesList">
        <bean class="org.jasig.cas.services.RegexRegisteredService"
              p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols"
              p:serviceId="^(https?|imaps?)://.*" p:evaluationOrder="10000001" p:ignoreAttributes="true"/>
</util:list>



7、 修改完成后,我们还需要在 casServiceValidationSuccess.jspcas-server-webapp\src\main\webapp\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" %>
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
	<cas:authenticationSuccess>
		<cas:user>${fn:escapeXml(assertion.primaryAuthentication.principal.id)}</cas:user>
		<!--添加属性Begin-->
		<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>
		<!--添加属性End-->
        <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>



8、 接下来 在客户端设置信息的接收,我们直接在index.jsp中通过下面的方式获取:

<% 
		request.setCharacterEncoding("UTF-8");
		AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
		Map attributes = principal.getAttributes();
		String uid=(String)attributes.get("uid"); 
		String ip_address = (String)attributes.get("ip_address"); 
		String device_number = (String)attributes.get("device_number"); 
		String displayName=(String)attributes.get("displayName"); 
    
    %>
    <div>返回值演示</div>
    <ul>
        <li>uid:<%= uid%></li>
        <li>ip_address:<%= ip_address%></li>
        <li>device_number:<%= device_number%></li>
        <li>displayName:<%= displayName%></li>
    </ul>


至此配置结束完成。

注:怕原址丢失,本文完全转载

http://www.ithao123.cn/content-9482654.html

 

分享到:
评论

相关推荐

    CAS整合OpenLDAP(OpenLDAP已配置好的情况)

    在许多组织中,为了统一管理和认证用户,通常会将CAS与LDAP服务器集成,而OpenLDAP是一个广泛应用的轻量级目录访问协议服务器。本文将详细介绍在OpenLDAP已经配置好的情况下,如何将CAS与OpenLDAP进行整合。 首先,...

    CAS_LDAP.rar_CAS SSO_cas ldap_cas openldap_cas_ldap_soa和sso

    总的来说,通过集成CAS和OpenLDAP,企业可以构建一个强大而安全的SSO和SOA环境,有效地管理和控制用户访问权限,同时提升应用系统的用户体验。学习和掌握这一技术,对于IT专业人士来说,无论是为了个人技能提升还是...

    linux-openldap管理linux用户组密码策略

    在Linux系统中,OpenLDAP(Open Source Lightweight Directory Access Protocol)是一种强大的目录服务,常用于管理用户、组和其他系统资源。本教程将深入探讨如何利用OpenLDAP来管理Linux用户和组,以及实施密码...

    Django集成OpenLDAP认证的实现

    Django集成OpenLDAP认证可以帮助你利用现有的LDAP服务器来管理用户身份验证,使得用户可以在多个系统间共享统一的身份信息。 首先,我们要使用`django-auth-ldap`这个第三方库来实现Django与OpenLDAP的整合。你可以...

    Packt.Publishing.Mastering.OpenLDAP.Aug.2007

    ### OpenLDAP 掌控指南:配置、安全与集成目录服务 #### 一、OpenLDAP简介 OpenLDAP 是一个开源的轻量级目录访问协议(Lightweight Directory Access Protocol, LDAP)服务器套件,它提供了一种高效的方式来管理和...

    Openldap和outlook2007集成.docx

    Openldap和outlook2007集成,前者提供一种目录服务

    OpenLDAP常用命令

    OpenLDAP常用命令;增删改查;定义默认密码规则;ldap批量修改属性等等;很实用

    windows下搭建并配置OpenLDAP服务器

    在Windows环境下搭建并配置OpenLDAP服务器是一项常见的任务,特别是在企业级环境中,为了实现用户身份验证、数据共享和服务集成。OpenLDAP(Lightweight Directory Access Protocol)是一个开源的LDAP服务器,广泛...

    openldap

    OpenLDAP 是一个开源的轻量级目录访问协议(Lightweight Directory Access Protocol)实现,它提供了对目录服务的强大支持。在IT行业中,OpenLDAP 被广泛用于存储和管理组织结构数据,例如用户账户、联系人信息、组...

    OpenLdap安装及配置

    OpenLDAP 安装及配置 OpenLDAP 是一种轻量级目录访问协议(LDAP),它可以提供身份验证、授权和目录服务。...OpenLDAP 服务器提供了身份验证、授权和目录服务,可以用于身份验证、资源管理和应用程序集成。

    OpenLdap2.4各版本包

    OpenLDAP(开放轻量目录访问协议)是一种开源的目录服务,用于存储和管理网络资源的信息,如用户账户、组、网络设备等。OpenLDAP 2.4系列是其一个重要且广泛应用的版本,提供了多种功能和改进,以适应不同的操作系统...

    openldap,ldapbrowser,mozillaOrgPerson.schema

    至于`配置`,这可能指的是OpenLDAP的配置文件或相关文档,指导用户如何根据需求定制OpenLDAP服务器。 总的来说,这些资源为搭建和管理一个基于OpenLDAP的目录服务环境提供了必要的工具和信息,并且允许Thunderbird...

    Linux UNIX OpenLDAP实战指南

    OpenLDAP是一种开源的轻量级目录访问协议(Lightweight Directory Access Protocol)实现,广泛用于组织和管理分布式网络中的用户、组、资源等数据。通过深入学习本书,读者可以掌握如何在企业环境中高效地部署、...

    用GO和Vue实现管理 openLDAP 和 IM 的后台项目

    IM 集成:用户可以通过图形界面对钉钉、企业微信、飞书等 IM 平台进行集成,实现组织架构和员工信息的同步。 登录认证:用户可以通过 UKEY 实名认证或者用户名密码登录系统,提高安全性和便捷性

    Windows下OpenLDAP的安装及使用

    OpenLDAP是一种开源的轻量级目录访问协议(Lightweight Directory Access Protocol)服务器,它用于存储和管理结构化数据,如用户账号、组信息等。在Windows环境下安装OpenLDAP,可以帮助组织构建自己的身份验证和...

    PyPI 官网下载 | flask-openldap-0.0.3.tar.gz

    通过Flask-OpenLDAP,开发者可以轻松地将OpenLDAP的用户认证和权限管理功能整合到基于Flask的应用中,提升系统的安全性和可管理性。 首先,让我们了解如何获取和安装Flask-OpenLDAP。在标题中提到的是"PyPI官网下载...

    openldap 2.4.42

    9. **集成**:OpenLDAP可以与其他系统(如Samba、Postfix、Apache等)集成,提供统一的身份验证和授权服务。 10. **工具和命令行**:OpenLDAP提供了一系列实用工具,如`ldapadd`、`ldapdelete`、`ldapsearch`等,...

Global site tag (gtag.js) - Google Analytics