AD域验证登录

一些公司常常对开发者提出一些的问题。好比在oa系统中,要求登陆验证必须使用ad域进行登陆。还有的如登陆crm系统必须使用公司的阿里云邮箱帐号进行身份验证等等。
做为程序员咱们只能按照客户的需求进行完善系统。毕竟客户才是咱们的衣食父母,没办法拒绝。我这里就列举一些,在系统中集成ad域身份验证的一些配置信息,并一一解释他们的做用。
直接看代码:java

[java] view plain copy程序员

1.   public boolean login() {  web

2.           // 判断必填字段是否所有填写  后端

3.           if (StringUtils.isEmpty(this.username)  tomcat

4.               || StringUtils.isEmpty(this.domain)  安全

5.               || StringUtils.isEmpty(this.ip)) {  服务器

6.               logger.info("必填信息为空,LDAP链接失败!");  app

7.               return false;  dom

8.           }  this

9.           Properties env = new Properties();  

10.         String account = this.username + "@" + this.domain;  

11.         String ldapURL = "LDAP://" + this.ip + ":" + this.port;  

12.         env.put(Context.PROVIDER_URL, ldapURL);  

13.         env.put(Context.SECURITY_AUTHENTICATION, "simple");  

14.         env.put(Context.SECURITY_PRINCIPAL, account);  

15.         env.put(Context.SECURITY_CREDENTIALS, this.password);  

16.         env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");    

17.         //批量处理  

18.         env.put(Context.BATCHSIZE, "50");  

19.         // 链接超时设置  

20.         env.put("com.sun.jndi.ldap.connect.timeout", "3000");  

21.         // LDAP链接池  

22.         env.put("com.sun.jndi.ldap.connect.pool", "true");  

23.         // LDAP链接池最大数  

24.         env.put("com.sun.jndi.ldap.connect.pool.maxsize", "3");  

25.         // LDAP链接池优先数  

26.         env.put("com.sun.jndi.ldap.connect.pool.prefsize", "1");  

27.         // LDAP链接池超时  

28.         env.put("com.sun.jndi.ldap.connect.pool.timeout", "300000");  

29.         // LDAP链接池初始化数  

30.         env.put("com.sun.jndi.ldap.connect.pool.initsize", "1");  

31.         // LDAP链接池的认证方式  

32.         env.put("com.sun.jndi.ldap.connect.pool.authentication", "simple");  

33.         try {  

34.             dc = new InitialLdapContext(env, null);  

35.             logger.info("域用户" + this.username + " 登陆" + account + "成功!");  

36.             return true;  

37.         } catch (Exception e) {  

38.             logger.info("域用户" + this.username + " 登陆" + account + "失败!");  

39.             return false;  

40.         }  

41.     }  

 

 

附AD域错误解析:

LDAP error Code 及解决办法

