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>
至此配置结束完成。
CAS4.0集成OpenLdap返回用户属性相关推荐
- IdentityServer4实战:Token 中返回用户属性
前言 在前几篇的学习中,生成的 Token 中只有 sub 这一个用户属性,其他的 username.email.phone等用户属性均没有包含在内.在实际项目中又常常需要从 token 中取得 用户 ...
- 集成OpenLDAP与Kerberos实现统一认证(三):基于SASL/GSSAPI深度集成
文章目录 1. 写作背景 2. 既定目标 3. 重要概念 3.1 SASL 3.2 GSSAPI 3.3 SASL与GSSAPI的关系 3.4 saslauthd 3.5 Kerberos化 4. 核 ...
- 集成OpenLDAP与Kerberos实现统一认证(一):整合后台数据库
文章目录 1. 写作背景 2. 既定目标 3. 环境说明 4. 安装操作 4.1 安装OpenLDAP 4.1.1 安装软件包 4.1.2 启动服务 4.1.3 初始化 4.1.4 禁止匿名访问 4. ...
- zabbix集成openldap认证
环境 centos7.9 zabbix 5.0 LTS openldap zabbix服务器上运行如下命令: php -m|grep ldap #查看模块是否开启 zabbix web页面配置 LDA ...
- LDAP落地实战(三):GitLab集成OpenLDAP认证
上一篇文章介绍了svn集成OpenLDAP认证,版本控制除了svn外,git目前也被越来越多的开发者所喜爱,本文将介绍GitLab如何集成openldap实现账号认证 GitLab集成OpenLDAP ...
- cas登录成功返回用户更多信息
cas 3.4登录成 功返回用户更多信息. cas登录成功默认返回的只有用户名, java客户端获取: AttributePrincipal principal = (AttributePrincip ...
- cas4.0实现多种方式邮箱/手机号码登录及认证
先说多种方式登录的问题,这里使用手机号码和用户名 百度了半天网上能找到的办法都试了,似乎都不好使,要不就是需要修改源码 经过反复查看cas4.0源码,发现可以配置多个身份认证器,而且可以配置多个身份认 ...
- openldap + samba为openldap添加smb属性----群晖synology
为openldap添加smb属性 使用背景 安装smb,以及smbldap 提示先运行samba 提前配置/etc/samba/smb.con 配置smbldap.conf并运行smb 运行smbld ...
- java开源办公OA项目:通过极光SDK获取设备号绑定到用户属性
用户需求:用户自行开发app,想通过O2OA集成的极光推送消息把O2OA的消息发送到自己的app中.前提是这个app需要集成极光的SDK. 关于集成极光SDK可以参考极光官方的文档:集成文档 获取手机 ...
最新文章
- java udp tcp协议_【java】TCP和UDP传输协议
- 头条丨2017年人工智能年报
- web3.js(一)根据地址查询以太数量
- RabbitMQ学习总结(3)——入门实例教程详解
- Windows中使用Python和C/C++联合开发应用程序起步
- HandlerInterceptor拦截器使用总结
- 用 Docker 构建 Serverless 应用
- 电脑故障速排方法-显卡篇
- 文献学习(part88)--Graph Learning for Multiview Clustering
- 程序员过关斩将--你为什么还在用存储过程?
- cc java开发环境搭建_Windows系统下java开发环境搭建
- speedtest命令行linux,Linux或者Mac下命令行speedtest测试网络速度
- WPF在一个窗口中实现多个视图
- WebStorm、HBuilder代码美化快捷键
- 小米2S稳定版 教你如何一键ROOT
- BZOJ 4008: [HNOI2015]亚瑟王
- 瀑布模型、迭代模型和敏捷开发
- 如何用html制作田字格,WPS文字怎么制作田字格 WPS文字制作田字格的方法
- java 字符 加密_Java 字符串的加密与解密
- 雅思英语作文计算机和历史,关于computer的雅思写作范文