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

  緣由:用戶名或密碼錯誤

相關文章
相關標籤/搜索