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 จุดคือ
- ที่ method getGroupLdapConenctor ในclass LdapRoleResolver ดันมีการ set ค่า attribute ดื้อๆ เป็น hardcode ซะงั้น
- ที่ 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
ไม่มีความคิดเห็น:
แสดงความคิดเห็น