Solusi Sederhana Sign In dengan Devise Dan Casino

Sekarang ini sangat umum untuk menangani beberapa layanan yang memerlukan Central Authentication System dan fitur Single Sign In/Out. Sistem Sign in/out ini bertujuan untuk menghindari duplicate atau multiple login menggunakan satu account. sistem ini khusus diterapkan oleh website yang melayani perjudian casino secara online.

Dalam artikel ini, kami akan mencoba menjelaskan salah satu solusi sederhana namun efektif, yaitu penggunaan protokol CAS. CAS memungkinkan otentikasi dipusatkan dan sangat sesuai untuk organisasi yang sudah memiliki basis pengguna yang ada.

Untuk implementasi sebenarnya dari SSO CAS kami menggunakan ruby gem. Kita akan melihat bagaimana kita dapat mengintegrasikan ini dengan proyek yang ada dengan menggunakan Devise dan Rails 3 dan 4. Keseluruhan satu tanda pada mekanisme untuk layanan kita ditunjukkan pada gambar di bawah ini.

 

Casino

Pertama-tama mari kita bicara tentang Casino. CASino sangat mudah digunakan dalam aplikasi web Single Sign On (SSO) ditulis dengan bahasa pemograman ruby. Mendukung beberapa metode otentikasi dan backend melalui modul yang disebut Authenticators.

Mereka memberikan siap digunakan Rails 3 aplikasi bernama CASinoApp yang kami dapat Didownload dan dikonfigurasi dengan mudah dengan petunjuk yang diberikan di situs web mereka, yang mana berfungsi sebagai server otentikasi. Untuk meringkas, kita hanya perlu untuk mengkonfigurasi database authenticator untuk terhubung dengan pengguna koleksi di MongoDB (Anda dapat menggunakan ODM/ORM ) database menggunakan form email dan password di file cas.yml . Untuk contoh ini kita gunakan ketiga pihak authenticator untuk mendukung MongoDB disebut casino-moped_authenticator.

# cas.yml

development:
  frontend:
    sso_name: 'SSO Example Server'
    footer_text: 'Powered by CASino'
  authenticators:
     sso_example_database:
      authenticator: "Moped"
      options:
        database_url: "mongodb://localhost:27017/sso_example"
        collection: "users"
        username_column: "email"
        password_column: "encrypted_password"

contoh aplikasi Rails 3

Untuk mengaktifkan SSO dengan CAS dalam aplikasi saat ini menggunakan Rancangan kita menggunakan pengganti modul database_authenticatable dari rancangan yang disebut devise_cas_authenticatable.

#Gemfile
# devise_cas_authenticatable
gem 'devise_cas_authenticatable'

Setelah diinstall maka lanjut untuk mengkonfigurasi untuk menggunakannya.

Devise

#config/initializers/devise.rb
# ==> Configuration for SSO server authentication
# Url pointing to the CASino SSO server
config.cas_base_url = "http://localhost:4000"
# Tell devise_cas_authenticatable not create users if they do not exist
config.cas_create_user = false
# Instead username we use email for login field
config.cas_username_column = "email"
# After logout we use a 'destination' url to be redirected
config.cas_logout_url_param = "destination"
# The url for redirect after logout
config.cas_destination_url = "http://localhost:3000/"
# Parameter required for CASino logout to work
config.cas_destination_logout_param_name = "service"
# Enable single sign out
config.cas_enable_single_sign_out = true

Kita perlu mengkonfigurasi config/initializers/devise.rb dengan beberapa sudah dibundel konfigurasi dijelaskan dalam website mereka, kami menggunakan:

Routes

devise_for :users, :controllers => {sessions: 'devise/cas_sessions' }

Dalam config/routes.rb file kami mengkonfigurasi sesi pengguna menggunakan kontroler sesi devise_cas_authenticatable.

User model

devise :cas_authenticatable #, devise modules yang lain

Terakhir, User model harus dimodifikasi untuk menghindari otentikasi database biasa, kami mengganti modul database_authenticatable dengan cas_authenticatable

Aplikasi Rails 4

Modul devise_cas_authenticatable bekerja dengan Rails 4 tetapi masih ada beberapa masalah yang perlu diselesaikan.

Pertama-tama kita perlu mengganti Devise::CasSessionsController yang datang dengan devise_cas_authenticatable

Dalam config/routes.rb file:

devise_for :users, skip: [:sessions], controllers: { cas_sessions: 'our_cas_sessions' }

Di controllers/our_cas_sessions_controller.rb

class OurCasSessionsController < Devise::CasSessionsController # Skip redirect_to_sign_in to fix # flash message not showing up in Rails 4 # (https://github.com/nbudin/devise_cas_authenticatable/issues/81) skip_before_filter :redirect_to_sign_in, only: [:new, :destroy, :single_sign_out, :service, :unregistered] # Skip verify_signed_out_user for Devise >= 3.3.0
  skip_before_filter :verify_signed_out_user
end

Single Sign Out

Aplikasi CASino juga mendukung solusi Single Sign Out, tapi untuk ini bekerja, anda tidak dapat menggunakan mekanisme default cookie sesi, kita perlu menggunakan sesi store. Untuk sesi store kami sarankan menggunakan redis dan redis-rails dapat membantu kami dengan ini.

Untuk mengubah sesi store di aplikasi kita, edit config/initializers/session_store.rb file:

# config/initializers/session_store.rb

Rails.application.config.session_store :redis_store,
redis_server: "redis://127.0.0.1:6379/0/_sso_rails3_example_app_session"

Perhatikan bahwa kita telah menetapkan redis_server untuk digunakan dalam file initializer, yang akan diperlukan jika Anda berencana untuk menggunakan ini dalam sebuah lingkungan terdistribusi.

Untuk rel 4 kita punya masalah lain dengan devise_cas_authenticatable karena modul DeviseCasAuthenticatable::SingleSignOut tidak bekerja dengan redis store, untuk alasan itu kita melakukan sebuah fork dari proyek dan tetap yang, jadi di Gemfile kita mengubah permata untuk menggunakan fork:

# Gemfile

# Use redis to store Rails Sessions
gem 'redis-rails'
# For CAS authentication with SSO example server
gem 'devise_cas_authenticatable', git: 'https://github.com/jpamaya/devise_cas_authenticatable'

Pengujian

Untuk menguji ini Single Sign On lebih baik untuk memiliki setidaknya dua aplikasi klien yang dikonfigurasi untuk melihat Proses mekanisme Single Sign In dan Single Sign Out. Kami telah mempersiapkan tiga contoh aplikasi siap untuk Anda untuk mencoba ini sudah: satu dengan casino server ujicoba dan dua orang untuk contoh aplikasi klien, satu untuk Rails 3 dan satu lagi untuk Rails 4.