2010-12-06 56 views
0

J'essaie d'utiliser l'authentification déclarative pour contrôler l'accès à mon site. Mais quand j'utilise filter_resource_access, j'obtiens cette erreur. J'ai aussi essayé de savoir comment faire le rôle par défaut pour être abonnéAide en utilisant l'authentification déclarative

nom de la méthode non définie » pour « admin »: String

modèle utilisateur

class User < ActiveRecord::Base 

    acts_as_authentic 

    ROLES = %w[admin moderator subscriber] 

    #Each user can subscribe to many channels 
    has_and_belongs_to_many :channels 

    #Each user who is a moderator can moderate many channels 
    #has_many :channel_mods 
    #has_many :channels, :through => :channel_mods 

    #Each user can receive many messages 
    has_and_belongs_to_many :messages 

    #Filter users by role(s) 
    named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0 "} } 

    def roles 
    ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? } 
    end 

    def roles=(roles) 
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum 
    end 

    def role_symbols 
    roles.map do |role| 
     role.name.underscore.to_sym 
    end 
    end 

end 

canal contrôleur

class ChannelsController < ApplicationController 

    filter_resource_access 
    helper_method :require_user 

    def index 
    if current_user 
    @channels = Channel.find(:all) 
    else 
     flash[:notice] = "You must first login or register before accessing or site" 
     redirect_to :login 
    end 

    end 

    def show 
    if current_user 
    #@channel = Channel.find(params[:id]) 
    @message = Message.new(:channel => @channel) 
     else 
     flash[:notice] = "You must first login or register before accessing or site" 
     redirect_to :login 
    end 
    end 

    def new 
    if current_user 
    #@channel = Channel.new 
     else 
     flash[:notice] = "You must first login or register before accessing or site" 
     redirect_to :login 
    end 
    end 

    def create 
    #@channel = Channel.new(params[:channel]) 
    if @channel.save 
     flash[:notice] = "Successfully created channel." 
     redirect_to @channel 
    else 
     render :action => 'new' 
    end 
    end 

    def edit 
    if current_user 
    #@channel = Channel.find(params[:id]) 
     else 
     flash[:notice] = "You must first login or register before accessing or site" 
     redirect_to :login 
    end 
    end 

    def update 
    #@channel = Channel.find(params[:id]) 
    if @channel.update_attributes(params[:channel]) 
     flash[:notice] = "Successfully updated channel." 
     redirect_to @channel 
    else 
     render :action => 'edit' 
    end 
    end 

    def destroy 
    #@channel = Channel.find(params[:id]) 
    @channel.destroy 
    flash[:notice] = "Successfully destroyed channel." 
    redirect_to channels_url 
    end 

end 

autorisation_rules.rb

authorization do 

    role :admin do 
    has_permission_on [:all], :to => [:index, :show, :new, :create, :edit, :update, :destroy] 
    end 

    role :subscriber do 
    includes :guest 
    has_permission_on :channels_users, :to => [:new, :create, :edit, :update, :destroy] do 
     if_attribute :user_id => is{user_id} 
    end 


    end 

    role :guest do 
    has_permission_on :channels, :to => [:index, :show] 
    has_permission_on :messages, :to => [:index, :show] 
    has_permission_on :users, :to => [:index, :show] 
    end 

    role :moderator do 
    includes :guest 
    has_permission_on [:channels] , :to=> [:edit, :update] do 
     if_attribute :moderator => is{user} 
    end 
    has_permission_on [:messages], :to=> [:edit, :update] do 
     if_attribute :moderator => is{user} 
    end 
    has_permission_on [:messages], :to =>[:create, :new] 
    end 


end 

erreur webrick

Permission denied: No matching rules found for index for #<User id: 1, login: "antarrbyrd", crypted_password: "2116af494 
6914553db0589fe78e957122c9d5c017d5f99b4f0b...", password_salt: "9M9OIdBcQs11sF0ycn1b", persistence_token: "923c03ca2989b 
0d7e862c6e6beb02ab09ec97b1675c27900142...", first_name: "Antarr", last_name: "Byrd", login_count: 13, last_request_at: " 
2010-12-06 01:06:14", telephone: "8324051056", email: "[email protected]", last_login_at: "2010-12-05 09:10:26", cur 
rent_login_at: "2010-12-06 01:02:22", last_login_ip: "127.0.0.1", current_login_ip: "127.0.0.1", carrier_name: nil, mode 
rator: nil, created_at: "2010-12-04 05:47:16", updated_at: "2010-12-06 01:06:14", roles_mask: 1, perishable_token: "3ssc 
XJhlfYE8tIKSRa0U"> (roles [:admin], privileges [:index], context :channels). 

Répondre

1

est ici un problème fixe:

def role_symbols 
    roles.map do |role| 
    role.underscore.to_sym # NOT role.name.underscore.to_sym (role is a string) 
    end 
end 

Essayez et voir si cela fonctionne. Sinon, s'il vous plaît envoyer des messages d'erreur.

+0

Merci je crois qu'il a résolu ce problème. Je ne reçois aucune erreur des rails, mais Firefox dit "Firefox a détecté que le serveur redirige la demande pour cette adresse d'une manière qui ne se terminera jamais." –

+0

Ok, j'ai trouvé que l'erreur dans la console du serveur s'affichera plus haut. Mais je devine que je dois modifier mes permissions. –

+0

Peut-être que vous pouvez marquer cette question répondu ou mettre la bonne réponse dans votre question afin que les autres qui viennent peuvent savoir ce que vous avez fait. Sur une autre note, j'ai aussi des problèmes avec decl_auth ... est-ce que l'un d'entre vous peut jeter un coup d'oeil et voir si vous pouvez m'aider s'il vous plaît: http://stackoverflow.com/questions/4631218/how-do-i -access-un-utilisateur-avec-un-role-particulier-dans-les-rails-3 – marcamillion