Redmineの(なんちゃって?)SSO対応

現在利用中のRedmineですが、同一ドメインで動かしているWebアプリケーションとSingle Sign Onで運用できたらいいなあ…と思い始めました。

※ なお、Redmineも他のアプリケーションも、IDとパスワードについては同じLDAPを参照しているので、少なくとも、IDとパスワードは一元化されています。

そこで、RedmineとSSOをキーワードに検索をしてみたところ、以下の記事がヒットしました。(Redmine.org本家のフォーラムです)

Running redmine on Apache2 on Windows; using SSPI authentication; is it possible?

上記の内容では、Apacheの環境変数に入ったユーザ情報を、RemineのApplicationControllerで取得して、Sessionに格納されているUserIdの代わりに利用する、というものでした。

わたしの環境では、WindowsのSSOではなく、また、Apacheの環境変数にもユーザを識別する情報は入らないのですが、なんらかの方法でユーザIDを取得して、ここだけ修正すれば問題なさそうです。

 if session[:user_id]
# existing session
(User.find_active(session[:user_id]) rescue nil)
+elsif (forwarded_user = request.env["HTTP_X_REMOTE_USER_6E3RZQKX"])
+ # web server authentication
+ (User.find_by_login(forwarded_user) rescue nil)

elsif cookies[:autologin] && Setting.autologin?
# auto-login feature
User.find_by_autologin_key(cookies[:autologin])


Apacheの基本認証であれば request.env[“REMOTE_USER”]を指定すればいいし、Cookieなどであれば、cookies[“….”]で値を拾って処理すれば大丈夫でした。



動作としては、以下のようになりました。(Apacheの基本認証の例)




1. Redmineのログインフォームから認証済みであれば、そちらをまず利用。

2. Redmineにログインしていない場合で、Apacheの認証済みの場合、その情報を利用。



3. ただし、Apacheの認証を行っていても、Redmineのユーザ登録を行っていなければ、User.find_by_login でヒットしないため、匿名アクセス扱いになる。




どちらの認証も済んでいるのであれば、Redmine本来のセッション情報のほうが優先されます。

やってみると、少しの調整で済んだので、大変ありがたいです。


逆に、Redmineに認証済みで、その情報を他のアプリにも渡したいとなると、Redmineから他のアプリからも取得できるようなCookieをセットしてもらうとか、ユーザ情報を返すAPIを追加するとか、ちょっと面倒ですね…。



他にいろいろ(もっと良い)方法があるかと思いますので、見つかったらまた追記したいと思います。

コメント

人気の投稿