#69 LDAPユーザ情報の更新について

 [Public]
icon written by shngmsw at Mar 9, 2018 2:26 PM
  Edit(Sign in)
  Stock
  Answer survey   Answer survey

  TOC

Koda様

半年ほど前から社内にKnowledgeを試験的に導入しています。
おかげさまで少しずつナレッジを共有する文化が育ちつつありますが、
要望も上がってきており、対応にあたってお知恵をお貸しいただければと思います。

現状とやりたいこと

現状

ユーザアカウントはLDAPユーザのみで運用しています。
しかし、ActiveDirectoryと社員のメールアドレスは別管理となっているため、KnowledgeDB(MongoDB)上にメールアドレスの情報が登録されておらず、メール通知機能を使用することができません。
(LDAPユーザの情報はKnowledge上から書き換えることができない仕様のため)

やりたいこと

メール通知機能を使えるようにしたい。

現在考えてる方法は、

  • KnowledgeDB(MongoDB)に登録されているLDAPユーザのレコードに対して直接メールアドレス情報をupdateし、メールアドレスを登録する
  • LDAPユーザの情報であっても書き換えられるようカスタマイズし、画面からメールアドレスを登録する

(ActiveDirectoryにメールアドレス情報を持たせるのは社内システムへの影響が大きく断念しました。)

実現性とテーブル情報が知りたい

実現性

上記のやりたいことが実現できそうか教えていただきたいです。
1つ目は、DBの値を更新するだけなので可能だとは思っていますが、アプリ上での影響がいまいち想像できないので懸念事項などあればお願いします。
2つ目は、まだソースの確認などできてないので、実現性があるかないかだけでもご教示ください。

テーブル情報

DBを触るにあたって、MongoDBのテーブル定義などがまとまっているソースファイルなどがあれば教えていただきたいです。

以上、お時間のある時にご確認いただければ幸いです。

 Attach Files     - [0]


 Comment
[Registration] Mar 12, 2018 10:33 PM [Koda]
[Update] Mar 12, 2018 10:33 PM [Koda]
icon

shngmsw さん

以下、ご質問に回答いたします。

1つ目は、DBの値を更新するだけなので可能だとは思っていますが、アプリ上での影響がいまいち想像できないので懸念事項などあればお願いします。

メールアドレスが正常な値が入るのであれば、特に影響は無いと思います。

2つ目は、まだソースの確認などできてないので、実現性があるかないかだけでもご教示ください。

たぶん、以下のコードを操作するだけで、実現可能かと思います。
https://github.com/support-project/knowledge/blob/v1/src/main/webapp/WEB-INF/views/protect/account/index.jsp

81行目の readonly="readonly" を解除

注意点は、Ldap設定のメールアドレス取得の設定(Mail Address Attribute)を空文字に設定することです。
これを指定していると、Ldapユーザはログイン時に取得したメールアドレスで、自分の情報を更新してしまいます。
このため、せっかくユーザ設定でメールアドレスを設定したにもかかわらず、そのメールアドレスをクリアしてしまう場合があります。

以上、よろしくお願いいたします。


 Like! × 0  
Collapsed
[Registration] Mar 13, 2018 7:05 PM [shngmsw]
icon

お忙しい中、ご回答ありがとうございます。

ソースの修正箇所については理解しました。対応できそうです。

注意点について、理解が正しいか確認させていただきたいのですが、
Ldap設定をこのようにしておけば、自分の情報を更新することはないということでしょうか。
(メールアドレス取得の設定というのがユーザ検索のFilterのMail Address Attributeで合ってるでしょうか)

ldap.jpg


 Like! × 0  
Collapsed
[Registration] Mar 14, 2018 8:54 PM [Koda]
icon

Ldap設定をこのようにしておけば、自分の情報を更新することはないということでしょうか。

はい。あっています。
Mail Address Attributeに何も指定しなければ、LDAPを使ってログインした際に、アカウント情報のメールアドレスを更新しません。
それをしないと、更新してしまうので、せっかくLDAPの情報以外でメールアドレスを設定してもクリアしてしまうと思います。


 Like! × 0  
Collapsed
[Registration] Apr 26, 2018 1:40 PM [shngmsw]
[Update] Apr 26, 2018 1:41 PM [shngmsw]
icon

ご回答ありがとうございます。返信がだいぶ遅くなってしまいました。

先にPostgreSQLへの移行をしようという話になりまして、

LDAPユーザの情報であっても書き換えられるようカスタマイズし、画面からメールアドレスを登録する

については進展がないのが現状です。

FireFoxの開発ツールで試しにreadonly="readonly"を外してみたのですが、そもそもLDAPユーザのアカウント情報ページには更新ボタンがないので、そこらへんもカスタマイズする必要がありそうですね。
↓のif文を無効化して、常に更新ボタンを表示させるようにすればいけそうです。
あとはサーバサイド側ですね(まだ見れてません)

<% if (!jspUtil.is(1, "authLdap")) { %>
            <button type="submit" class="btn btn-primary"><i class="fa fa-save"></i>&nbsp;<%= jspUtil.label("label.update") %></button>
<% } %>

2018-04-26_131416.jpg

誰かの参考になるのか分かりませんが進展ありましたらまた報告させていただきます。


 Like! × 2  
Collapsed
[Registration] Apr 26, 2018 2:08 PM [shngmsw]
icon

