`

单点登录 - CAS【三】 LDAP认证源

 
阅读更多

一、CAS集成LDAP认证                                                                                                                                    

     1、客户端仍然使用上一篇文章中cas-test和cas-test2

     2、相关依赖的jar

           spring-ldap-1.3.1.RELEASE-all.jar

           cas-server-support-ldap-3.5.2.jar

     3、修改deployerConfigContext.xml文件

          将下面的

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

          替换为如下

     

<!-- 通过LDAP的方式检验用户 -->  
				<bean  
                    class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler">  
                    <property name="filter" value="myLoginName=%u" />  
                    <property name="searchBase" value="ou=USER,ou=ISC,o=SGCC" />   
                    <property name="contextSource"  ref="contextSource" />  
                </bean>

     并添加相应的LDAP的配置信息

  

	<!-- LDAP配置 -->
	<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
		<property name="anonymousReadOnly" value="false" />
		<property name="password" value="admin" />
		<property name="pooled" value="true" />
		<property name="urls">
			<list>
				<value>ldap://192.168.1.214:389/</value>
			</list>
		</property>
		<!-- 如果是老版本,这里应该用的是userName,而不是userDn -->
		<property name="userDn" value="cn=admin,ou=users,o=services" />
		<property name="baseEnvironmentProperties">
			<map>
				<entry>
				    <!--none 端口 389-->      
	  				<!--ssl 端口 636-->
					<key>
						<value>java.naming.security.protocol</value>
					</key>
					<value>none</value>
				</entry>
				<entry>
					<key>
						<value>java.naming.security.authentication</value>
					</key>
					<value>simple</value>
				</entry>
			</map>
		</property>
	</bean>

 

 

 

二、认证原理                                                                                                                                                    

   关键代码

    BindLdapAuthenticationHandler.java

protected final boolean authenticateUsernamePasswordInternal(final UsernamePasswordCredentials credentials) throws AuthenticationException {

        final List<String> cns = new ArrayList<String>();
        
        final SearchControls searchControls = getSearchControls();
        
        final String base = this.searchBase;
        final String transformedUsername = getPrincipalNameTransformer().transform(credentials.getUsername());
        final String filter = LdapUtils.getFilterWithValues(getFilter(), transformedUsername);
        this.getLdapTemplate().search(
            new SearchExecutor() {

                public NamingEnumeration executeSearch(final DirContext context) throws NamingException {
                    return context.search(base, filter, searchControls);
                }
            },
            new NameClassPairCallbackHandler(){

                public void handleNameClassPair(final NameClassPair nameClassPair) {
                    cns.add(nameClassPair.getNameInNamespace());
                }
            });
        
        if (cns.isEmpty()) {
            log.info("Search for " + filter + " returned 0 results.");
            return false;
        }
        if (cns.size() > 1 && !this.allowMultipleAccounts) {
            log.warn("Search for " + filter + " returned multiple results, which is not allowed.");
            return false;
        }

        for (final String dn : cns) {
            DirContext test = null;
            String finalDn = composeCompleteDnToCheck(dn, credentials);
            try {
                this.log.debug("Performing LDAP bind with credential: " + dn);
                test = this.getContextSource().getContext(
                    finalDn,
                    getPasswordEncoder().encode(credentials.getPassword()));

                if (test != null) {
                    return true;
                }
            } catch (final NamingSecurityException e) {
                log.info("Failed to authenticate user {} with error {}", credentials.getUsername(), e.getMessage());
                throw handleLdapError(e);
            } catch (final Exception e) {
                this.log.error(e.getMessage(), e);
                throw handleLdapError(e);
            } finally {
                LdapUtils.closeContext(test);
            }
        }

        return false;
    }

 

---------------------------------------------------------华丽的分割线-----------------------------------------------------------

OpenLdap安装图文说明,参看附件

  • 大小: 7 KB
  • 大小: 6.8 KB
分享到:
评论

相关推荐

    CAS5.3+windows AD域实现单点登录免身份认证.docx

    公司最近再开发一款OA产品,需要将CAS整合AD域实现免登陆。根据该文档,可以搭建初步环境。 but 最后的结果,这个方案太复杂了,公司妥协了,不需要免登陆,只需要CAS校验AD域。

    CAS整合LDAP实现单点登录学习笔记.doc

    主要包括cas服务器、cas客户端、安全证书、ldap用户认证的配置等等。学习单点登录必备

    开源多租户IDaas产品-MaxKey 单点登录认证系统 v3.5.6GA官方源代码

    谐音马克思的钥匙寓意是最大钥匙,是业界领先的IAM身份管理和认证产品,支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议,提供安全、标准和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)...

    CAS单点登录服务端部署包

    CAS 是 Central Authentication Service 的缩写 —— 中央认证服务,一种独立开放指令协议,是 Yale 大学发起的一个企业级开源项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案。 CAS 支持以下特性: CAS v1, ...

    基于用户映射的CAS单点登录

    随着信息化进一步发展,企业应用系统越来越多。...现,系统采用CAS实现统一用户认证,为用户登录多应用系统提供统一的入口,实现基于LDAP的人员组织 架构管理,并通过用户映射机制实现多应用系统的整合。

    django-cas-server:实施CAS协议3.0规范的Django Central Authentication Service服务器

    但您可以轻松使用任何源(请参阅auth.py文件中的“部分和auth类) 目录验证设定联盟设置新版本警告设置票证有效期设置票证其他设置MySQL后端设置SQL后端设置LDAP后端设置测试后端设置认证后端日志服务模式联合模式 ...

    Liferay集成CAS实现单点登录与应用系统集成

    Liferay是一个比较成熟和应用比较广泛的开源的门户平台,提供了很多现成的portlet应用,支持多种方式对应用系统的集成,并且支持对CAS、LDAP、OpenID、OpenSSO等认证系统的集成,本文将以CAS作为认证中心,以Liferay...

    MaxKey单点登录认证系统-其他

    寓意是最大钥匙,是业界领先的企业级IAM身份管理和身份认证产品,支持OAuth 2.0/OpenID Connect、SAML 2.0、JWT、CAS等标准化的开放协议,提供简单、标准、安全和开放的用户身份管理(IDM)、身份认证(AM)、单点登录...

    Windows 环境CAS 5.1.X 单点登录系统配置试验

    在Win XP 32 位本机环境,利用CAS 5.1.X,对LDAP、JDBC 认证机制的多种认证模式进行了单点 登录系统(SSO)的配置试验,并采用Java 和Python 两种客户端作了测试,同时给出了配置流程、以 及个人在20 天的配置试验...

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

    集中式认证系统(CAS,jasig组织开发的)主要用于实现单点登录。该系统常常要求连到一个集中式管理用户的LDAP服务器上。 本文描述了cas如何配置才能连上OpenLDAP。假设你的OpenLDAP已正确安装。文中的dc,读者可视...

    cas-server-5.2.5:cas-server-5.2.5

    CAS是用于Web的企业多语言单点登录解决方案,它试图成为满足身份验证和授权需求的综合平台。 CAS是一个开放且有据可查的身份验证协议。 协议的主要实现是此处托管的具有相同名称的开源Java服务器组件,并支持大量...

    spring security 参考手册中文版

    5.6.3 LDAP认证 39 5.6.4 AuthenticationProvider 41 5.6.5 UserDetailsService 41 5.6.6 LDAP认证 41 5.7多个HttpSecurity 41 5.8方法安全性 43 5.8.1 EnableGlobalMethodSecurity 43 5.8.2 ...

    cas:Apereo CAS-适用于所有人及以后的企业单一登录

    CAS是用于Web的企业多语言单点登录解决方案,它试图成为满足身份验证和授权需求的综合平台。 CAS是一个开放且有据可查的身份验证协议。 该协议的主要实现是此处托管的具有相同名称的开源Java服务器组件,并支持大量...

    spring security3.2.0

    JA-SIG Central Authentication Service (CAS,这是一个流行的开源单点登录系统) Transparent authentication context propagation for Remote Method Invocation and HttpInvoker (一个Spring远程调用协议)

    JAVA上百实例源码以及开源项目源代码

    QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...

    JAVA上百实例源码以及开源项目

     QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...

    java开源包1

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包10

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

Global site tag (gtag.js) - Google Analytics