Thursday, December 25, 2014

それ、CMISで繋げます(Liferay編その1)

CMISは文書管理リポジトリにアクセスするための仕様ですが、「CMIS対応しているっていうけど、何ができるの?」という質問を最近ときどき頂きます。

何ができるか、という質問に対する答えは、技術的な観点に限定しても、以下の2つの要素に分解できるでしょう。
・CMIS単体で提供される、文書管理機能のセット
・CMISによるシステム間連携

CMISは、連携、あるいはデータやサービスの相互運用性(interoperability)を主眼として策定されたもので、そのために文書管理機能としてはいろんなECMの最大公約数的な機能に絞られています。そういう意味では、CMISで実際にいろいろ繋いだものをお見せするのが、CMISのメリットを理解していただく早道かと思います。
(※最大公約数とはいえ、CMISの提供する文書管理機能にもある種のクセはあるのでその点は機会があれば別途)

 Liferayと繋いでみた

というわけで初回はLiferayと繋いでみましょう。
Liferayでは、そのCMS的な機能のバックエンドとして、バージョン6.1からCMISリポジトリをサポートしています。

ここではLiferay6.2を使用して、弊社製品であるCMIS対応の文書管理リポジトリであるNemakiWareに接続してみます。
NemakiWareを使う理由なのですが、単に弊社製品だからという商売っ気だけでなく、実際にCMIS仕様の遵守率が100%で、他ECMと比較しても現時点で1位にあるからです。
http://cmissync.org/CmisCompat/

NemakiWare自体のインストール・起動はまた別途ご紹介しますが、
インストーラのダウンロード:こちら
インストール・起動方法:こちら
になります。

CMIS接続のための設定は、LiferayのWiki(英語)を参照しました。
 
 

下準備

Liferay側での下準備として、ポータルのプロパティ(portal-ext.propertiesなど、プロパティの上書き機構に準ずる)に
session.store.password=true
company.security.auth.type=screenName 
と設定します。
 
この設定では、Liferay上のログインユーザ持つスクリーン名/パスワードが、CMISリポジトリにログインするためのユーザID/パスワードと一致している必要があります。
LiferayのUIからCMISリポジトリを操作することになるので、Liferayのログインユーザ情報がCMISリポジトリのログインユーザ情報として引き渡されるためです。
もしCMISリポジトリがLDAP認証などに対応していれば、ID/PWDは簡単に統一化できるでしょう。

ここではLiferay、NemakiWareともに、admin/adminユーザでログインするものとします。

リポジトリの追加

AdminメニューのContentを開きます。

左側のペインからDocument and Mediaを開き、AddボタンのドロップダウンメニューからRepositoryを選択します。


新規に追加するリポジトリのために、設定項目を入力します。
重要なのは
RepositoryType
CMISには接続方式として、WebService、AtomPub(およびBrowser)が定義されています。ここではAtomPubが推奨されています。
AtomPub URL
AtomPubで接続する場合のコンテキストURLを入力します。おつかいのCMISリポジトリによって当然異なります。なお、このURLを開こうとするとリポジトリ全体の情報を記述したxmlファイルがダウンロードできます。NemakiWareの場合はデフォルトで
http://localhost:8080/core/atom
です。
RepositoryID
省略可能です。
CMISサーバでは、一番大きな単位としてリポジトリがあり、1つのCMISサーバは複数のリポジトリを持てることになっています。ですが実際は「メイン」リポジトリが1つだけということも珍しくありません。
この値を省略すると、CMISサーバ側で設定されているメインリポジトリが自動的に選択される仕組みになっています。





最後にもう1つ、Permissionという設定項目がありますが、これはLiferay上で、このCMISリポジトリを見られるユーザを制限するものです。CMIS側の権限設定とは関係ありません。
値にはAnyone(Guest Role), Site Members, Ownerがあります。

以上、設定できたらSaveを押したら、リポジトリの追加完了です。

Liferayのスクリーン名/パスワードがCMISリポジトリのそれと一致していない場合は、エラーになります。上手く行かない場合はCMISリポジトリ側のエラーログを見てください。

コンテンツの表示

CMISリポジトリにあるコンテンツに、LiferayのUIからアクセスできることを確認してください。
ファイルに対して、コンテキストメニュー的なものも表示されていますね。
アクションとしてCheckoutも行えるようです。

Checkout時の挙動については、CMISリポジトリごとに微妙に揺れがあるので、また次回の話題とさせていただきます。

なお、画像にもあるようにリポジトリを追加すると"Access these files offline using Liferay Sync."というメッセージが表示されます。Liferay Syncの説明はここでは省きますが、オフラインのときにした編集でもDropboxライクに同期できる仕組みです。

