zoukankan      html  css  js  c++  java
  • LDAP用户验证(SpringLDAP)

    LDAP-Lightweight Directory Access Protocol。LDAP服务器可以是任何一个开源或商用的LDAP目录服务器,而客户端都可以使用同样的协议、客户端连接软件包和查询命令与LDAP服务器进行交互。

    LDAP目录是树形结构,目录有条目组成。条目是具有区别名DN(Distinguished Name)的属性(Attribute)集合,条目相当于表,DN相当于关系数据库表中的关键字(Primary Key),属性由类型(Type)和多个值(Values)组成。

    DN-Distinguished Name,区别名,具有唯一性;DC-District,所属区域;OU-Organization Unit,所属组织;CN/UID-Common Name/Unique ID 名字。

    如下图,uid-tsyroid的DN就是cn=tsyroid,ou=people,dc=syroidmanor,dc=com

    本文使用Spring-LDAP进行用户验证,下载了1.3.1版本

    applicationContex.xml配置文件

        <bean id="contextSource"  
            class="org.springframework.ldap.core.support.LdapContextSource">  
            <property name="url" value="ldap://192.168.0.22:389" />  
            <property name="base" value="dc=ygsoft,dc=com" />  
            <property name="userDn" value="whuqin@yahoo.com" />  
            <property name="password" value="1234.abcd" />
            <property name="referral" value="follow"></property>
        </bean>
      
        <bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">  
            <constructor-arg ref="contextSource" />
        </bean>  
      	
        <bean id="userDao" class="cn.com.ldap.UserDaoLdapImpl">
        	<property name="ldapTemplate">
        		<ref bean="ldapTemplate"/>
        	</property>
        </bean>

    userDn是用户区别名,格式应该为cn=xxx,ou=xxx,dc=xxx。而本文是由于公司LDAP服务器设置,使用用户的userPrincipalName进行唯一标示。注意referral要设置为follow,否则会出现异常“Unprocessed Continuation Reference(s);”,设置为follow的意思好像是自动接下处理。。。。

    UserDaoLdapImpl关键代码

        private LdapTemplate ldapTemplate;   
        private ContextSource contextSource;
        public void setLdapTemplate(LdapTemplate ldapTemplate) {   
            this.ldapTemplate = ldapTemplate;   
        }   
        public void setContextSource(ContextSource contextSource) {
        	this.contextSource = contextSource;
        }
        public boolean authenticate(String userName, String password) {
        	AndFilter filter = new AndFilter();
      	  	filter.and(new EqualsFilter("objectclass", "person")).and(new EqualsFilter("userPrincipalName", userName));
        	// Actual filter will differ depending on LDAP Server and schema
        	List<String> results = ldapTemplate.search("", filter.toString(),
        			new DnContextMapper());
        	if (results.size() != 1) return false;
         
        	DirContext ctx = null;
        	try {
        		ctx = contextSource.getContext(results.get(0), password);
        		return true;
        	} catch (Exception e) {
        		return false;
        	} finally {
        		LdapUtils.closeContext(ctx);
        	}
        }
        private final static class DnContextMapper extends
    	AbstractParameterizedContextMapper<String> {
        	@Override
        	protected String doMapFromContext(DirContextOperations ctx) {
        		return ctx.getNameInNamespace();
        	}
        }


    这样不管什么情况,都不会在控制台出现异常提示了。

  • 相关阅读:
    POJ 1401 Factorial
    POJ 2407 Relatives(欧拉函数)
    POJ 1730 Perfect Pth Powers(唯一分解定理)
    POJ 2262 Goldbach's Conjecture(Eratosthenes筛法)
    POJ 2551 Ones
    POJ 1163 The Triangle
    POJ 3356 AGTC
    POJ 2192 Zipper
    POJ 1080 Human Gene Functions
    POJ 1159 Palindrome(最长公共子序列)
  • 原文地址:https://www.cnblogs.com/whuqin/p/4982048.html
Copyright © 2011-2022 走看看