auth-assistant
Provides assistance for setting up an auth solution using devise and cancan auth frameworks.
Installation and configuration
This gem has been designed for Rails 3 only.
Insert gem 'auth-assistant'
in your Gemfile
Run $ bundle install
The gem should automatically configure itself with Rails after you run the config
generator (see below).
$ rails g auth_assist:config NAME
where NAME is the name of the role strategy to be used.
To make the extra authentication view helpers accessible from your views
app/helpers/application_helper.rb
module ApplicationHelper
auth_assist_helpers
end
Permits
Authorization is setup by designing permits for each can of role to do certain actions. The config generator generates a default permits.rb file in /lib
Please see "cancan 1.1 wiki":http://wiki.github.com/ryanb/cancan/upgrading-to-11 for more options you can use in designing your Permits. The 'owns' convenience method provided, now uses the new hash option so it is also available in the controller using fx:
Book.accessible_by(current_ability)
Example:
module RolePermit
class Moderator
def initialize(ability)
super
end
def permit?(user)
super
return if !user.role?(:moderator)
can :read, :all
# can manage comment instance if 'user' field on instance points to this user, marking ownership
user.owns(Comment)
# override default 'user_id' field to use 'owner' as foreign key to user.id
user.owns(Book, :author)
end
end
end
View helpers
Currently the view helpers only target use with devise and cancan.
The default labels are always loaded from the auth_assist
locale file, which is generated by the config
generator.
Rest link helpers
Display a link (anchor tag) for a given object only if the current user has permission to execute that action.
- show_link or read_link
- edit_link or update_link
- create_link or new_link
- destroy_link or delete_link
Each Rest helper method takes an object for which to create the link. Optionally provide a label as the second argument.
Example usage:
<%= create_link project %> <%= create_link project, 'Create new project' %>
Session link helpers
Show links for performing user authentication and registration actions
- log_out_link or sign_out_link
- log_in_link or sign_in_link
Each of these methods take an optional options hash. If no role option given, they default to create link for basic 'user' role.
Example usage:
<%= log_out_link %> <%= log_out_link :label => 'Log me out' %> <%= log_out_link :role => 'admin', :label => 'Log me out' %>
Registration link helpers
Show links for performing user authentication and registration actions
- register_link or sign_up_link
- edit_profile_link or edit_registration_link
Each of these methods take an optional options hash. If no role option given, they default to create link for basic 'user' role.
Example usage:
<%= register_link %> <%= register_link :label => 'Register me' %> <%= register_link :role => 'admin', :label => 'Register me' %>
Registration Menu item helpers
Show menu links for registration conditionally
- edit_user_menu_item or edit_registration_menu_item
- register_menu_item or sign_up_menu_item
1) only shown if user is currently logged in 2) only shown if user is NOT currently logged in (and hence already registered)
Example usage:
ul.menu <%= register_menu_item %>
Session Menu item helpers
Show menu links for session operations conditionally
- logout_menu_item or sign_out_menu_item
- login_menu_item or sign_in_menu_item
1) only shown if user is currently logged in 2) only shown if user is NOT currently logged in
ul.menu <%= login_menu_item %> <%= logout_menu_item %>
Block helpers
Execute block if user is logged in (or not logged in)
- user_block
- not_user_block
Execute block if user is logged and is admin (or not admin)
- admin_block
- not_admin_block
Execute block if ip is localhost (or not localhost)
- localhost_block
- not_localhost_block
Execute block if role is included in list of roles (or not)
- roles_block
- not_roles_block
Block area helpers
Create div.user 'area' and execute block if user is logged in as a user (or not)
- user_area
- not_user_area
Create div.admin 'area' and execute block if user is admin (or not admin)
- admin_area
- not_admin_area
Example:
<% admin_area do %>
ul.admin_menu
...
If logged in as admin, results in:
div.admin
ul.admin_menu
...
Roles block area helpers
Creates are if role is one included in list of roles (or not)
- roles_area
- not_roles_area
Example:
<% roles_area 'admin, 'editor', :class => 'special' do %>
ul.admin_menu
...
If logged in as either 'editor' or 'admin', results in:
div.special
ul.admin_menu
...
Misc helpers
- user? -
- admin?
- role?
- localhost?
Examples
<%= current_user.username if user? %>
<%= "Admin: #{current_user.username}" if admin? %>
<%= "Special user!" if role?('admin', 'reviewer') %>
<%= "Running on localhost!" if localhost? %>
Generators
The following generators are available
- config - configure with new strategy
- clear - clear existing strategy
- views - generate partials for use in views
Config Generator
The config
generator generates a configuration initializer file for setting up auth_assistant
to use a particular role strategy.
$ rails g auth_assistant:config NAME
NAME is the name of a role strategy.
Strategies with a single role for each user
- admin_field
- role_field
- role_assignment
Strategies with multiple roles for each user
- roles_field
- roles_mask
- multi_role_assignment
Currently role groups are not supported. Feel free to provide an add-on to support this or integrate with an existing 'role group' solution.
Example usage:
$ rails g auth_assist:config admin_field
Also ensure devise is setup and configured
$ rails g auth_assist:config roles_mask --devise
To also create an administrator model using STI to inherit and override the basic user strategies
$ rails g auth_assist:config roles_field --administrator
To ensure a user model migration is generated
$ rails g auth_assist:config role_field --migration
Clear Generator
The clear
generator removes any existing strategy file and optionally generates a migration to remove any tables and fields related to the existing role strategy.
This allows you to easily change role strategy by first running the clear
generator and then the config
generator with a new strategy.
$ rails g auth_assist:clear NAME
Example usage:
$ rails g auth_assist:clear role_field
Views Generator
The views
generator generates views (partials) for use with Menus.
$ rails g auth_assistant:views
Create HAML views
`$ rails g auth_assist:views --template_engine haml'
Example usage:
ul.
render 'auth_assist/login_items'
render 'auth_assist/registration_items'
ul.
render 'auth_assist/admin_login_items'
== Note on Patches/Pull Requests
- Fork the project.
- Make your feature addition or bug fix.
- Add tests for it. This is important so I don't break it in a future version unintentionally.
- Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
- Send me a pull request. Bonus points for topic branches.
== Copyright
Copyright (c) 2010 Kristian Mandrup. See LICENSE for details.