最強のWiki「GROWI(旧crowi-plus)」で LDAP 認証を設定する

![login with LDAP](https://qiita-image-store.s3.amazonaws.com/0/41678/7e469363-6254-3fd6-9cab-0bd867d1fb15.jpeg)


crowi-plus v2.3.0 で、ついに LDAP 認証に対応した。


成果物
======

* https://github.com/weseek/growi
* (実装当時の crowi-plus 最新) https://github.com/weseek/crowi-plus/releases/tag/v2.3.0
* Docker イメージはこちら↓
    * https://hub.docker.com/r/weseek/growi/

    ```bash
    docker pull weseek/growi
    ```

* docker-compose 利用の方はこちら↓
    * https://github.com/weseek/growi-docker-compose


過去の関連記事
=============

- [最強のWiki「Crowi」のフォーク、「GROWI(旧crowi-plus)」を公開した話](https://qiita.com/yuki-takei/items/5df9601039ccfc1df01f)
- [PukiWiki の文書を Markdown に変換するワンライナー(一部 crowi-plus 仕様)](http://qiita.com/yuki-takei/items/152e20f4421333ae8fd9)
- [オフィシャル Crowi からの移行ガイド](https://github.com/weseek/crowi-plus/wiki/Migration-Guide-from-Official-Crowi)



何ができるの？
============

### 既存ユーザーの場合

まず username or E-mail でログインして、ユーザー設定ページへ。

|External Account の作成(関連付け)|
|:-:|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/41678/33d8b631-7838-0497-8808-28f61250d198.png)|

External Account の作成(関連付け)画面で Add すれば、

|External Accounts リスト|
|:-:|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/41678/ad2b9266-4d22-e544-fc31-ed7d8ec4cc1d.png)|

External Account(外部アカウント)を crowi-plus アカウントに関連付けられるよ！
これで LDAP で設定済みのユーザーID, Pass の組み合わせで crowi-plus にログインできるね。因みに付け外しはこの画面からいつでも可能。


### 新規ユーザーの場合

- ログインフォームから LDAP のユーザーID, Pass を入力すれば、自動でユーザーが作成されるよ！
    - つまり、予め「新規ユーザー登録を制限する」という設定にしておけば、**LDAP にユーザーアカウントがある人だけログイン・アカウント作成可能な Wiki を作成できる**

### 管理者から見ると

|ユーザー一覧|
|:-:|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/41678/4d82749b-9d2d-610c-3529-bba73f479efa.png)|

ユーザー一覧に「外部アカウントの管理」ボタンが追加されるので

|外部アカウント一覧|
|:-:|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/41678/d8123aad-a45b-08e1-e2c5-be24b771a6fd.png)|

ここで外部アカウントの付け外しが可能に。




設定してみよう
=============

1. 認証機構の切り替え
--------------------

管理者でログインし、Passport が選択されているかどうかをチェック。

|認証機構選択|
|:-:|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/41678/2677ef56-912d-b94e-50ec-e275f538a171.png)|

crowi-plus では v2.1.0 から [Passport](http://www.passportjs.org/) をデフォルトの認証メカニズムとして採用した。そのため、v2.1.0 以降を一から入れた人は既に選択されているはずだが、Official Crowi から移ってきた人と、v2.1.0 より前のバージョンを使っていた人はここで切り替えて「更新」。

認証メカニズムの切り替え後は要再起動。


### ***注意***

現時点で Passport authentication mechanism では Google OAuth2 authentication に対応していないので、切り替えるとユーザー名 or メアドでしかログインできなくなってしまう。(設定は消えないので、再度 Official Crowi authentication mechanism に切り替えれば利用可能)



2. 設定
--------

### 2.1 接続先設定

|LDAP Configuration|
|:-:|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/41678/61cfa184-d27e-8acc-b9db-c922949095ac.png)|

- **Use LDAP**
    - Enable に
- **Server URL**
    - `ldaps://ホスト:ポート/BaseDN` で入力
    - スキーマは ldap or ldaps
    - ポートは省略可
- **Binding Mode**
    - LDAP サーバーに接続してユーザー検索する際の挙動を以下の 2 種類から選択できる
    - Manager Bind は、予め特定の DN を設定しておき、それを用いて LDAP ユーザーを検索するモード
        - uid=admin とかに権限がある場合はこちらを選択
    - User Bind は、crowi-plus のログインフォームに入力したユーザー名から動的に DN を作成し、それを用いて LDAP ユーザーを検索するモード
- **Bind DN Password**
    - Manager Bind の場合は、ここでパスワードを入力する
        - **ただし MongoDB 内に当該 DN の平文パスワードが保存されることに注意**
    - User Bind の場合は、ログインフォームに入力されたパスワードを用いて LDAP サーバーに接続するので入力不要
        - 平文パスワードを保存しないので crowi-plus 的にはこっちがおすすめだが、LDAP 側ポリシーもあると思うのでそこはよしなに

### 2.2 フィルタ設定

- **Search Filter**
    - ユーザーをピックアップするためのフィルタ
    - `(uid={{username}})` なら、ログインフォームに入力したユーザー名が uid 属性と一致する LDAPユーザーをピックアップ
    - `(|(uid={{username}})(mail={{username}}))` なら、ログインフォームに入力したユーザー名が uid 属性または mail 属性と一致する LDAPユーザーをピックアップ
    - `(&(uid={{username}})(memberOf=cn=manager,ou=group,dc=example,dc=com))` みたいにアクセス可能なユーザーを絞るのもここでやる



3. 接続テスト
------------

|Test LDAP Account|
|:-:|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/41678/1c091ec3-2e13-c397-2b04-f162ed57d8f5.png)|

設定が正しいかどうかテストできる。
「Test」ボタンを押してもしばらくエラーメッセージが出ない場合はまず疎通を疑う。

成功メッセージが出れば、LDAP 連携は完了。




認証系の今後の TODO
==================

~~LDAP に関しては、グループフィルタの実装を早急にやる。~~ 実装しました！
https://github.com/vesse/node-ldapauth-fork

Passport は、既に Strategy が豊富にあるのが魅力的 -> http://www.passportjs.org/packages/

Google OAuth, Facebook, Twitter, Github などメジャーな OAuth Provider には対応していきたい。Public Wiki の構築が捗るはず。Slack とか Instagram も面白そうだなあ。

あとは [#193](https://github.com/weseek/growi/issues/193) をどうにかしないといけない。。
誰か実装を簡素化するいいアイディアあったら教えてください。


Contributor 募集
=================

2017年5月時点で Contributor は WESEEK, Inc. 関係者に限られていましたが、おかげさまで社外から PR をいただくことも出てきました。まだまだ Contributor 募集中です。

気軽に Issue, PR を。書いたコードは決して無駄にしない。(**今のところ塩漬けPRゼロで進んでます！**)

https://github.com/weseek/growi


導入相談乗ります
------------------

[![Chat on Slack](https://growi-slackin.weseek.co.jp/badge.svg)](https://growi-slackin.weseek.co.jp/)

ありがたいことに Slack に入ってくださるユーザーさんも、WESEEK, Inc. 以外で20名を超えました。ここでバグ報告してくださったり、導入時に引っかかった部分を相談いただくことによってバグの早期発見に繋がっています。Slack では引き続きユーザー・デベロッパー入り乱れての闊達な議論を奨励していきますので、暇な人は是非遊びに来てください。チャンネル分けてないので、general で適当につぶやいてくださって構いません。


from [WESEEK, Inc.](https://weseek.co.jp)
==================

Happy Xmas🎁