Created
October 11, 2011 04:52
-
-
Save cmaujean/1277326 to your computer and use it in GitHub Desktop.
Customizing Spree Roles - 0.60-stable - a basic example of adding custom roles to spree
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# db/migrate/01_add_custom_admin_roles.rb | |
class AddCustomAdminRoles < ActiveRecord::Migration | |
@roles = %w[extra] | |
def self.up | |
@roles.each do |r| | |
Role.create(:name => r) | |
end | |
end | |
def self.down | |
@roles.each do |r| | |
Role.where(:name => r).first.destroy | |
end | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# app/models/ability.rb | |
# Only customized methods are shown here, see the ability class on github for the rest | |
class Ability | |
def initialize(user) | |
user ||= User.new | |
if user.has_role? 'admin' | |
can :manage, :all | |
elsif user.has_role? 'extra' | |
base_admin | |
custom_perms | |
%w/destroy/.each do |act| | |
can act, "admin/orders" | |
end | |
can 'fire', 'cancel' | |
else | |
############################# | |
can :read, User do |resource| | |
resource == user | |
end | |
can :update, User do |resource| | |
resource == user | |
end | |
can :create, User | |
############################# | |
can :read, Order do |order, token| | |
order.user == user || order.token && token == order.token | |
end | |
can :update, Order do |order, token| | |
order.user == user || order.token && token == order.token | |
end | |
can :create, Order | |
############################# | |
can :read, Product | |
can :index, Product | |
############################# | |
can :read, Taxon | |
can :index, Taxon | |
############################# | |
end | |
#include any abilities registered by extensions, etc. | |
Ability.abilities.each do |clazz| | |
ability = clazz.send(:new, user) | |
@rules = rules + ability.send(:rules) | |
end | |
end | |
def custom_perms | |
%w/index edit destroy update show fire/.each do |act| | |
can act, "admin/products" | |
can act, "admin/payments" | |
can act, "admin/shipments" | |
can act, "admin/return_authorizations" | |
can act, "admin/adjustments" | |
end | |
%w/index edit update show fire/.each do |act| | |
can act, "admin/orders" | |
end | |
%w/next return resume authorize_return/.each do |event| | |
can 'fire', event | |
end | |
can :manage, Product | |
can :manage, Variant | |
can :manage, Order | |
cannot :destroy, Order | |
can :manage, LineItem | |
can :manage, Payment | |
can :manage, Shipment | |
can :manage, ReturnAuthorization | |
can :manage, Adjustment | |
end | |
def base_admin | |
can "index", "admin/overview" | |
can "index", "admin/reports" | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# app/controllers/admin/base_controller_decorator.rb | |
Admin::BaseController.class_eval do | |
prepend_before_filter :authorize_admin | |
def authorize_admin | |
authorize! params[:action], params[:controller] | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# app/controllers/admin/orders_controller_decorator.rb | |
Admin::OrdersController.class_eval do | |
before_filter :check_fire_perms | |
def check_fire_perms | |
if params[:e] | |
unauthorized unless can? 'fire', params[:e] | |
else | |
return true | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment