public interface AuthenticationService { /** * Check whether a user has admin privileges or not * @param username the user's username * @return true if the user has admin privileges, false otherwise * @throws UserNotFoundException */ boolean isUserAdmin(String username) throws UserNotFoundException; /** * Check some user's credentials * @param username the user's username * @param password the user's password * @return true if the credentials are valid, false otherwise */ boolean checkUserCredentials(String username, String password); }
ตัวอย่าง class ที่ implement เรียบร้อยแล้ว
public class LdapZimbraLoginModule implements AuthenticationService { private String connection; private String ldapDN; public LdapZimbraLoginModule(String connection, String ldapDN) { super(); this.connection = connection; this.ldapDN = ldapDN; } public boolean isUserAdmin(String username) throws UserNotFoundException { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://domain:port"); env.put(Context.SECURITY_PRINCIPAL, username); env.put(Context.SECURITY_CREDENTIALS, password); try { DirContext ctx = new InitialDirContext(env); SearchControls sc = new SearchControls(); sc.setSearchScope(SearchControls.ONELEVEL_SCOPE); NamingEnumeration results = ctx.search("ou=people,dc=example,dc=com", "(zimbraIsAdminAccount=TRUE)", sc); while (results.hasMore()) { SearchResult searchResult = (SearchResult) results.next(); Attributes attributes = searchResult.getAttributes(); Attribute attr = attributes.get("uid"); if (username.trim().equals(attr.get().toString().trim())){ return true; } } ctx.close(); } catch (javax.naming.NamingException r) { } return false; } public boolean checkUserCredentials(String username, String password) { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, this.connection); env.put(Context.SECURITY_PRINCIPAL, "uid=" + username.split("@")[0] + ",ou=people," + this.ldapDN); env.put(Context.SECURITY_CREDENTIALS, password); DirContext ctx; try { ctx = new InitialDirContext(env); ctx.close(); return true; } catch (javax.naming.NamingException r) { } return false; } }
และควรจะนำไปไว้ที่
bonita-runtime-5.1/bonita-server/src/main/java/org/ow2/bonita/services/impl/
เพื่อ ความเป็นระเบียบ จากนั้นให้ build code ในส่วนของ bonita-server จะได้ไฟล์ bonita-server-5.x.jarให้นำ jar ไฟล์ที่ได้ไป deploy ที่ server ของเรา (ทับของเก่าเลยนะครับ)
TOMCAT_ROOT/lib/
** TOMCAT_ROOT คือ tomcat ที่ได้มาจากการ build ตัว console ของ bonita
จากนั้นไปแก้ไข authentication service ให้ไปเรียก class ที่เราสร้างขึ้นที่ไฟล์
TOMCAT_ROOT/conf/bonita-environment.xml
โดยแก้ไขจาก
<authentication-service class="org.ow2.bonita.services.impl.DbAuthentication" name="authentication-service">
<arg>
<string value="bonita-session:core"></string>
</arg>
</authentication-service>
ให้เป็น
<authentication-service name='authentication-service' class='org.ow2.bonita.services.impl.LdapZimbraLoginModule'>
<arg><string value='ldap://domain:port' /></arg>
<arg><string value='dc=example,dc=com' /></arg>
</authentication-service>
โดยค่า <arg> คือ parameter ที่ส่งไปยัง class LdapZimbraLoginModule
สรุปหลักการโดยคร่าวๆ คือให้สร้าง class ที่ implement AuthenticationService interface เพื่อเป็นตัว check ว่าจะ login ผ่านเมื่อใด จากนั้นแก้ไขให้ server ไปเรียกใช้ class นั้นครับ
วิธีข้างต้นเป็นวิธีที่ ดิบ+เถื่อนนะครับ เกิดจากการแกะ code แล้วแก้เอาดื้อๆ ซึ่งจริงๆแล้ว มีวิธีที่ดีกว่านี้อยู่ครับ ตามนี้เลย http://www.bonitasoft.org/forum/viewtopic.php?id=2397
ซึ่งผมอ่านแล้วไม่ค่อยเข้าใจเท่าไร
-------------------------------------------------------
thanks for @iporsut
ไม่มีความคิดเห็น:
แสดงความคิดเห็น