วันพุธที่ 5 พฤษภาคม พ.ศ. 2553

Bonita and Ldap Configuration (Authenticate User)

Share it Please
หลังจากที่เราได้ทำ ldap module login สำหรับ bonita กันไปแล้ว ปัญหาก็ได้เกิดขึ้นอีก เนื่องจากเราต้องการ map ให้แต่ละ activity ถูกเรียกใช้งานด้วย group ที่ต่างกันเช่น

group sales เป็นผู้สร้าง Quotation ขั้นต่อไปคือการ sign Quotation ซึ่งต้องเป็น group manager

โดย bonita นั้นมี connector ที่ช่วยเราทำงานในลักษณะนี้อยู่แล้ว ซึ่งเราสามารถใส่ host, port, protocol, username, password รวมถึงกำหนด base group, base people แม้กระทั่ง time limit ก็สามารถตั้งค่าได้ แต่ดันไม่มีช่องที่ map attribute กับ username ที่ login มาให้ใส่ค่าซะงั้น

ก็ต้องมาแกะ code กันเหมือนเดิม ซึ่ง code ในส่วนนี้จะอยู่ที่ bonita-connector ปรากฏว่ามีจุดที่แปลกๆ อยู่ 2 จุดคือ
  1. ที่ method getGroupLdapConenctor ในclass LdapRoleResolver ดันมีการ set ค่า attribute ดื้อๆ เป็น hardcode ซะงั้น
  2. ที่ method getMembersSet ใน class LdapRoleResolver มีการเรียกใช้ method execute() ของ class LdapConnector ถึง 2 ครั้ง (อาจมีความตั้งใจอะไรบางอย่างแต่ผมไม่เข้าใจ)

** LdapRoleResolver และ LdapConnector อยู่ที่ bonita-connectors-5.1/ldap/src/main/java/org/bonitasoft/connectors/ldap/

 ดังนั้นจึงต้องแก้ code ใน class นี้ซะได้เป็น

method getGroupLdapConenctor (สงสัยรีบจัดเลยเขียนชื่อ method ผิด)

private LdapConnector getGroupLdapConenctor() {
 LdapConnector ldap = new LdapConnector();
 ldap.setHost(host);
 ldap.setPort(port);
 ldap.setProtocol(protocol);
 ldap.setUserName(userName);
 ldap.setPassword(password);
 //ldap.setAttributes("uniqueMember");  แก้จาก uniqueMember เป็น uid
 ldap.setAttributes("uid");
 ldap.setBaseObject(baseObjectGroup);
 ldap.setDerefAliases(derefAliases);
 ldap.setFilter(filter);
 ldap.setReferralHandling(referralHandling);
 ldap.setScope(scope);
 ldap.setSizeLimit(sizeLimit);
 ldap.setTimeLimit(timeLimit);
 return ldap;
}

และ method getMembersSet

@Override
protected Set<String> getMembersSet(String roleId) throws Exception {
 LdapConnector ldap = getGroupLdapConenctor();
     ldap.execute();

     Set<String> returns = new HashSet<String>();
     List<List<LdapAttribute>> list = ldap.getLdapAttributeList();
     if (!list.isEmpty()) {
                // comment ส่วนที่ เรียกซ้ำซ้อน (จริงๆ ไม่รู้ว่าเขาใช้ทำอะไร)
        /*List<LdapAttribute> members = list.get(0);
        StringBuilder builder = new StringBuilder();
        if (members.size() > 1) {
          builder.append("(|");
        }
        for (LdapAttribute member : members) {
          builder.append("(");
          String value = member.getValue();
          int index = value.indexOf(",");
   builder.append(value.substring(0, index));
   builder.append(")");
        }
        if (members.size() > 1) {
          builder.append(")");
        }
        ldap.setBaseObject(baseObjectPeople);
        ldap.setFilter(builder.toString());
        ldap.setAttributes("uid");
        ldap.execute();
        list = ldap.getLdapAttributeList();*/
        for (List<LdapAttribute> uids : list) {
          returns.add(uids.get(0).getValue());
        }
     }
 return returns;
}


จากนั้นต้องไปแก้ไข method executeConnector ที่ไฟล์ LdapConnector ด้วยตามนี้

if (getProtocol() == LdapProtocol.TLS) {

comment ส่วนตรวจสอบ response

      //StartTlsRequest request = new StartTlsRequest();

      //response = (StartTlsResponse) ctx.extendedOperation(request);

      //response.negotiate();

      if (getUserName() != null && getPassword() != null) {

        ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");

        ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, getUserName());

        ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, getPassword());

      }

    }

และ

    if (getProtocol() == LdapProtocol.TLS) {

      //response.close();

    }


เนื่องจากหากไม่ comment ส่วนดังกล่าวจะทำให้เกิด error ขึ้น ไม่แน่ใจว่าเกิดจาก zimbra ไม่ยอมตอบเมื่อมีการ request ไปหรือเปล่า

จากนั้นให้ build code ในส่วนนี้ ซึ่ง build แล้วจะได้ไฟล์ ldap-5.x.jar จากนั้นให้นำไฟล์ดังกล่าวไปยัดไว้ที่ studio ที่ path

BOS-5.x/studio/workspace/My Extensions/provided-libs/ldap/

แล้วค่อย export bar ไฟล์ใหม่อีกครั้ง ซึ่ง bar นี้จะสามารถ group user ได้ตามที่ตั้งค่าไว้ใน process

-----------------------------------------

thanks for @iporsut

Blogroll

About