Shibbolethのセッションをもとにユーザ管理を行う

ユーザ管理機能を新たに構築し、アプリケーションへのアクセスをユーザの持つ権限により制御したい場合のパターンです。

概要図

概要図

ユーザ管理には、Shibbolethのセッション情報をもとにアクセスされたアプリケーションに対してユーザがアクセス権限を有しているかをチェックする機能が必要となります。ユーザ認証用のログイン画面は、Shibbolethが提供している認証画面を利用します。

Shibboleth SP側の設定

Apacheの設定ファイルhttpd.conf 、.htaccessあるいは、shib.conf(rpmでインストールした場合のみ)の何れかにLocationを追加することで行います。

※/etc/shibboleth/shibboleth2.xmlファイルのRequestMapper要素にtype="Native"が設定されている場合に有効です。

設定例) 「App」をShibboleth化するための設定例

<Location /App>
  AuthType shibboleth
  ShibCompatWith24 On
  ShibRequestSetting requireSession true
  Require shib-session
</Location>

 

この設定により、App下の全リソースは、Shibbolethにより認証されます。

 

処理イメージ図:初回起動時

初回起動時

 

①ブラウザからアプリケーションのURLをアクセスします。
②Shibbolethのセッション情報がないため、Shibboleth SPからShibboleth IdPの認証画面にリダイレクトされます。
③ブラウザに認証画面を表示します。
④認証画面にユーザ/パスワードを入力し、Shibboleth IdPで認証を行います。
⑤認証結果をShibboleth SPに返します。
⑥認証が成功した場合は、ユーザ管理機能でアクセスされたアプリケーションに対するユーザのアクセス権限
   をチェックします。
   権限がある場合、アプリケーションを実行し、結果をブラウザに返します。ブラウザには、Shibbolethのセッション情報
   を含むcookieが返されます。
   権限がない場合、エラー画面を表示します。
   認証が失敗した場合は、認証失敗画面を表示します。

 

処理イメージ図:SSO認証セッションが存在する場合

 

SSO認証セッションが存在する場合

①ブラウザからアプリケーションのURLをアクセスします。
②既にShibboleth認証されているユーザからのアクセスであるため、ユーザ認証は行わずにアプリケーションに対する
   アクセス権限をチェックします。
   権限がある場合、アプリケーションを実行し、結果をブラウザに返します。
   権限がない場合、エラー画面を表示します。

 

サンプルコード

サンプルコードとして、シボレス認証+アプリケーション独自のユーザー管理をする場合の対応例を示します。

アプリケーションのリソースをSPの保護下に置きます。
アプリケーションはシボレス認証情報から、アプリケーション独自のユーザー情報を取得します。
ユーザー情報のロールを検証することにより、アクセスできるコンテンツを制御します。

例では、Ruby on Rails を利用したアプリケーションを想定します。

ユーザーの権限確認は before_filter として実現し、ApplicationController のメソッドとして実装します。
ここでは、二種類の権限レベルを想定し、それらは eduPersonEntitlement 属性によって識別できるものとします。

class ApplicationController < ActionController::Base
  # 一般ユーザー権限の検証
  def require_member
    # Shibbolethの認証状態の確認
    #  このアクションが実行された時点で、Shibbolethのセッションは確立されています。
    #  必要に応じてSPの返却したパラメータを参照して権限の確認等を行います。
    #  SPの返却したパラメータは、HTTP環境変数に追加されています。
    unless /nii-member/ =~ request.env['entitlement']
      # eduPersonEntitlement に既定の値が無ければ認証エラー
      render :file => 'error/auth_error', :use_full_path => true, :status => 403
    end
  end
  
  # 管理者ユーザー権限の検証
  def require_admin
    # Shibbolethの認証状態の確認
    #  このアクションが実行された時点で、Shibbolethのセッションは確立されています。
    #  必要に応じてSPの返却したパラメータを参照して権限の確認等を行います。
    #  SPの返却したパラメータは、HTTP環境変数に追加されています。
    unless /nii-admin/ =~ request.env['entitlement']
      # eduPersonEntitlement に既定の値が無ければ認証エラー
      render :file => 'error/auth_error', :use_full_path => true, :status => 403
    end
  end
end

認証エラー画面のviewファイルは app/views/error/auth_error.html.erb に配置してください。
各コントローラでは、必要に応じて before_filter を設定します。

一般ユーザ権限でアクセスを許すコンテンツでは、require_memberメソッドを利用します。

class CommonPageController < ApplicationController
  before_filter :require_member
  
  # 以下はアクションの定義
  def some_action
    
  end
end

 管理者ユーザ権限を要求するページでは、require_adminメソッドを利用します。

class SystemPageController < ApplicationController
  before_filter :require_admin
  
  # 以下はアクションの定義
  def some_action
    
  end
end

 また、eduPersonEntitlement 属性を送信してこないユーザーに対してもアクセスを許可するコンテンツを用意する場合は、これらの before_filter を設定しません。

class OpenAccessController < ApplicationController
  def some_action
    
  end
end

 

Apache設定ファイルの編集(httpd.confに設定する場合)

/etc/httpd/conf.d/httpd.conf に下記コードを追加します。

<Location /App>
  AuthType shibboleth
  ShibCompatWith24 On
  ShibRequestSetting requireSession true
  Require shib-session
</Location>

  • ラベルがありません