Ruby on Railsとgoldbergで、ウェブサイトにアクセス権限管理機能を10分で付ける

RailsのサイトのWikiとかSWiKとかでRoRで使えるgeneratorがいろいろあって試してみると面白い。自分の用途にそのままでは使えなくてもその仕組みは結構勉強になるのでけっこうよいよ。


で、よくwebサイト作るときに困るのが複雑なアクセス権限管理や、ユーザの作成(もちろんメールによるユーザの検証)、ログイン、ログアウト、それにパスワードなくした人対応など、結構たくさんの機能を作りこまないといけない。そうなると、他の機能は結構出来てても、ユーザ管理系の機能が出来るまではまったくもってサイトとして機能しないなんて事になります。なりました。そういうときに使えそう。


goldbergを使うとRailsを使ったアプリにXOOPSみたいなCMSで良く見かけるユーザ管理、ユーザのグループ化、グループ毎にアクセス権限設定といった機能があっという間に出来ます。しかもインストールは5分ぐらいじゃないかな。あと仕組みを理解するのに4分、設定に1分ぐらいw


そして、goldbergのすごいところは、その柔軟さ。管理したいControllerとActionをGUIで追加するだけでユーザ管理が出来ちゃうという仕組み。


インストール方法
インストールもまったく難しくないですが一応

gem install goldberg_generator
・・・
普通にRailsプロジェクトを作成
・・・
cd /(プロジェクトのルート)/
script/generate goldberg テンプレート

テンプレートは

default: the old-style Goldberg blue layout.
ewnf: “Earth Wind and Fire”—a colourful fixed-width layout with a dynamic vertical menu on the left.
snooker: “Snooker”—an easy to customise fluid layout with a dynamic menu across the top and a 200 pixel fixed-width right column.
spoiled_brat: “Spoiled Brat”—an attractive fluid layout with a dynamic vertical menu on the right.

のなかから選べる。ひとまずeasy to customiseという言葉だけでSnookerを選択してみた。