LDAP error Code 及解决方法

  1. error code 53

  ===========================================================================

  问题:建立新用户时出现数据后端异常

  在 WebSphere Portal Express 中,您能够设置密码的最短和最长长度。若是设置的密码长度与 LDAP 服务器的策略不相同,则在建立用户时您可能会看到如下异常:

  EJPSG0015E: Data Backend Problem com.ibm.websphere.wmm.exception.WMMSystemException:

  The following Naming Exception occurred during processing:

  "javax.naming.OperationNotSupportedException: [LDAP: error code 53 - 0000052D:

  SvcErr: DSID-031A0FBC, problem 5003 (WILL_NOT_PERFORM), data 0

  ]; remaining name 'cn=see1anna,cn=users,dc=wps510,dc=rtp,dc=raleigh,dc=ibm,dc=com';

  resolved object com.sun.jndi.ldap.LdapCtx@7075b1b4".

  缘由:这是因为“密码不能知足密码策略的要求”致使

  解决方案:

  1. 打开域安全策略-安全设置-帐户策略-密码策略-密码必须符合复杂性要求。定义这个策略设置为:已禁用。/ 密码长度最小值:定义这个策略设置为0。

  2. 打开域控制器安全策略-安全设置-帐户策略-密码策略-密码必须符合复杂性要求。定义这个策略设置为:已禁用。/ 密码长度最小值:定义这个策略设置为0。

  3. 最后运行刷新组策略命令为:gpupdate /force

  ===========================================================================

  2. Need to specify class name

  ===========================================================================

  javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

  缘由:LdapContext在处理完上个环节被close(),LdapContext=null;

  解决方案:不close;

  3. error code 50

  ===========================================================================

  javax.naming.NoPermissionException: [LDAP: error code 50 - 00002098: SecErr: DSID-03150A45, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0

  4. error code 68

  ===========================================================================

  javax.naming.NameAlreadyBoundException: [LDAP: error code 68 - 00000524: UpdErr: DSID-031A0F4F, problem 6005 (ENTRY_EXISTS), data 0

  缘由:建立的用户已经存在了

  5. No trusted certificate

  ===========================================================================

  javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

  1.cas机器A,A上a,b,c服务运行良好

  2.website 位于B机器,cas能够截获请求,跳转javax.net.ssl.SSLHandshakeException

  将A上生生成的客户端密钥,导入B

  A运行

  sudo keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 3600

  $ keytool -export -trustcacerts -alias tomcat -file server.cer -keystore server.keystore -storepass changeit

  $ sudo keytool -import -trustcacerts -alias tomcat -file server.cer -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit

  B运行最后一句便可

  创建信任关系,客户,服务密钥,客户多处

  6. error code 1

  ===========================================================================

  javax.naming.NamingException: [LDAP: error code 1 - 00000000: LdapErr: DSID-0C090AE2, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, vece

  缘由:新增域用户的时候,ctx没有绑定管理员用户

  解决方法:ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, adminUser + "@" + ldapProperty.getDomain());

  ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, adminPwd);

  7. error code 50

  ==========================================================================

  javax.naming.NoPermissionException: [LDAP: error code 50 - 00000005: SecErr: DSID-03151E04, problem 4003 (INSUFF_ACCESS_RIGHTS)

  缘由:新建域用户时候,ctx绑定到一个普通用户(该用户没有新建用户的权限)

  解决方法:使用管理员用户进行绑定:

  ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, adminUser + "@" + ldapProperty.getDomain());

  ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, adminPwd);

  8. error code 19

  ==========================================================================

  javax.naming.directory.InvalidAttributeValueException: [LDAP: error code 19 - 0000052D: AtrErr: DSID-03190F00, #1:

  0: 0000052D: DSID-03190F00, problem 1005 (CONSTRAINT_ATT_TYPE)

  缘由:这个最大的多是不知足域安全策略:如密码复杂性、密码最短使用期限、强制密码历史。即长度、包含的字符、多久能够修改密码、是否可使用历史密码等。

  9. LDAP: error code 50

  ==========================================================================

  javax.naming.NoPermissionException: [LDAP: error code 50 - 00000005: SecErr: DSID-031A0F44, problem 4003 (INSUFF_ACCESS_RIGHTS)

  缘由:这个是最初代码使用的replace操做,这个在AD里对应的是密码重设(普通用户默认没有这个权限,管理员能够操做),另外remove操做时提供的旧密码错误也可能报这个异常

  10. RSA premaster secret error

  ==========================================================================

  javax.naming.CommunicationException: simple bind failed: 172.18.20.4:636 [Root exception is javax.net.ssl.SSLKeyException: RSA premaster secret error]

  缘由:Tomcat 配置的JDK与添加证书的的JDK不一致。如:证书存放路径为C:\Java\jdk1.6.0_10\jre\lib\cacerts 而Tomcat 配置的JDK为C:\Java\jre6 ,使得二者路径不一致,SSL验证的时候,找不到证书

  11.No trusted certificate found

  ==========================================================================

  javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

  缘由:信任证书库文件路径不正确

  解决方法:将正确工程中 \WEB-INF\classes目录下

  12. error code 49

  ==========================================================================

  javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece

  缘由:用户名或密码错误

相关文章
相关标签/搜索