`

单点登录 - 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
分享到:
评论

相关推荐

    单点登入--CAS3.0

    总之,CAS3.0提供了一种实用的单点登录解决方案,它简化了用户认证流程,提高了用户体验,同时也为系统管理员提供了集中的安全管理。通过源码分析和配置实践,我们可以更深入地掌握SSO的核心技术,为构建安全、高效...

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

    CAS 5.3 及 Windows AD 域实现单点登录免身份认证 CAS(Central Authentication Service)是一种流行的开源身份验证系统,旨在提供单点登录(SSO)解决方案。Windows AD(Active Directory)则是微软公司推出的目录...

    单点登录 - CAS【一】

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,允许用户在一个系统或应用中登录后,无需再次认证即可访问其他相互信任的系统。CAS(Central Authentication Service)是 Yale 大学开发的一个开源项目...

    java LDAP+CAS单点登录

    Java LDAP+CAS单点登录是一种常见的企业级身份验证和授权解决方案。这个技术组合允许用户只需登录一次,就可以访问多个相互独立的应用系统,提高了用户体验并增强了安全性。以下是对这个主题的详细解释: **LDAP...

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

    单点登录(Single Sign-On, SSO)是一种网络身份验证技术,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。CAS(Central Authentication Service)是基于Java的开源SSO协议实现,由JA-SIG...

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

    ### CAS整合LDAP实现单点登录的关键知识点 #### 一、单点登录(SSO)概念解析 单点登录(Single Sign-On, SSO)是一种身份验证机制,它允许用户使用一组凭证(例如用户名和密码)登录一次后即可访问多个应用程序而无需...

    CAS单点登录(SSO)服务端自定义认证+CAS客户端配置+CAS完整使用文档+CAS4.2.7 cas-serv服务端源码 cas-client客户端源码

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决网络应用中的身份验证问题。本压缩包提供了CAS服务端自定义认证的实现,以及CAS客户端的配置...

    CAS单点登录demo

    CAS(Central Authentication Service)单点登录系统是一种网络身份验证协议,它允许用户通过单一的身份验证过程访问多个应用系统。在本“CAS单点登录demo”中,我们将深入探讨CAS的工作原理、配置步骤以及如何实现...

    单点登录CAS及LDAP整合的实现.doc

    单点登录(Single Sign-On, SSO)是一种网络身份验证技术,它允许用户在一个系统上登录后,无需再次输入凭证即可访问其他相互信任的系统。CAS(Central Authentication Service)是广泛应用的SSO协议的一个开源实现...

    cas-3.4.1_单点登录_CAS_

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决网络应用中的身份验证问题。在“cas-3.4.1_单点登录_CAS_”这个项目中,你将获得一个完整的CAS...

    CAS和LDAP整合

    总之,CAS和LDAP的整合是一个涉及到网络认证、目录服务和服务器配置的复杂过程,但完成之后,可以为组织提供安全、便捷的单点登录解决方案,提高用户的工作效率,同时简化IT管理员的身份验证和权限管理工作。

    django3-cas-server-3.0.0.tar.gz

    2. **CAS(Central Authentication Service)**: CAS 是一个开源的单点登录协议,它允许用户在一个地方(CAS 服务器)登录后,就可以访问多个服务而无需再次输入凭证。这样可以提高用户体验并简化安全管理。 3. **...

    开源多租户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)是一种广泛使用的开放源代码的单点登录(Single Sign-On,SSO)框架,由耶鲁大学开发并维护。SSO允许用户通过一次登录验证就能访问多个应用系统,无需在每个系统之间单独进行...

Global site tag (gtag.js) - Google Analytics