JIRA 4.1 Active Directoryとの統合

次の条件でJIRA 4.1とActive Directoryを統合するタスクを取得しました。

  1. ユーザーとグループの同期(バージョン4.1は同期をサポートしていません)
  2. 透過認証(JIRAはログインとして電子メールアドレスを使用します)
  3. ユーザープロパティの入力(電話番号)
  4. ADに含まれていないユーザーはマークする必要があります


そして、これは私がそれを解決した方法です:





このトピックは、ハブロフスク市民XoJIoDのリクエストに基づいて公開されました。そのため、プラスもあります。



JIRAセットアップ



JIRA 4.1にはLDAPと統合するための既製のメカニズムがありますが、できることはパスワードチェックのみです。 同期の話はありません。 このステップをスキップできます 将来的には、SPNEGOパスワードの検証を委託します。



そのため、管理者アカウントでJIRAに移動し、管理→システム→LDAPセクションに移動してフォームに入力します。

画像

ここで:





PartialResultExceptionエラーメッセージを受け取った場合は、グローバルカタログポート(3268)を使用してみてください。 すべてが正しく入力されると、 LDAP認証成功メッセージが表示され、以下に統合用のXMLファイルの内容が表示されます。 それをコピーし、JIRAサーバーを停止して、ファイル$ JIRA_HOME / atlassian-jira / WEB-INF / classes / osuser.xmlにあった内容をこのコンテンツに置き換えます。 この機会を利用して、Jellyスクリプトの実行も有効にしますこれを行うには、 $ JIRA_HOME / bin / setenv.shファイル (Linuxの場合)で、 JAVA_OPTSパラメーターに-Djira.jelly.on = true行を追加します。



その後、JIRAを再度実行し、ADのユーザーがそこからパスワードを使用していることを確認します。



ゼリースクリプトを作成する



最初にユーザーとグループを作成するスクリプトを生成するプログラムを作成しましたが、それを捨てるのは残念でした。 したがって、オーセンティケーターまたはサービスにグループを追加する場合(以下を参照)、このステップをスキップすることもできます。



JIRAでLDAPユーザーを作成するJellyスクリプトを生成するAtlassian Webサイトのドキュメントで、オープンソースユーティリティが見つかりました。 ただし、グループを作成する必要もあったため、 Jellyタグに関するドキュメントを用意して、この状態にこのユーティリティを追加しました。

