業務外で作っているWebサービスで認証が必要になりました。開発環境はバックエンドがJavaサーブレット。フロントエンドはHTML5というか、JavaScript+HTMLです。最初は特にフレームワークなどは使用せず、自前で実装しようかと思ったのですが、色々なパターンの使い方を考えていくと、フレームワークを使った方がよいように思えてきたので、探してみると、「Apache Shiro」というのを見つけました。
Apache Shiroは、認証と承認という部分を扱ってくれるフレームワークで、比較的簡単に使えるAPIだとの説明です。ただ、今回、問題になってくるのは、ユーザー情報をどのように持つのか?という部分です。というのも、今回のWebサービスはデータベースにMongo DBを使っています。ところがフレームワークが対応しているのはLDAPやJDBCなどのRDB。Mongo DBはNOSQLなDBで、JDBC経由では接続できません。
何か方法がないかと、ドキュメントを読んでいくと、「Application Security With Apache Shiro」というドキュメントに次のような一文を見つけました。
引用元: Application Security With Apache Shiro ( http://www.infoq.com/articles/apache-shiro )
Shiro provides out-of-the-box Realms to connect to a number of security data sources (aka directories) such as LDAP, relational databases (JDBC), text configuration sources like INI and properties files, and more. You can plug-in your own Realm implementations to represent custom data sources if the default Realms do not meet your needs. Listing 4 below is an example of configuring Shiro (via INI) to use an LDAP directory as one of the application’s Realms.
つまり、標準で対応していなければ、カスタムRealmを作ればよい。RealmはApache Shiroにセキュリティ情報を格納しているところからデータを受け渡すためのもの。今回でいえば、Mongo DBのAPIを使って、Mongo DBのコレクションに入っている情報を取得するRealmを作ればよいということのようです。
これで認証処理実装の方向性が見えてきました。