C:\{rails_project_root}>ruby script/generate goldberg ewnf
create vendor/plugins/goldberg
create vendor/plugins/goldberg/init.rb
create vendor/plugins/goldberg/lib
create vendor/plugins/goldberg/lib/goldberg.rb
create vendor/plugins/goldberg/lib/goldberg_controller.rb
create vendor/plugins/goldberg/lib/goldberg_filters.rb
create vendor/plugins/goldberg/lib/goldberg_helper.rb
create vendor/plugins/goldberg/lib/goldberg_migration.rb
create vendor/plugins/goldberg/lib/goldberg_model.rb
create vendor/plugins/goldberg/lib/goldberg_routes.rb
create vendor/plugins/goldberg/tasks
create vendor/plugins/goldberg/tasks/goldberg_tasks.rake
create vendor/plugins/goldberg/app
create vendor/plugins/goldberg/app/controllers
create vendor/plugins/goldberg/app/controllers/goldberg
create vendor/plugins/goldberg/app/controllers/goldberg/auth_controller.rb
create vendor/plugins/goldberg/app/controllers/goldberg/content_pages_controller.rb
create vendor/plugins/goldberg/app/controllers/goldberg/controller_actions_controller.rb
create vendor/plugins/goldberg/app/controllers/goldberg/menu_items_controller.rb
create vendor/plugins/goldberg/app/controllers/goldberg/permissions_controller.rb
create vendor/plugins/goldberg/app/controllers/goldberg/roles_controller.rb
create vendor/plugins/goldberg/app/controllers/goldberg/roles_permissions_controller.rb
create vendor/plugins/goldberg/app/controllers/goldberg/site_controllers_controller.rb
create vendor/plugins/goldberg/app/controllers/goldberg/system_settings_controller.rb
create vendor/plugins/goldberg/app/controllers/goldberg/users_controller.rb
exists vendor/plugins/goldberg/app
create vendor/plugins/goldberg/app/helpers
create vendor/plugins/goldberg/app/helpers/goldberg
create vendor/plugins/goldberg/app/helpers/goldberg/auth_helper.rb
create vendor/plugins/goldberg/app/helpers/goldberg/content_pages_helper.rb
create vendor/plugins/goldberg/app/helpers/goldberg/controller_actions_helper.rb
create vendor/plugins/goldberg/app/helpers/goldberg/menu_items_helper.rb
create vendor/plugins/goldberg/app/helpers/goldberg/permissions_helper.rb
create vendor/plugins/goldberg/app/helpers/goldberg/roles_helper.rb
create vendor/plugins/goldberg/app/helpers/goldberg/roles_permissions_helper.rb
create vendor/plugins/goldberg/app/helpers/goldberg/site_controllers_helper.rb
create vendor/plugins/goldberg/app/helpers/goldberg/system_settings_helper.rb
create vendor/plugins/goldberg/app/helpers/goldberg/users_helper.rb
exists vendor/plugins/goldberg/app
create vendor/plugins/goldberg/app/models
create vendor/plugins/goldberg/app/models/goldberg
create vendor/plugins/goldberg/app/models/goldberg/content_page.rb
create vendor/plugins/goldberg/app/models/goldberg/controller_action.rb
create vendor/plugins/goldberg/app/models/goldberg/credentials.rb
create vendor/plugins/goldberg/app/models/goldberg/menu_item.rb
create vendor/plugins/goldberg/app/models/goldberg/menu.rb
create vendor/plugins/goldberg/app/models/goldberg/permission.rb
create vendor/plugins/goldberg/app/models/goldberg/role.rb
create vendor/plugins/goldberg/app/models/goldberg/roles_permission.rb
create vendor/plugins/goldberg/app/models/goldberg/site_controller.rb
create vendor/plugins/goldberg/app/models/goldberg/system_settings.rb
create vendor/plugins/goldberg/app/models/goldberg/user.rb
create vendor/plugins/goldberg/app/models/goldberg/user_mailer.rb
exists vendor/plugins/goldberg/app
create vendor/plugins/goldberg/app/views
create vendor/plugins/goldberg/app/views/goldberg
create vendor/plugins/goldberg/app/views/goldberg/auth
create vendor/plugins/goldberg/app/views/goldberg/auth/login.rhtml
create vendor/plugins/goldberg/app/views/goldberg/auth/logout.rhtml
create vendor/plugins/goldberg/app/views/goldberg/auth/_login.rhtml
create vendor/plugins/goldberg/app/views/goldberg/content_pages
create vendor/plugins/goldberg/app/views/goldberg/content_pages/edit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/content_pages/_fck_create_folder.rxml
create vendor/plugins/goldberg/app/views/goldberg/content_pages/_fck_files.rxml
create vendor/plugins/goldberg/app/views/goldberg/content_pages/fck_speller_pages.rhtml
create vendor/plugins/goldberg/app/views/goldberg/content_pages/_form.rhtml
create vendor/plugins/goldberg/app/views/goldberg/content_pages/list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/content_pages/new.rhtml
create vendor/plugins/goldberg/app/views/goldberg/content_pages/show.rhtml
create vendor/plugins/goldberg/app/views/goldberg/content_pages/view_default.rhtml
create vendor/plugins/goldberg/app/views/goldberg/content_pages/view.rhtml
create vendor/plugins/goldberg/app/views/goldberg/controller_actions
create vendor/plugins/goldberg/app/views/goldberg/controller_actions/edit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/controller_actions/_form.rhtml
create vendor/plugins/goldberg/app/views/goldberg/controller_actions/list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/controller_actions/new.rhtml
create vendor/plugins/goldberg/app/views/goldberg/controller_actions/show.rhtml
create vendor/plugins/goldberg/app/views/goldberg/layouts
create vendor/plugins/goldberg/app/views/goldberg/layouts/_tabpanel_js.rhtml
create vendor/plugins/goldberg/app/views/goldberg/layouts/_tabpanel_list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/menu_items
create vendor/plugins/goldberg/app/views/goldberg/menu_items/edit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/menu_items/_form.rhtml
create vendor/plugins/goldberg/app/views/goldberg/menu_items/_item_list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/menu_items/_item_parent_list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/menu_items/list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/menu_items/new.rhtml
create vendor/plugins/goldberg/app/views/goldberg/menu_items/show.rhtml
create vendor/plugins/goldberg/app/views/goldberg/menu_items/_suckerfish.rhtml
create vendor/plugins/goldberg/app/views/goldberg/menu_items/_breadcrumbs.rhtml
create vendor/plugins/goldberg/app/views/goldberg/menu_items/_menubar.rhtml
create vendor/plugins/goldberg/app/views/goldberg/permissions
create vendor/plugins/goldberg/app/views/goldberg/permissions/edit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/permissions/_form.rhtml
create vendor/plugins/goldberg/app/views/goldberg/permissions/list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/permissions/new.rhtml
create vendor/plugins/goldberg/app/views/goldberg/permissions/show.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles
create vendor/plugins/goldberg/app/views/goldberg/roles/edit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles/_form.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles/list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles/new.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles/show.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles_permissions
create vendor/plugins/goldberg/app/views/goldberg/roles_permissions/edit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles_permissions/_form.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles_permissions/list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles_permissions/new_permission_for_role.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles_permissions/new.rhtml
create vendor/plugins/goldberg/app/views/goldberg/roles_permissions/show.rhtml
create vendor/plugins/goldberg/app/views/goldberg/site_controllers
create vendor/plugins/goldberg/app/views/goldberg/site_controllers/edit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/site_controllers/_form.rhtml
create vendor/plugins/goldberg/app/views/goldberg/site_controllers/list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/site_controllers/_list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/site_controllers/new.rhtml
create vendor/plugins/goldberg/app/views/goldberg/site_controllers/show.rhtml
create vendor/plugins/goldberg/app/views/goldberg/system_settings
create vendor/plugins/goldberg/app/views/goldberg/system_settings/edit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/system_settings/_form.rhtml
create vendor/plugins/goldberg/app/views/goldberg/system_settings/list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/system_settings/new.rhtml
create vendor/plugins/goldberg/app/views/goldberg/system_settings/show.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users
create vendor/plugins/goldberg/app/views/goldberg/users/confirm_registration.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/confirm_registration_submit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/create.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/forgot_password.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/forgot_password_submit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/edit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/_form.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/list.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/new.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/reset_password.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/reset_password_submit.rhtml
create vendor/plugins/goldberg/app/views/goldberg/users/show.rhtml
create vendor/plugins/goldberg/app/views/goldberg/user_mailer
create vendor/plugins/goldberg/app/views/goldberg/user_mailer/confirmation_request.rhtml
create vendor/plugins/goldberg/app/views/goldberg/user_mailer/reset_password.rhtml
create vendor/plugins/goldberg/app/views/goldberg/user_mailer/reset_password_request.rhtml
create vendor/plugins/goldberg/db
create vendor/plugins/goldberg/db/migrate
create vendor/plugins/goldberg/db/migrate/001_initial_setup.rb
create vendor/plugins/goldberg/db/migrate/002_menu_rest_items_users_cached_content_pages.rb
create vendor/plugins/goldberg/db/migrate/003_self_registration.rb
create vendor/plugins/goldberg/db/ContentPage.yml
create vendor/plugins/goldberg/db/ControllerAction.yml
create vendor/plugins/goldberg/db/MenuItem.yml
create vendor/plugins/goldberg/db/Permission.yml
create vendor/plugins/goldberg/db/Role.yml
create vendor/plugins/goldberg/db/RolesPermission.yml
create vendor/plugins/goldberg/db/SiteController.yml
create vendor/plugins/goldberg/db/SystemSettings.yml
create vendor/plugins/goldberg/db/User.yml
create public/files
create public/files/Flash
create public/files/Image
create public/goldberg
create public/goldberg/stylesheets
create public/goldberg/stylesheets/goldberg.css
create public/goldberg/javascripts
create public/goldberg/javascripts/suckerfish.js
create public/goldberg/images
create public/goldberg/images/action.png
create public/goldberg/images/add.png
create public/goldberg/images/delete.png
create public/goldberg/images/down.png
create public/goldberg/images/page.png
create public/goldberg/images/permission.png
create public/goldberg/images/role.png
create public/goldberg/images/up.png
create app/views/layouts/application.rhtml
create public/goldberg/images/bg.gif
create public/goldberg/images/sample.jpg
create public/goldberg/images/title_img.jpg
create public/goldberg/images/daddy_rightarrow.gif
create public/goldberg/stylesheets/layout.css
create vendor/plugins/goldberg/test
create vendor/plugins/goldberg/test/unit
create vendor/plugins/goldberg/test/fixtures
create vendor/plugins/goldberg/test/unit/content_page_test.rb
create vendor/plugins/goldberg/test/unit/system_settings_test.rb
create vendor/plugins/goldberg/test/unit/menu_item_test.rb
create vendor/plugins/goldberg/test/unit/user_test.rb
create vendor/plugins/goldberg/test/unit/site_controller_test.rb
create vendor/plugins/goldberg/test/unit/markup_style_test.rb
create vendor/plugins/goldberg/test/unit/permission_test.rb
create vendor/plugins/goldberg/test/unit/controller_action_test.rb
create vendor/plugins/goldberg/test/fixtures/content_pages.yml
create vendor/plugins/goldberg/test/fixtures/permissions.yml
create vendor/plugins/goldberg/test/fixtures/markup_styles.yml
create vendor/plugins/goldberg/test/fixtures/roles.yml
create vendor/plugins/goldberg/test/fixtures/menu_items.yml
create vendor/plugins/goldberg/test/fixtures/users.yml
create vendor/plugins/goldberg/test/fixtures/site_controllers.yml
create vendor/plugins/goldberg/test/fixtures/roles_permissions.yml
create vendor/plugins/goldberg/test/fixtures/controller_actions.yml
create README_GOLDBERG
readme README_GOLDBERG
WELCOME TO GOLDBERG!

All the files for your site should now be in place. The following
steps are required to complete your setup:

1. Create your database and edit config/database.yml accordingly.

2. Execute the following Rake task to complete the setup of Goldberg:

rake goldberg:install


There may be extra steps required to get Rails working, especially if
you are using shared hosting and/or FastCGI. Check your provider's
Rails documentation.

Good luck using Goldberg!


Dave Nelson, urbanus at 240gl dot org

で、プラグインの組み込みが完了します。ただし、まだインストール完了ではないです。続けてさらに、DBを適切に作成して、config/database.ymlを適切に設定して以下を実行します。

rake goldberg:install

以上でインストール完了。この時点でデータベース上には、goldberg_で始まるいくつかのテーブルが作成されています。以下、上記コマンドで作成されるテーブルのリストです。

goldberg_content_pages
goldberg_controller_actions
goldberg_markup_styles
goldberg_menu_items
goldberg_permissions
goldberg_roles
goldberg_roles_permissions
goldberg_site_controllers
goldberg_system_settings
goldberg_users
plugin_schema_info


gem以外にもインストール方法はありますが、gem以外でインストールするとマニュアルで依存関係のあるライブラリもインストールしないといけません。


インストール完了後、WEBRickサーバをたち上げてトップページにアクセスするとこんなページがでます。