サーバサイド側の処理を少し見ていたらこんな感じでいけそうな気がします。
(チェック処理とかその他影響範囲はひとまず置いておいて)

  • knowledge\control\protect\AccountControl.java
    • 149行目
             if (StringUtils.isEmpty(user.getMailAddress())) {
                 if (StringUtils.isEmailAddress(user.getUserKey())) {
                     user.setMailAddress(user.getUserKey());
                 }
             }
             dao.update(user);
      
    • 149行目変更後
             if (!StringUtils.isEmpty(user.getMailAddress())) {
                 if (StringUtils.isEmailAddress(getParam("mailAddress"))) {
                     user.setMailAddress(getParam("mailAddress"));
                 }
             }
             // if (StringUtils.isEmpty(user.getMailAddress())) {
             //     if (StringUtils.isEmailAddress(user.getUserKey())) {
             //         user.setMailAddress(user.getUserKey());
             //     }
             // }
             dao.update(user);
      

 Like! × 2  
Collapsed
[Registration] Apr 26, 2018 11:29 PM [Koda]
icon

ご連絡ありがとうございます :bow:
LDAP設定であった場合も情報を更新したいという人にとって、大変ありがたい情報だと思います。
最近は暇がなくて、なかなか更新できていないのですが、手があいた際に、上の情報を元にLDAP接続の際にも情報を更新できるような修正を加えようかと思います。


 Like! × 1  
Collapsed
[Registration] Jun 15, 2018 7:27 PM [shngmsw]
icon

ご無沙汰しております。
業務の片手間でやってるので進捗が死ぬほど遅いのですが、
来月上旬を目途に実際に上の方法でいけるかどうか試してみる予定です。

うまくいったらこちらに何をやったのか改めてまとめて載せようと思います。


 Like! × 0  
Collapsed
[Registration] Jul 18, 2018 1:28 PM [shngmsw]
icon

[解決済み]emoji-parser-bowerリポジトリがnot foundでビルドエラー - Knowledge
にて対応していただきビルドは成功するが、画面が真っ白になる問題が解決してないのですが、
classファイルとjspファイルを直接tomcatのwebappsにデプロイすることで動作確認はできました。
最終的に改修した内容を共有致します。

/Knowledge/main/java/org/support/project/knowledge/control/protect/AccountControl.java

// 129~131行目:LDAPユーザだとreturnしてたのでここでメールアドレスを画面から取得してセットするように修正
// 修正前
            if (user.getAuthLdap() != null && user.getAuthLdap().intValue() == INT_FLAG.ON.getValue()) {
                return sendError(HttpStatus.SC_400_BAD_REQUEST, "can not edit ldap user.");
            }
// 修正後
            // LDAPユーザでもメールアドレスだけは変更できるようにする
            if (user.getAuthLdap() != null && user.getAuthLdap().intValue() == INT_FLAG.ON.getValue()) {
                if (StringUtils.isEmailAddress(getParam("mailAddress"))) {
                    user.setMailAddress(getParam("mailAddress"));
                }
//                return sendError(HttpStatus.SC_400_BAD_REQUEST, "can not edit ldap user.");
            }

// 145~152行目:不要かも?
// 修正前
            if (!StringUtils.isEmpty(getParam("password"))) {
                user.setPassword(getParam("password"));
                user.setEncrypted(false);
            }
            if (StringUtils.isEmpty(user.getMailAddress())) {
                if (StringUtils.isEmailAddress(user.getUserKey())) {
                    user.setMailAddress(user.getUserKey());
                }
            }
// 修正後
            // LDAPユーザでもメールアドレスだけは更新できるようにするため、パスワードはLDAPユーザでない場合のみ更新する
            if (user.getAuthLdap() != null && user.getAuthLdap().intValue() != INT_FLAG.ON.getValue()) {
                if (!StringUtils.isEmpty(getParam("password"))) {
                    user.setPassword(getParam("password"));
                    user.setEncrypted(false);
                }
                if (StringUtils.isEmpty(user.getMailAddress())) {
                    if (StringUtils.isEmailAddress(user.getUserKey())) {
                        user.setMailAddress(user.getUserKey());
                    }
                }
            }

// 159行目
// 修正前
        return forward("index.jsp");
// 修正後
        // 更新ボタン押下後、LDAPユーザの画面から通常ユーザの画面に切り替わってしまうため
//        return forward("index.jsp");
        return index();

/Knowledge/main/webapp/WEB-INF/views/protect/account/index.jsp

// 78~82行目:メールアドレスフォームのreadonlyを削除
// 修正前
            <div class="form-group">
                <label for="userKey"><%= jspUtil.label("knowledge.auth.label.mail") %><%= jspUtil.label("knowledge.account.info.mail") %></label>
                <input type="text" class="form-control" name="mailAddress" id="mailAddress" placeholder="<%= jspUtil.label("knowledge.auth.label.mail") %>"
                    value="<%= jspUtil.out("mailAddress") %>" readonly="readonly" />
            </div>

// 修正後
            <div class="form-group">
                <label for="userKey"><%= jspUtil.label("knowledge.auth.label.mail") %><%= jspUtil.label("knowledge.account.info.mail") %></label>
                <input type="text" class="form-control" name="mailAddress" id="mailAddress" placeholder="<%= jspUtil.label("knowledge.auth.label.mail") %>"
                    value="<%= jspUtil.out("mailAddress") %>" />
            </div>

// 122~124行目:更新ボタンをLDAPユーザでも表示
// 修正前
<% if (!jspUtil.is(1, "authLdap")) { %>
            <button type="submit" class="btn btn-primary"><i class="fa fa-save"></i>&nbsp;<%= jspUtil.label("label.update") %></button>
<% } %>

// 修正後
            <button type="submit" class="btn btn-primary"><i class="fa fa-save"></i>&nbsp;<%= jspUtil.label("label.update") %></button>

 Like! × 0  
Collapsed



 Add Comment