CMISリポジトリに限っていえば、CMISインタフェースのレベルでCmisSyncというDropboxライクな同期ツールが既に存在していますので、そちらもご検討ください。と陰に陽に自社製品をご紹介させてもらいまして、今回の結びとさせていただきます。


(文:linzhixing)

Monday, December 22, 2014

Alfresco勉強会#25でAlfrescoのアップグレードについて発表しました

こんにちは、かわべです。
12月17日に弊社オフィスで第25回Alfresco勉強会が開催されました。
寒い中ご参加いただいた皆様、ありがとうございます!

発表振り返り

今回は発表が2つありましたが、発表ごとに別の記事としています。
私はAlfrescoのアップグレードについて発表しました。
発表資料はこちら

Alfrescoのアップグレードは、コンテンツ実体(ファイルシステム)とメタデータ(データベース)のコールドバックアップデータを新しいAlfrescoに移行することで実行できます。ただし、カスタムモジュールなどが移行対象のバージョンでも期待通り動作するか、事前に検証することも大切です。
という発表の最後に、デモとして4.2.fから5.0.cへのアップグレードをお見せした…の で す が!

うまくいきませんでした…
(3回ぐらい練習したのに…)

時間を掛けた割に、ちゃんとしたものをお見せできなくてすみませんでした。
検証したところ、SQLのdumpを書き戻すときにデータベース名を指定する部分を飛ばしてしまったようです。
あのあと一旦DBをドロップして、再作成してから書き戻すとちゃんと移行できました。
勉強会が終わるまでに解決できなかったのが心残りですが、資料の手順は間違っていないはずなので参考にしてみてください。

告知1

次回のAlfresco勉強会は2015年2月18日(水)に開催予定です。
たくさんの方のご参加をお待ちしております!参加登録はこちらからお願いします。
また、「こういうテーマの発表が聞きたい」などのご意見があれば、ぜひconnpassのフィードなどでご連絡ください。

告知2

こちらは勉強会ではなく、弊社セミナーのご案内です。
2015年1月20日(火) 19時〜20時、Alfrescoの基本的な機能や使い方についての少人数セミナーを開催いたします。
(勉強会の終わりではWebinarだとお伝えしてしまいましたが、弊社オフィスで行うようです)
詳細や申し込み、お問い合わせは以下のリンクからお願いします。
基礎からわかるAlfrescoセミナー
ご都合が合えば、こちらもぜひご参加ください。

Thursday, December 18, 2014

Alfresco勉強会#25でワークフローについて話しました

とたにです。

久しぶりにAlfresco勉強会でしゃべりました。
今回はAlfrescoのワークフローについて、どういった機能が用意されているのか、また新しくワークフローを追加するにはどんな作業が必要なのかを具体的にイメージしてもらえることをゴールにして、入門レベルの内容を準備しました。

ワークフローはAlfrescoの活用方法によっては重要な位置づけとなる機能ですが一方で全く利用するつもりのない方もいるので、勉強会の題材としては少しささる人が少ない、狭い話題を選んでしまったかも、という反省をしつつこのブログを書いています。

アドバンストワークフローでは最低限必要な2つのファイルのみを作って、Alfrescoにワークフローを追加する方法について説明したのですが、説明後に「もっと簡単にワークフローを開発する方法はありますか?」という質問を頂きました。アドバンストワークフローはactivitiというBPMエンジンを採用していてプロセスの記述能力は非常に高いのですが、その反面、開発者レベルのスキルが要求されるのも事実です。このあたりは勉強会で理解いただくというアプローチのほかに、手軽に利用できるワークフローのセットを公開して選択して使っていただく、というアプローチもいいかもしれないと思いました。

また日本型ワークフロー(という言葉があるかどうかは知らないですが)では、必ず期待される機能として承認フロー上の承認者としてユーザの上司を自動でアサインしたい、というものがあり、それについても質問されたのですが、標準のAlfrescoにはそのような組織モデルが実装されていないので実現するためには、Alfresco内もしくは外部にそのような組織モデルおよび取得のサービスを実装する必要があります。

第25回Alfresco勉強会ワークフロー入門編
サンプルコードはこちら

ワークフローの開発は細かいTipsがたくさんあるので応用編として書ける内容もまだまだあるのですが、やはり少し題材として狭いので勉強会で取り上げるかは現時点では未定です。他のネタが思いつかなければ取り上げるかもしれません。

Wednesday, December 17, 2014

Alfresco 5.0とActive DirectoryでNTLM SSOを設定する

こんにちは。おおたにです。今回はActive Directory(以下AD)と連携してAlfrescoでSSOを実現する方法を紹介したいと思います。


何が実現できるのか


AlfrescoとADのSSO設定を行うと、ADで管理された端末からユーザID/パスワードを入力することなくAlfrescoにアクセスできるようになります。

