我们知道,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>

至此配置结束完成。

CAS4.0集成OpenLdap返回用户属性相关推荐

  1. IdentityServer4实战:Token 中返回用户属性

    前言 在前几篇的学习中,生成的 Token 中只有 sub 这一个用户属性,其他的 username.email.phone等用户属性均没有包含在内.在实际项目中又常常需要从 token 中取得 用户 ...

  2. 集成OpenLDAP与Kerberos实现统一认证(三):基于SASL/GSSAPI深度集成

    文章目录 1. 写作背景 2. 既定目标 3. 重要概念 3.1 SASL 3.2 GSSAPI 3.3 SASL与GSSAPI的关系 3.4 saslauthd 3.5 Kerberos化 4. 核 ...

  3. 集成OpenLDAP与Kerberos实现统一认证(一):整合后台数据库

    文章目录 1. 写作背景 2. 既定目标 3. 环境说明 4. 安装操作 4.1 安装OpenLDAP 4.1.1 安装软件包 4.1.2 启动服务 4.1.3 初始化 4.1.4 禁止匿名访问 4. ...

  4. zabbix集成openldap认证

    环境 centos7.9 zabbix 5.0 LTS openldap zabbix服务器上运行如下命令: php -m|grep ldap #查看模块是否开启 zabbix web页面配置 LDA ...

  5. LDAP落地实战(三):GitLab集成OpenLDAP认证

    上一篇文章介绍了svn集成OpenLDAP认证,版本控制除了svn外,git目前也被越来越多的开发者所喜爱,本文将介绍GitLab如何集成openldap实现账号认证 GitLab集成OpenLDAP ...

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

    cas 3.4登录成 功返回用户更多信息. cas登录成功默认返回的只有用户名, java客户端获取: AttributePrincipal principal = (AttributePrincip ...

  7. cas4.0实现多种方式邮箱/手机号码登录及认证

    先说多种方式登录的问题,这里使用手机号码和用户名 百度了半天网上能找到的办法都试了,似乎都不好使,要不就是需要修改源码 经过反复查看cas4.0源码,发现可以配置多个身份认证器,而且可以配置多个身份认 ...

  8. openldap + samba为openldap添加smb属性----群晖synology

    为openldap添加smb属性 使用背景 安装smb,以及smbldap 提示先运行samba 提前配置/etc/samba/smb.con 配置smbldap.conf并运行smb 运行smbld ...

  9. java开源办公OA项目:通过极光SDK获取设备号绑定到用户属性

    用户需求:用户自行开发app,想通过O2OA集成的极光推送消息把O2OA的消息发送到自己的app中.前提是这个app需要集成极光的SDK. 关于集成极光SDK可以参考极光官方的文档:集成文档 获取手机 ...

最新文章

  1. java udp tcp协议_【java】TCP和UDP传输协议
  2. 头条丨2017年人工智能年报
  3. web3.js(一)根据地址查询以太数量
  4. RabbitMQ学习总结(3)——入门实例教程详解
  5. Windows中使用Python和C/C++联合开发应用程序起步
  6. HandlerInterceptor拦截器使用总结
  7. 用 Docker 构建 Serverless 应用
  8. 电脑故障速排方法-显卡篇
  9. 文献学习(part88)--Graph Learning for Multiview Clustering
  10. 程序员过关斩将--你为什么还在用存储过程?
  11. cc java开发环境搭建_Windows系统下java开发环境搭建
  12. speedtest命令行linux,Linux或者Mac下命令行speedtest测试网络速度
  13. WPF在一个窗口中实现多个视图
  14. WebStorm、HBuilder代码美化快捷键
  15. 小米2S稳定版 教你如何一键ROOT
  16. BZOJ 4008: [HNOI2015]亚瑟王
  17. 瀑布模型、迭代模型和敏捷开发
  18. 如何用html制作田字格,WPS文字怎么制作田字格 WPS文字制作田字格的方法
  19. java 字符 加密_Java 字符串的加密与解密
  20. 雅思英语作文计算机和历史,关于computer的雅思写作范文

热门文章

  1. 手把手教你做一个jsp servlet mysql实现的学生签到考勤请假管理系统附带视频开发教程和完整源码
  2. 游戏特效贴图的制作与应用
  3. 基于Web的仓库管理系统的设计与实现(论文+PPT+源码)
  4. 被骗到香港做传销!(当事人详细回忆)
  5. 肠道健康从核心菌属开始:肠道菌群的关键
  6. ESP32中继模式STA+AP共存
  7. 周鸿一传:中国互联网流氓教父的前世今生
  8. redis常用linux指令(无介绍快使用)
  9. 浙江大华嵌入式软件工程师笔试题
  10. 硬货来了,RTE2022 大会技术专场:人性化、软硬件结合