AD域验证登陆

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

[java] view plain copy

1.   public boolean login() {  

2.           // 判断必填字段是否全部填写  

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

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

5.               || StringUtils.isEmpty(this.ip)) {  

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

7.               return false;  

8.           }  

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

  原因:用户名或密码错误

 

转载于:https://my.oschina.net/u/3409039/blog/898148

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值