Module: DeviseRestfulAuth::InstanceMethods

Defined in:
lib/devise_restful_auth/validate_auth.rb

Instance Method Summary collapse

Instance Method Details

#validate_permissions(item_type = nil) ⇒ Object

se item o subject sono qualsiasi, si specifica 'any' nel controller e viene settato il valore nil per la ricerca sul db se item e subject sono la stessa classe, la convenzione è di chiamare il model che mappa i ruoli come SubjectSubjectRole. verrà usata la chiave subject_id per il soggetto indipendentemente dalla classe.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/devise_restful_auth/validate_auth.rb', line 23

def validate_permissions(item_type=nil)
  @item_type||=item_type if item_type
  controller= self.request.params[:controller]
  action= self.request.params[:action]
  if @item_type.nil?
	@item_type=controller.singularize.camelize
  elsif @item_type.eql?'any'
	@item_type=nil
  end
  #try to infer @item_id if nil (nil means any here and will be considered)
  if @item_id.nil?
	if eval(@item_type).is_a? Class
	  begin
 @item=eval(@item_type).find(params[:id]) if params[:id]
 @item_id=@item.id unless @item.nil?
	  rescue => e
 
 @item_id=nil
	  end
	end
  end
  if @subject_type.nil?
	@subject_type="User"
    @subject_id=current_user.id if current_user
  elsif @subject_type.eql?'any'
	@subject_type=nil
  end
  
  if @role_id.nil?
	begin
	  @permission_model=(eval("#{@subject_type}"+"#{@item_type}"+"Role").is_a? Class)
	rescue =>e
# 	  logger debug.e
	end
	
	if @subject_type and @item_type and @permission_model 
	  
	  if @subject_type.eql?@item_type
 
 @roles=eval("#{@subject_type}"+"#{@item_type}"+"Role").all
 
 if !@roles.empty?
   @subject_roles=@roles.find_all { |e| [nil,@subject_id].include? e[:subject_id] }
 end
 
	  else
 
 begin
   @subject_roles=eval("#{@subject_type}"+"#{@item_type}"+"Role").all(:conditions=>{"#{@subject_type.parameterize}_id".to_sym=>@subject_id})
 rescue => e
   
 end
	  end
	  @subject_roles||=[]
	  
	  begin
 if !@subject_roles.empty?
   
   @sr=@subject_roles.find_all { |i| [nil,@item_id].include? i[:item_id] }
   
   @role_ids=@sr
 end
	  rescue => e
 
	  end
	  @role_type="Role"
	end
	@role_ids||=[]
  end
  if eval("Permission").is_a? Class
	p=Permission.first(:conditions=>{:controller=>controller,:action=>action})
	if p
	  
	  @role_ids.each do |user_role|
 
 @role_permissions=SubjectPermission.all(:conditions=>["subject_id=? and subject_type=? and permission_id=? and (item_type=? or item_type='')",user_role.role.id,@role_type,p.id,@item_type])
 if !@role_permissions.empty?
   
   @rps=@role_permissions.find_all { |rp| [nil,@item_id].include? rp[:item_id]}
 end
 @rps||=[]  
 
 @rps.each do |sp|
   
 end
 if !@rps.empty? 
  return 
 end
	  end
	  
 @subject_permissions_on_items=SubjectPermission.all(:conditions=>["(item_type=? or item_type='') and permission_id=? and subject_id=? and subject_type=?",@item_type,p.id,@subject_id,@subject_type])
	  
	  if !@subject_permissions_on_items.empty?
 @ups=@subject_permissions_on_items.find_all { |u| [nil,@item_id].include? u[:item_id]}
	  end
	  if @ups
return
	  else
 
 flash[:error]="accesso negato perché non esiste un permesso né per l'utente, né per il suo ruolo, su #{controller}/#{action} per #{@item_type}:#{@item_id}"
 redirect_to root_url and return
	  end
	else
	  
	  
	  flash[:error]="accesso negato perché è presente la validazione per questa operazione (<strong>#{controller}/#{action}</strong>), ma non esistono permessi associati"
	  redirect_to root_url and return
	end
  end
end