ログインフォームもパスワードを忘れ対応のリンクも一応あります。(ちゃんと設定しないと使えないみたい。)



ユーザID、パスワード共にadminでログインします。



左側のメニューのうちUsers、Roles、Permissionsでそれぞれ、ユーザの追加と編集、ロール(以下、グループ)の作成と編集、グループ毎の権限の追加と編集が出来ます。


ここで、グループに追加できる権限(=グループがアクセスできるページの追加)が、その下のControllers/Actionsで編集できます。



まず、Controllers/ActionsのBuiltinタブでは、goldbergにデフォルトで設定されているControllerとActionが表示されていて、これらの設定を変更できます。



Applicationタブでは自分で作ったControllerとActionを設定で来ます。



間違ったり、まだ作ってないController/ActionはMissingタブに表示されます。



あと、メニューの設定とシステム全体の設定が出来ます。
システム全体の設定では、サイト名、サイトの説明、ユーザの追加方法(ゲストが勝手にメンバー登録できるかどうかとか)を設定できます。ちなみにユーザ登録方法をちゃんと設定すると下のような登録ページが有効になります。



インストールも設定も拍子抜けなほど簡単で、結構柔軟そうなシステムです。いかがでしょう?


うちの車椅子グルメサイトもこんなので作りなおしたいなぁ。


参考
Goldberg
インストール
フォーラム