import java.io.File; import java.io.FileReader; import java.util.Properties; import java.util.Random; import javax.naming.NamingEnumeration; import javax.naming.directory.*; import org.apache.commons.lang3.StringEscapeUtils; public class LDAPImporter { public static void main(String[] args) throws Exception { Properties properties = new Properties(); File path = new File(LDAPImporter.class.getProtectionDomain() .getCodeSource().getLocation().toURI()); if (!path.isDirectory()) { path = path.getParentFile(); } properties.load(new FileReader(new File(path, "LDAP.properties"))); properties.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory"); DirContext groupContext = new InitialDirContext(properties); SearchControls groupControls = new SearchControls(); groupControls.setReturningAttributes(new String[] { (String) properties.get("groupNameAttribute"), (String) properties.get("groupDNAttribute") }); groupControls.setSearchScope(SearchControls.SUBTREE_SCOPE); System.out.println("<JiraJelly xmlns:jira=\"jelly:com.atlassian.jira.jelly.JiraTagLib\">\n"); NamingEnumeration results = groupContext.search( (String) properties.get("baseDN"), (String) properties.get("groupFilter"), groupControls); //    (Organisation Unit') while (results != null && results.hasMoreElements()) { SearchResult result = (SearchResult) results.next(); Attribute attribute = result.getAttributes().get( (String) properties.get("groupNameAttribute")); if (attribute == null) { continue; } String groupName = (String) attribute.get(); String groupDN = (String) result.getAttributes() .get((String) properties.get("groupDNAttribute")).get(); //   System.out.println("<jira:CreateGroup group-name=\"" + StringEscapeUtils.escapeXml("[AD] " + groupName) + "\"/>\n"); DirContext userContext = new InitialDirContext(properties); SearchControls userControls = new SearchControls(); userControls.setReturningAttributes(new String[] { (String) properties.get("userLoginAttribute"), (String) properties.get("userNameAttribute"), (String) properties.get("userMailAttribute") }); userControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); NamingEnumeration users = userContext.search(groupDN, (String) properties.get("userFilter"), userControls); //      while (users != null && users.hasMoreElements()) { SearchResult user = (SearchResult) users.next(); attribute = user.getAttributes().get( (String) properties.get("userLoginAttribute")); if (attribute == null) { continue; } String userLogin = (String) attribute.get(); attribute = user.getAttributes().get( (String) properties.get("userNameAttribute")); String userName; if (attribute != null) { userName = (String) attribute.get(); } else { userName = userLogin; } attribute = user.getAttributes().get( (String) properties.get("userMailAttribute")); String userMail; if (attribute != null) { userMail = (String) attribute.get(); } else { userMail = userLogin.replace(' ', '.') + '@' + properties.get("userMailDomain"); } /* * ..     AD, *    */ String password = Integer.toHexString(new Random().nextInt()); //   System.out.println("<jira:CreateUser username=\"" + StringEscapeUtils.escapeXml(userLogin.toLowerCase()) + "\" password=\"" + password + "\" confirm=\"" + password + "\" fullname=\"" + StringEscapeUtils.escapeXml(userName) + "\" email=\"" + StringEscapeUtils.escapeXml(userMail) + "\"/>\n"); //     System.out.println("<jira:AddUserToGroup username=\"" + StringEscapeUtils.escapeXml(userLogin.toLowerCase()) + "\" group-name=\"" + StringEscapeUtils.escapeXml("[AD] " + groupName) + "\"/>\n"); } } System.out.println("</JiraJelly>"); } }
      
      





設定は、プログラムと同じディレクトリにあるLDAP.propertiesファイルから取得され、次のようになります。

 #   LDAP java.naming.provider.url=ldap://127.0.0.1:389 # DN    java.naming.security.principal=cn=test,ou=users,dc=local,dc=domain #   java.naming.security.credentials=password #  DN baseDN=ou=users,dc=local,dc=domain #     groupNameAttribute=name #   DN  groupDNAttribute=distinguishedName #   groupFilter=(objectclass=organizationalUnit) #     userLoginAttribute=mail #     (  ,  ) userNameAttribute=displayName #    e-mail  (  ,   + @ +  ) userMailAttribute=mail #   userMailDomain=local.domain #   userFilter=(objectclass=user)
      
      





この方法で取得されたスクリプトは、セクション管理→オプションと設定→Jelly RunnerのセクションでJiraにフィードされ、少し考えてからユーザーとグループを作成します。



透過的な認証



透過的な認証の概念は次のとおりです。SPNEGOユーザーを認証し、REMOTE USER変数のJIRAに既にログインしているユーザーのユーザー名を渡します。 欠点は、このスキームでは、ADに属していないユーザーはJIRAにログインできないことですが、私はそれ以上良いものを思いつきませんでした。



SPNEGO


まず、SPNEGO のパフォーマンスを確認します 。 これを行うには、 krb5.conflogin.confおよびHelloKDC.javaの 3つのファイルをダウンロードします。

[libdefaults]セクションのkrb5.confファイルに1行がありません。忘れずに入力してください。 設定を変更すると、krb5.confファイルは次のようになります。

 [libdefaults] default_realm = LOCAL.DOMAIN default_tkt_enctypes = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc default_tgs_enctypes = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc permitted_enctypes = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc [realms] LOCAL.DOMAIN = { kdc = dc5.local.domain default_domain = LOCAL.DOMAIN } [domain_realm] .LOCAL.DOMAIN = LOCAL.DOMAIN
      
      





HelloKDC.java:

 ... // Domain (pre-authentication) account final String username = "test"; // Password for the pre-auth acct. final String password = "password"; // Name of our krb5 config file final String krbfile = "krb5.conf"; // Name of our login config file final String loginfile = "login.conf"; // Name of our login module final String module = "spnego-client"; ...
      
      





HelloKDC.javaファイルをコンパイルして実行します。すべてがうまくいった場合は、大量の行を出力し、 接続テストの最後に成功します。



次に、 サポートツールユーティリティセットをダウンロードし、管理者のドメインコンピューターにインストールして、コマンドを実行します。

 setspn.exe -A HTTP/domain1 test setspn.exe -A HTTP/domain2 test ... setspn.exe -A HTTP/domainN test
      
      





どこで



SPNEGOディストリビューションをダウンロードして、 $ JIRA_HOME / libディレクトリに配置します。 ファイル$ JIRA_HOME / conf / web.xmlを開き、次の行を最後に追加します(ただし、web-appタグを閉じる前)。

 <filter> <filter-name>SpnegoHttpFilter</filter-name> <filter-class>net.sourceforge.spnego.SpnegoHttpFilter</filter-class> <init-param> <param-name>spnego.allow.basic</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>spnego.allow.localhost</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>spnego.allow.unsecure.basic</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>spnego.login.client.module</param-name> <param-value>spnego-client</param-value> </init-param> <init-param> <param-name>spnego.krb5.conf</param-name> <param-value>krb5.conf</param-value> </init-param> <init-param> <param-name>spnego.login.conf</param-name> <param-value>login.conf</param-value> </init-param> <init-param> <param-name>spnego.preauth.username</param-name> <param-value>test</param-value> </init-param> <init-param> <param-name>spnego.preauth.password</param-name> <param-value>password</param-value> </init-param> <init-param> <param-name>spnego.login.server.module</param-name> <param-value>spnego-server</param-value> </init-param> <init-param> <param-name>spnego.prompt.ntlm</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>spnego.logger.level</param-name> <param-value>1</param-value> </init-param> </filter> <filter-mapping> <filter-name>SpnegoHttpFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping>
      
      





ユーザー名とパスワードを忘れずに置き換えてください。



認証者


オーセンティケーターを作成するときが来ました。そのタスクは、SPNEGOからログインユーザーのログインを取得し、このログインにメールドメインを追加し(電子メールアドレスはJIRAログインであるため)、まだこのプロパティを持っていないユーザーの電話を含むプロパティを入力することです。 JIRA 4.xプラグイン用のSDKにはJiraOsUserAuthenticatorクラスの場所がありません。これに基づいて、オーセンティケーターが記述されます。 このクラスはすでに非推奨です。 したがって、コンパイル時にライブラリに手動で追加する必要があります。 $ JIRA_HOME / atlassian-jira / WEB-INF / classes / com / atlassian / jira / security / login /で取得できます



実際には、認証コードは次のとおりです。

 import java.security.Principal; import java.util.Properties; import java.util.Random; import javax.naming.NamingEnumeration; import javax.naming.directory.Attribute; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.atlassian.core.user.preferences.Preferences; import com.atlassian.jira.ComponentManager; import com.atlassian.jira.security.login.JiraOsUserAuthenticator; import com.atlassian.jira.user.preferences.UserPreferencesManager; import com.atlassian.jira.user.util.UserUtil; import com.opensymphony.user.Group; import com.opensymphony.user.User; @SuppressWarnings("deprecation") public class RemoteAuthenticator extends JiraOsUserAuthenticator { private static final long serialVersionUID = 1L; private UserPreferencesManager preferencesManager = ComponentManager .getInstance().getUserPreferencesManager(); //   LDAP private final String ADDRESS_NAME = "java.naming.provider.url"; private final String ADDRESS_VALUE = "ldap://127.0.0.1:389"; // DN    private final String LOGIN_NAME = "java.naming.security.principal"; private final String LOGIN_VALUE = "cn=test,ou=users,dc=local,dc=domain"; //   private final String PASSWORD_NAME = "java.naming.security.credentials"; private final String PASSWORD_VALUE = "password"; //  DN private final String BASEDN = "ou=users,dc=local,dc=domain"; //   private final String LOGIN_ATTRIBUTE = "mail"; //   (  ,  ) private final String NAME_ATTRIBUTE = "displayName"; //    (  , //   + @ +  ) private final String MAIL_ATTRIBUTE = "mail"; //   private final String PHONE_ATTRIBUTE = "telephoneNumber"; //   private final String DOMAIN = "local.domain"; @Override public Principal getUser(HttpServletRequest request, HttpServletResponse response) { Principal user = null; if (request.getSession() != null && request.getSession(). getAttribute(JiraOsUserAuthenticator.LOGGED_IN_KEY) != null) { //    user = (Principal) request.getSession().getAttribute( JiraOsUserAuthenticator.LOGGED_IN_KEY); } else { String remote = request.getRemoteUser(); if (remote != null) { //    SPNEGO if (!remote.endsWith('@' + DOMAIN)) { /* *     , *    . *      , *      */ remote += '@' + DOMAIN; } user = getUser(remote.toLowerCase()); if (user == null) { /* *       JIRA, *  */ try { user = createUser(remote.toLowerCase()); } catch (Exception exception) { exception.printStackTrace(System.err); } } else { Preferences preferences = preferencesManager .getPreferences((User) user); String phone = preferences .getString(UserUtil.META_PROPERTY_PREFIX + "mobile"); if (phone == null || phone.isEmpty()) { /* *       , *  */ try { phone = getPhone(remote.toLowerCase()); if (phone != null) { preferences.setString( UserUtil.META_PROPERTY_PREFIX + "mobile", phone); } } catch (Exception exception) { exception.printStackTrace(System.err); } } } request.getSession().setAttribute( JiraOsUserAuthenticator.LOGGED_IN_KEY, user); request.getSession().setAttribute( JiraOsUserAuthenticator.LOGGED_OUT_KEY, null); } } return user; } private User createUser(String login) throws Exception { DirContext context = null; try { Properties properties = new Properties(); properties.put(ADDRESS_NAME, ADDRESS_VALUE); properties.put(LOGIN_NAME, LOGIN_VALUE); properties.put(PASSWORD_NAME, PASSWORD_VALUE); properties.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory"); ComponentManager componentManager = ComponentManager.getInstance(); UserUtil userUtil = componentManager.getUserUtil(); context = new InitialDirContext(properties); SearchControls controls = new SearchControls(); controls.setReturningAttributes(new String[] { "distinguishedName", NAME_ATTRIBUTE, MAIL_ATTRIBUTE, PHONE_ATTRIBUTE }); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); NamingEnumeration users = context.search(BASEDN, '(' + LOGIN_ATTRIBUTE + '=' + login + ')', controls); if (users != null && users.hasMoreElements()) { /* *     ( ) *   AD */ SearchResult result = (SearchResult) users.next(); Attribute attribute = result.getAttributes() .get(NAME_ATTRIBUTE); String userName; if (attribute != null) { userName = (String) attribute.get(); } else { userName = login; } attribute = result.getAttributes().get(MAIL_ATTRIBUTE); String userMail; if (attribute != null) { userMail = (String) attribute.get(); } else { userMail = login.replace(' ', '.') + '@' + DOMAIN; } attribute = result.getAttributes().get(PHONE_ATTRIBUTE); String userPhone = null; if (attribute != null) { userPhone = ((String) attribute.get()).replace("(", "") .replace(")", ""); } String userDN = (String) result.getAttributes() .get("distinguishedName").get(); //    String userPassword = Integer.toHexString(new Random().nextInt()); //   User user = userUtil.createUserNoEvent(login, userPassword, userMail, userName); //   AD  ,   if (userPhone != null) { preferencesManager.getPreferences(user).setString( UserUtil.META_PROPERTY_PREFIX + "mobile", userPhone); } /* *     JIRA,   AD, *    */ int index = userDN.indexOf("OU=") + 3; String groupName = "[AD] " + userDN.substring(index, userDN.indexOf(',', index)); Group group = userUtil.getGroup(groupName); if (group != null) { userUtil.addUserToGroup(group, user); } return user; } else { return null; } } finally { if (context != null) { context.close(); } } } private String getPhone(String username) throws Exception { DirContext context = null; try { Properties properties = new Properties(); properties.put(ADDRESS_NAME, ADDRESS_VALUE); properties.put(LOGIN_NAME, LOGIN_VALUE); properties.put(PASSWORD_NAME, PASSWORD_VALUE); properties.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory"); context = new InitialDirContext(properties); SearchControls controls = new SearchControls(); controls.setReturningAttributes(new String[] { PHONE_ATTRIBUTE }); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); NamingEnumeration users = context.search(BASEDN, '(' + LOGIN_ATTRIBUTE + '=' + username + ')', controls); if (users != null && users.hasMoreElements()) { SearchResult result = (SearchResult) users.next(); Attribute attribute = result.getAttributes().get( PHONE_ATTRIBUTE); String userPhone = null; if (attribute != null) { userPhone = ((String) attribute.get()).replace("(", "") .replace(")", ""); } return userPhone; } else { return null; } } finally { if (context != null) { context.close(); } } } }
      
      





コンパイルし、 $ JIRA_HOME / atlassian-jira / WEB-INF / classesに入れて、ファイル$ JIRA_HOME / atlassian-jira / WEB-INF / classes / seraph-config.xmlを開き、その行を変更します

 <authenticator class="com.atlassian.jira.security.login.JiraOsUserAuthenticator"/>
      
      







 <authenticator class="RemoteAuthenticator"/>
      
      







その後、JIRAを再起動し、お気に入りのブラウザーでKerberos認証を構成して、動作することを確認できます。 非ドメインコンピューターの場合、BASIC認証ウィンドウが表示され、ログインできるようになります(ADにアカウントがある場合)。



サービス



さらに、ADとJIRAのユーザーを定期的に同期し、ADにないユーザーの名前にテキストラベルを追加するサービスが作成されました。 彼女のコードは次のとおりです。

 import java.util.Map; import java.util.Properties; import java.util.Random; import javax.naming.NamingEnumeration; import javax.naming.directory.Attribute; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import com.atlassian.configurable.ObjectConfiguration; import com.atlassian.configurable.ObjectConfigurationException; import com.atlassian.core.user.preferences.Preferences; import com.atlassian.jira.ComponentManager; import com.atlassian.jira.event.user.UserEventType; import com.atlassian.jira.service.AbstractService; import com.atlassian.jira.user.preferences.UserPreferencesManager; import com.atlassian.jira.user.util.UserUtil; import com.opensymphony.module.propertyset.PropertySet; import com.opensymphony.user.Group; import com.opensymphony.user.User; @SuppressWarnings("deprecation") public class Importer extends AbstractService implements ObjectConfiguration { //   LDAP private final String ADDRESS_NAME = "java.naming.provider.url"; private String ADDRESS_VALUE = "ldap://127.0.0.1:389"; // DN    private final String LOGIN_NAME = "java.naming.security.principal"; private String LOGIN_VALUE = "cn=test,ou=users,dc=local,dc=domain"; //   private final String PASSWORD_NAME = "java.naming.security.credentials"; private String PASSWORD_VALUE = "password"; //  DN private final String BASE_NAME = "baseDN"; private String BASE_VALUE = "ou=users,dc=local,dc=domain"; //   private final String LOGIN_ATTR_NAME = "userLoginAttribute"; private String LOGIN_ATTR_VALUE = "mail"; //   (  ,  ) private final String NAME_ATTR_NAME = "userNameAttribute"; private String NAME_ATTR_VALUE = "displayName"; //    (  ,   + @ +  // ) private final String MAIL_ATTR_NAME = "userMailAttribute"; private String MAIL_ATTR_VALUE = "mail"; //   private final String PHONE_ATTR_NAME = "userPhoneAttribute"; private String PHONE_ATTR_VALUE = "telephoneNumber"; //   private final String DOMAIN_NAME = "userMailDomain"; private String DOMAIN_VALUE = "local.domain"; //   private final String FILTER_NAME = "userFilter"; private String FILTER_VALUE = "(objectClass=user)"; // ,     private final String FIRED_STRING_NAME = "firedString"; private String FIRED_STRING_VALUE = "z_fired"; @Override public void init(PropertySet properties) throws ObjectConfigurationException { super.init(properties); for (Object keyObject : properties.getKeys()) { String key = (String) keyObject; if (key.equals(ADDRESS_NAME)) { ADDRESS_VALUE = properties.getString(key); } else if (key.equals(LOGIN_NAME)) { LOGIN_VALUE = properties.getString(key); } else if (key.equals(PASSWORD_NAME)) { PASSWORD_VALUE = properties.getString(key); } else if (key.equals(BASE_NAME)) { BASE_VALUE = properties.getString(key); } else if (key.equals(NAME_ATTR_NAME)) { NAME_ATTR_VALUE = properties.getString(key); } else if (key.equals(LOGIN_ATTR_NAME)) { LOGIN_ATTR_VALUE = properties.getString(key); } else if (key.equals(MAIL_ATTR_NAME)) { MAIL_ATTR_VALUE = properties.getString(key); } else if (key.equals(PHONE_ATTR_NAME)) { PHONE_ATTR_VALUE = properties.getString(key); } else if (key.equals(DOMAIN_NAME)) { DOMAIN_VALUE = properties.getString(key); } else if (key.equals(FILTER_NAME)) { FILTER_VALUE = properties.getString(key); } else { FIRED_STRING_VALUE = properties.getString(key); } } } @Override public ObjectConfiguration getObjectConfiguration() throws ObjectConfigurationException { return this; } @Override public void run() { try { importUsers(); checkUsers(); } catch (Exception exception) { exception.printStackTrace(); } } //    AD   JIRA private void importUsers() throws Exception { DirContext context = null; try { Properties properties = new Properties(); properties.put(ADDRESS_NAME, ADDRESS_VALUE); properties.put(LOGIN_NAME, LOGIN_VALUE); properties.put(PASSWORD_NAME, PASSWORD_VALUE); properties.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory"); ComponentManager componentManager = ComponentManager.getInstance(); UserPreferencesManager preferencesManager = componentManager .getUserPreferencesManager(); UserUtil userUtil = componentManager.getUserUtil(); context = new InitialDirContext(properties); SearchControls controls = new SearchControls(); controls.setReturningAttributes(new String[] { "distinguishedName", LOGIN_ATTR_VALUE, NAME_ATTR_VALUE, MAIL_ATTR_VALUE, PHONE_ATTR_VALUE }); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); NamingEnumeration users = context.search(BASE_VALUE, FILTER_VALUE, controls); while (users != null && users.hasMoreElements()) { SearchResult result = (SearchResult) users.next(); Attribute attribute = result.getAttributes().get( LOGIN_ATTR_VALUE); if (userUtil.getUser((String) attribute.get()) != null) { //     JIRA continue; } String login = ((String) attribute.get()).toLowerCase(); attribute = result.getAttributes().get(NAME_ATTR_VALUE); String userName; if (attribute != null) { userName = (String) attribute.get(); } else { userName = login; } attribute = result.getAttributes().get(MAIL_ATTR_VALUE); String userMail; if (attribute != null) { userMail = (String) attribute.get(); } else { userMail = login.replace(' ', '.') + '@' + DOMAIN_VALUE; } attribute = result.getAttributes().get(PHONE_ATTR_VALUE); String userPhone = null; if (attribute != null) { userPhone = ((String) attribute.get()).replace("(", "") .replace(")", ""); } String userDN = (String) result.getAttributes() .get("distinguishedName").get(); //    String userPassword = Integer.toHexString(new Random() .nextInt()); //   User user = userUtil.createUserWithEvent(login, userPassword, userMail, userName, UserEventType.USER_CREATED); if (userPhone != null) { preferencesManager.getPreferences(user).setString( UserUtil.META_PROPERTY_PREFIX + "mobile", userPhone); } /* *     JIRA, *   AD,    */ int index = userDN.indexOf("OU=") + 3; String groupName = "[AD] " + userDN.substring(index, userDN.indexOf(',', index)); Group group = userUtil.getGroup(groupName); if (group != null) { userUtil.addUserToGroup(group, user); } } } finally { if (context != null) { context.close(); } } } //     ,    AD private void checkUsers() throws Exception { DirContext context = null; try { Properties properties = new Properties(); properties.put(ADDRESS_NAME, ADDRESS_VALUE); properties.put(LOGIN_NAME, LOGIN_VALUE); properties.put(PASSWORD_NAME, PASSWORD_VALUE); properties.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory"); ComponentManager componentManager = ComponentManager.getInstance(); UserPreferencesManager preferencesManager = componentManager .getUserPreferencesManager(); UserUtil userUtil = componentManager.getUserUtil(); context = new InitialDirContext(properties); SearchControls controls = new SearchControls(); controls.setReturningAttributes(new String[] { PHONE_ATTR_VALUE }); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); for (User user : userUtil.getAllUsers()) { NamingEnumeration users = context.search(BASE_VALUE, "(&(" + LOGIN_ATTR_VALUE + '=' + user.getName() + ')' + FILTER_VALUE + ')', controls); if (users == null || !users.hasMore()) { //    AD if (!user.getFullName().startsWith(FIRED_STRING_VALUE)) { user.setFullName(FIRED_STRING_VALUE + ' ' + user.getFullName()); } } else { Preferences preferences = preferencesManager. getPreferences(user); String phone = preferences.getString( UserUtil.META_PROPERTY_PREFIX + "mobile"); if (phone == null || phone.isEmpty()) { //        try { Attribute attribute = ((SearchResult) users.next()) .getAttributes().get(PHONE_ATTR_VALUE); if (attribute != null) { phone = ((String) attribute.get()).replace("(", "").replace(")", ""); } if (phone != null) { preferences.setString( UserUtil.META_PROPERTY_PREFIX + "mobile", phone); } } catch (Exception exception) { exception.printStackTrace(System.err); } } } } } finally { if (context != null) { context.close(); } } } @Override public boolean allFieldsHidden() { return false; } @Override public String getName() { return "LDAP Importer"; } @Override public String getDescription() { return "      LDAP    ,    LDAP"; } @SuppressWarnings("rawtypes") @Override public String getDescription(Map params) { return "      LDAP    ,    LDAP"; } @Override public String[] getEnabledFieldKeys() { return new String[] { ADDRESS_NAME, LOGIN_NAME, PASSWORD_NAME, FILTER_NAME, BASE_NAME, LOGIN_ATTR_NAME, NAME_ATTR_NAME, MAIL_ATTR_NAME, PHONE_ATTR_NAME, DOMAIN_NAME, FIRED_STRING_NAME }; } @Override public String getFieldDefault(String key) throws ObjectConfigurationException { if (key.equals(ADDRESS_NAME)) { return ADDRESS_VALUE; } else if (key.equals(LOGIN_NAME)) { return LOGIN_VALUE; } else if (key.equals(PASSWORD_NAME)) { return PASSWORD_VALUE; } else if (key.equals(BASE_NAME)) { return BASE_VALUE; } else if (key.equals(NAME_ATTR_NAME)) { return NAME_ATTR_VALUE; } else if (key.equals(LOGIN_ATTR_NAME)) { return LOGIN_ATTR_VALUE; } else if (key.equals(MAIL_ATTR_NAME)) { return MAIL_ATTR_VALUE; } else if (key.equals(PHONE_ATTR_NAME)) { return PHONE_ATTR_VALUE; } else if (key.equals(DOMAIN_NAME)) { return DOMAIN_VALUE; } else if (key.equals(FILTER_NAME)) { return FILTER_VALUE; } else { return FIRED_STRING_VALUE; } } @Override public String getFieldDescription(String key) throws ObjectConfigurationException { if (key.equals(BASE_NAME)) { return "     DN"; } else if (key.equals(MAIL_ATTR_NAME)) { return "  ,   \" + @ +  \""; } else if (key.equals(FIRED_STRING_NAME)) { return "        LDAP"; } else if (key.equals(NAME_ATTR_NAME)) { return "  ,   "; } return ""; } @Override public String[] getFieldKeys() { return new String[] { ADDRESS_NAME, LOGIN_NAME, PASSWORD_NAME, FILTER_NAME, BASE_NAME, LOGIN_ATTR_NAME, NAME_ATTR_NAME, MAIL_ATTR_NAME, PHONE_ATTR_NAME, DOMAIN_NAME, FIRED_STRING_NAME }; } @Override public String getFieldName(String key) throws ObjectConfigurationException { if (key.equals(ADDRESS_NAME)) { return "  LDAP"; } else if (key.equals(LOGIN_NAME)) { return "  LDAP"; } else if (key.equals(PASSWORD_NAME)) { return "  LDAP"; } else if (key.equals(BASE_NAME)) { return " DN"; } else if (key.equals(NAME_ATTR_NAME)) { return "  "; } else if (key.equals(LOGIN_ATTR_NAME)) { return "  "; } else if (key.equals(MAIL_ATTR_NAME)) { return "  "; } else if (key.equals(PHONE_ATTR_NAME)) { return " "; } else if (key.equals(DOMAIN_NAME)) { return " "; } else if (key.equals(FILTER_NAME)) { return " "; } else { return ""; } } @Override public int getFieldType(String key) throws ObjectConfigurationException { return 0; } @SuppressWarnings("rawtypes") @Override public Map getFieldValues(String key) throws ObjectConfigurationException { return null; } @SuppressWarnings("rawtypes") @Override public void init(Map params) { } @Override public boolean isEnabled(String key) { return true; } @Override public boolean isI18NValues(String key) { return false; } }
      
      





コンパイル済みのjarファイル( JiraプラグインSDKを使用)とサービスを$ JIRA_HOME / atlassian-jira / WEB-INF / lib /に配置する必要があります。 [管理]→[システム]→[サービス]セクションでサービスを追加できます。



情報が誰かに役立つことを願っています。



All Articles