2016年11月11日 星期五

apacheDS custom setting and connect with user/password

那個,相信在測試的時後,一直看到 console 叫你改 admin 的密碼~
一定會覺得很煩XD...
如果是透過 studio 的話,就是在這邊,自己來改一改...

不過是說...這個server沒動設定的話,是可以匿名(就是不打user)就連上來~
一樣是感覺非常不安全....

只是,它本身就已經是整個包好的一個 jar 檔,所以只好用 java 直接改寫了~

事先要有 那包完整的 source code(嗯,就是幾十個project 的那個)
不過我也不想改他的 source,因為改了要重包,想到maven 在那邊拼命下載 update 就 覺得人生火花(台語)..好啦,其實我也不會包=.=...也不想包,包壞了debug就累死...
所以我採用外掛取代的方式。source code 是拿來抄跟比對用的(因為文件不可靠阿Q_Q)

這方法,也是 google 到的,不知道算不算爛解(那篇是寫1.5版,method 不同,但作法方向是一樣的,就不po了~),不過我覺得那方向是一個不破壞原本的內容不錯的作法。

1. 改寫 起動 bat (還沒測好前,可以先copy來用就好了,linex 就是改.sh)
apacheds-2.0.0-M23\bin\apacheds.bat
最底下一行
java %ADS_CONTROLS% %ADS_EXTENDED_OPERATIONS% -Dlog4j.configuration="file:../instances/%INSTANCE_NAME%/conf/log4j.properties" -Dapacheds.log.dir=../instances/%INSTANCE_NAME%/log -cp %ADS_CLASSPATH% org.apache.directory.server.UberjarMain ../instances/%INSTANCE_NAME% %ACTION%

把啟動的 main method 改成自訂的 ex:

java %ADS_CONTROLS% %ADS_EXTENDED_OPERATIONS% -Dlog4j.configuration="file:../instances/%INSTANCE_NAME%/conf/log4j.properties" -Dapacheds.log.dir=../instances/%INSTANCE_NAME%/log -cp %ADS_CLASSPATH% xxx.yyy.zzz.MyStart ../instances/%INSTANCE_NAME% %ACTION%


2. copy 一隻自訂的啟動 Java... MyStart
那個 Start Server 很難寫,說真的我也不會啦,但是,有提示跟有 source code...
就是copy  org.apache.directory.server.UberjarMain 一模一樣內容的就對了~
只是改 package 跟 class name ,讓 bat 是用自訂來啟動就是了...

然後找到可以插入設定的程式碼區段,我是把他加在 start 起來後~
    public void start( String instanceDirectory )  {
        InstanceLayout layout = new InstanceLayout( instanceDirectory );

        // Creating ApacheDS service
        service = new ApacheDsService();

        // Initializing the service
        try  {
            LOG.info( "Starting the service." );
            service.start( layout );

            startShutdownListener( layout );
           
            //add my custom
            custom();
        }  catch ( Exception e )  {
            LOG.error( "Failed to start the service.", e );
            stop();
            System.exit( 1 );
        }
    }

在 complire 的時後,我是直接掛 ext lib apacheds-service-2.0.0-M23.jar 上來用,萬一有些還是會對不到的,就是用 eclipse include project 進來處理。
(用 maven 去 下相依的 apachds-all 檔並沒有比較好,抓不到的 class 更多)

3. 寫 自訂的部份~
我有印一些數值,和修改一些安全性設定的部份~
取消匿名訪問,和若是admin 密碼跟預設的一樣,就自己隨便改一下~
(改密碼那段,理論上是應該用 ModificationOperation.REPLACE,不過=.=因為之前測試寫錯了,生了好幾個password 的 attr...就先殺了再建,一次解決)

        DirectoryService ds = this.service.getDirectoryService();

        ds.setAllowAnonymousAccess(false);
        //change admin pwd to avoid some issue
        Dn adminDn = ds.getDnFactory().create( ServerDNConstants.ADMIN_SYSTEM_DN );

        Entry adminEntry = ds.getAdminSession().lookup(adminDn);
        Value<?> userPassword = adminEntry.get( SchemaConstants.USER_PASSWORD_AT ).get();
        boolean needToChangeAdminPassword = Arrays.equals( PartitionNexus.ADMIN_PASSWORD_BYTES, userPassword.getBytes() );
        System.out.println("needToChangeAdminPassword="+needToChangeAdminPassword);
        if(needToChangeAdminPassword)  {
            Modification modify2 = new DefaultModification( ModificationOperation.REMOVE_ATTRIBUTE, "userPassword");
            Modification modify3 = new DefaultModification( ModificationOperation.ADD_ATTRIBUTE, "userPassword", "123456" );
            ds.getAdminSession().modify(adminDn, modify2, modify3);
            System.out.println("change the password ok.");
        }
              
4. 寫好的Java 內容包成 jar 檔,放到 apacheds-2.0.0-M23\lib 裡
基本上就是那個 lib 會有兩,原本的 apacheds-service-2.0.0-M23.jar 和 自己包的 xxxx.jar

5. 啟動測試~
連線上就改一下


測試時,可以用 studio 建 connection 來試,理論上這樣一改,原本不打user/pwd 的就不行了~只是,還沒key密碼前,server 上的 log 會長很醜就是了...


沒有留言: