LDAP- AD pwd policy

公司使用的是2008版的Active Directory。

使用java去鏈接08版的windows修改08版的AD密碼。密碼策略有如下6種:
在這裏插入圖片描述
我們需要實現的是前5種。我們使用spring-ldap去做操作訪問。

  <dependency>
      <groupId>org.springframework.ldap</groupId>
      <artifactId>spring-ldap-core</artifactId>
  </dependency>

有兩種方法:updateCredentialToAd()和change()。而reset只會校驗第4、5兩條規則(length and complexity)。changeCredentialToAd()會校驗所有5條規則!
剛開始一直使用reset密碼,history策略總是不生效,後面google後才明白,原來有change密碼功能!
上面大多數是用PHP寫的代碼,java寫的參考此處:java changePassword

public void updateCredentialToAd(String ownerId, String plainTextPassword)
        throws UnsupportedEncodingException {
        UserAD user = adUserInfoDao.getUserInfoById(ownerId);
        ProfileServiceAssert.notNull(user, ProfileServiceExceptionEnum.USER_NOT_FOUND_AD, ownerId);
        Name dn = LdapNameBuilder.newInstance(user.getDn()).build();
        Attribute newAttr = new BasicAttribute("unicodePwd",
            ("\"" + plainTextPassword + "\"").getBytes(StandardCharsets.UTF_16LE));
        ModificationItem replaceItem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, newAttr);
        ldapTemplate.modifyAttributes(dn, new ModificationItem[] {replaceItem});
    }

    public void changeCredentialToAd(String ownerId, String plainOldPassword,String plainTextPassword){
        UserAD user = adUserInfoDao.getUserInfoById(ownerId);
        ProfileServiceAssert.notNull(user, ProfileServiceExceptionEnum.USER_NOT_FOUND_AD, ownerId);
        Name dn = LdapNameBuilder.newInstance(user.getDn()).build();
        Attribute oldAttr = new BasicAttribute("unicodePwd",
                ("\"" + plainOldPassword + "\"").getBytes(StandardCharsets.UTF_16LE));
        Attribute newAttr = new BasicAttribute("unicodePwd",
                ("\"" + plainTextPassword + "\"").getBytes(StandardCharsets.UTF_16LE));
        ModificationItem removeItem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldAttr);
        ModificationItem addItem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newAttr);
        ldapTemplate.modifyAttributes(dn, new ModificationItem[] {removeItem,addItem});
    }

幾個注意點:
1.修改密碼後,AD是在10分鐘(默認)後纔會刷新,也就是說舊密碼在10分鐘內還是可以登陸使用的!如果要修改,這個就需要修改註冊表了,很麻煩。
2.修改unicodePwd是需要用ssl加密連接來修改,而userPwd

踩到的坑,花較多時間的,想吐槽的是:
1.一直沒明白password history與minimum password age 和 maximum password age關係。所以,搞了兩天沒明確把功能實現出來。問題也在於,官方文檔對這三個策略的關係沒有說完全:
Enforce password history: Enforce password history
直到看到個地方:Password Best practices在這裏插入圖片描述
才明白了maximum/minimum pwd age與history的關係:
1.min age是新密碼必須使用的時間
2.max age是密碼過期時間,過期了,密碼都會進入history
3.history 個數包含當前正在使用的密碼。比如: history=4,則包含前面過期的3個密碼+當前正在使用的密碼。

補充:

  1. 5種密碼策略,返回的異常分兩種:
//不符合密碼複雜度和長度
OperationNotSupportedException.class
//不符合minimun pwd age 和 enforce password history
InvalidAttributeValueException.class
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章