端末上のWindowsにログインする際に利用した認証情報(ADによって管理されているユーザに関するもの)を利用し、Alfrescoへのアクセス時に自動的に認証を行います。認証方法としてはNTLM v1とKerberosの2種類がありますが、以下ではNTLM v1を使ったSSOの設定手順を説明します。


必要なもの


以下の説明での前提条件、事前に準備が必要なものは以下のとおりです。なお、筆者はAlfresco 5.0.b、Windows Server 2012 (AD)、Windows 7 Professional (Client)という構成で動作確認を行いました。
  • Alfresco 5.0 (3.2以上であれば基本的に同様の手順で設定可能です)
  • Active Directoryサーバ
    • サーバ名もしくはサーバIP (ここでは kate とします)
    • ドメイン名 (ここでは aegif.local とします)
    • LDAPサービスでユーザ/グループ情報の取得権限を持つユーザ名 (ここではAdministrator を使います)
    • 上記ユーザのパスワード (ここでは thepassword とします)
    • ユーザ情報格納先のベースDN (ここでは cn=Users,dc=aegif,dc=local とします)
    • グループ情報格納先のベースDN (ここでは cn=Users,dc=aegif,dc=local とします)
    • ドメインに所属するクライアントPC(テストに利用します)

Alfrescoの設定


まずAlfrescoをダウンロード、インストールします。インストーラが提供されているのでインストール自体はそんなに難しくありませんが、こちらの記事が参考になると思います。インストールが完了したら、 ブラウザで http://localhost:8080/share にアクセスし、adminユーザでログインできることを確認しておいてください。

Alfrescoが正しくインストールされたら、alfresco-global.propertiesに以下の設定を追記します。

<tomcat_dir>/shared/classes/alfresco-global.properties :
authentication.chain=passthru1:passthru,ldap-ad1:ldap-ad,alfrescoNtlm1:alfrescoNtlm
ntlm.authentication.sso.enabled=true

ldap.authentication.active=false
ldap.authentication.userNameFormat=%s@aegif.local
ldap.authentication.java.naming.provider.url=ldap://kate:389

ldap.synchronization.active=true
ldap.synchronization.java.naming.security.principal=Administrator@aegif.local
ldap.synchronization.java.naming.security.credentials=thepassword
ldap.synchronization.groupSearchBase=cn\=Users,dc\=aegif,dc\=local
ldap.synchronization.userSearchBase=cn\=Users,dc\=aegif,dc\=local
synchronization.import.cron=0 0 * * * ?

passthru.authentication.useLocalServer=false
passthru.authentication.domain=aegif.local
passthru.authentication.servers=aegif.local\\kate
passthru.authentication.defaultAdministratorUserNames=Administrator

ドメイン名、サーバ名、LDAP認証情報、ベースDN等は環境に合わせて設定してください。以下、上記設定の説明です。
  • authentication.chain でAlfrescoログインのための認証チェーンを指定します。passthruがSSO認証、ldap-adがAD認証(ユーザ/パスワード入力タイプ)、alfrescoNtlmがAlfrescoが管理するユーザ情報での認証です。認証チェーンとは、複数の認証方式を連鎖させるもので、ここでは、SSO→AD認証→Alfresco認証の順に認証をトライします。
  • ntlm.authentication.sso.enabled=true でNTLM SSOが有効になります。
  • ldap.authentication.active=false でldap-adの認証機能を無効化し、ldap.synchronization.active=true でldap-adのユーザ/グループ同期機能を有効化します。
    • ここではAD認証自体は行わず、AD上のユーザ/グループ情報をAlfrescoに同期させる(定期的に差分情報をインポートする)ことのみを行います。
  • synchronization.import.cron で同期周期を設定します。デフォルトでは1日1回0時に実行されます(上記例では毎時0分に実行されます)。
  • passthru.authentication.useLocalServer でADサーバ上でAlfrescoが稼働しているか否かを指定します。falseの場合は passthru.authentication.domain, passthru.authentication.servers を指定する必要があります。
  • passthru.authentication.defaultAdministratorUserNames にAlfrescoの管理者権限を与えたいユーザ名を列挙します。

次に、share-config-custom.xmlの設定を変更します。デフォルトでは以下のSSO向けの設定がコメントアウトされていますので、コメントアウトのタグを外して設定を有効にします。

<tomcat_dir>/shared/classes/alfresco/web-extension/share-config-custom.xml :
   <config evaluator="string-compare" condition="Remote">
      <remote>
         <keystore>
             <path>alfresco/web-extension/alfresco-system.p12</path>
             <type>pkcs12</type>
             <password>alfresco-system</password>
         </keystore>
         
         <connector>
            <id>alfrescoCookie</id>
            <name>Alfresco Connector</name>
            <description>Connects to an Alfresco instance using cookie-based authentication</description>
            <class>org.alfresco.web.site.servlet.SlingshotAlfrescoConnector</class>
         </connector>
         
         <connector>
            <id>alfrescoHeader</id>
            <name>Alfresco Connector</name>
            <description>Connects to an Alfresco instance using header and cookie-based authentication</description>
            <class>org.alfresco.web.site.servlet.SlingshotAlfrescoConnector</class>
            <userHeader>SsoUserHeader</userHeader>
         </connector>

         <endpoint>
            <id>alfresco</id>
            <name>Alfresco - user access</name>
            <description>Access to Alfresco Repository WebScripts that require user authentication</description>
            <connector-id>alfrescoCookie</connector-id>
            <endpoint-url>http://localhost:8080/alfresco/wcs</endpoint-url>
            <identity>user</identity>
            <external-auth>true</external-auth>
         </endpoint>
      </remote>
   </config>

以上でAlfrescoの設定は終わりです。設定を反映させるため、Alfrescoを再起動します。


Active Directoryサーバの設定


次に、ADサーバ上での設定を行います。AlfrescoのNTLM SSOはNTLMv1だけでNTLMv2に対応していないため、AD配下のクライアントのLAN Manager認証レベルを変更する必要があります(セキュリティレベルを落としたくない場合はKerberos認証の利用をお勧めします)。

まずは、Win+R を押して gpmc.msc を実行します。「グループポリシーの管理」コンソールが起動するので、目的のドメインのデフォルトグループポリシーを編集します。


以下のエディタが表示されるので、コンピューターの構成→ポリシー→Windowsの設定→セキュリティの設定→ローカルポリシー→セキュリティオプションをクリックし、「ネットワークセキュリティ:LAN Manager認証レベル」をダブルクリックします。


以下のダイアログが表示されるので、「このポリシーの設定を定義する」にチェックを入れて、「LMとNTLMを送信する(ネゴシエートした場合NTLMv2セッションセキュリティを使う)」を選択してOKをクリックします。


以上でADサーバ上での設定は完了です。


クライアントPCの設定


以下の設定は全てのクライアントPCで設定する必要があります。クライアントのログイン情報をAlfrescoに渡すためには、AlfrescoのURLがイントラネットゾーン判定される必要があるため、インターネットオプションのセキュリティ設定にAlfrescoのURLを追加します。

Internet Explorerのインターネットオプションを開き、ローカルイントラネットにAlfrescoのURLを追加します。HTTPでアクセスする場合は「このゾーンは…」のチェックを外します。



テストしてみよう


では、ADユーザでログインしたクライアントPCを利用し、Alfrescoにアクセスしてみましょう。先ほどイントラネットゾーンに追加したURLを使ってアクセスしてください(先のスナップショットの例ですと、http://alfresco.aegif.jp:8080/share となります)。ログイン画面が表示されず、直接ダッシュボード画面が表示されればテスト成功です。


トラブルシューティング



うまくいかない場合は以下のことを試してみてください。
  • alfresco.log, catalina.out等に出力されているExceptionを確認してみる
  • ユーザ/グループの同期が正常に行われているか(AD上のユーザ/グループがAlfresco上にも生成されているか)を確認してみる
  • LDAPクライアントを使ってユーザ/グループの検索ベースDNを実際に確認してみる
  • passthru.authentication.domain, passthru.authentication.servers あたりのプロパティ値から.localを省略してみる

今回の紹介は以上です。AD環境がある場合は是非ADとの連携、SSO設定を試してみてください。

Wednesday, December 10, 2014

CmisSync on Raspberry Pi: The Internet of Things meets document management

Raspberry Pi is a tiny board (the size of a credit card) that allows you to create any kind of robot or fun hardware:


Examples:
- Santa detectors
- Sandwich carriers
- Ultra-cheap laptops (UNICEF)
- Industrial robots
- Audit sensors

And guess what? CmisSync runs on Raspberry Pi!
CmisSync is a file synchronization tool compatible with any document management server (Alfresco/SharePoint/FileNet/Documentum/etc) thanks to the CMIS protocol.
Imagine for instance a tiny sensor measuring air pollution and sending a weekly report directly to your document server over Wi-Fi.

A South African company is already embedding CmisSync in office scanners, so that scanned documents get automatically synchronized to Alfresco or another ECM server:




Compare that with the pain it is to achieve the same thing using a normal scanner, and you can easily feel the need for such intelligent hardware based on open standards.

Raspberry Pi + CmisSync can also be used in environments with no permanent network connection, for instance fleets of trucks travelling in uncovered areas and sending reports (load/unload/sleep) when network becomes available. CmisSync makes the Internet of Things survive Internet cuts.
Nicolas Raoul