2 def self.append_features(base)
6 @@controllers_where_no_login_required = []
7 @@controller_permissions = Hash.new { |h, k| h[k] = Hash.new { |h, k| h[k] = Hash.new } }
8 helper_method :current_user
10 base.extend ClassMethods
17 @current_user ||= User.find(session['user_id']) rescue nil
20 def current_user=(value=nil)
21 if value && value.is_a?(User)
23 session['user_id'] = value.id
26 session['user_id'] = nil
32 action = params['action'].to_s.intern
33 if no_login_required? or (current_user and user_has_access_to_action?(action))
37 permissions = self.class.controller_permissions[self.class][action]
38 flash[:error] = permissions[:denied_message] || 'Access denied.'
39 redirect_to permissions[:denied_url] || { :action => :index }
47 def no_login_required?
48 controllers = self.class.controllers_where_no_login_required
49 controllers.include?(self.class)
52 def user_has_role?(role)
53 current_user.send("#{role}?")
56 def user_has_access_to_action?(action)
57 permissions = self.class.controller_permissions[self.class][action]
59 when allowed_roles = permissions[:when]
60 allowed_roles = [allowed_roles].flatten
61 allowed_roles.each do |role|
62 return true if user_has_role?(role)
65 when condition_method = permissions[:if]
66 send(condition_method)
74 controllers_where_no_login_required << self
77 def only_allow_access_to(*args)
79 options = args.pop.dup if args.last.kind_of?(Hash)
80 options.symbolize_keys!
81 actions = args.map { |a| a.to_s.intern }
82 actions.each do |action|
83 controller_permissions[self][action] = options
87 def controller_permissions
88 self.class_eval %{ @@controller_permissions }
91 def controllers_where_no_login_required
92 self.class_eval %{ @@controllers_where_no_login_required }