Skip to content

Commit 00497f2

Browse files
author
Александр Дмитриев
committed
added strict param. Now you can check roles only that you set without super roles
1 parent ae0712c commit 00497f2

File tree

10 files changed

+80
-5
lines changed

10 files changed

+80
-5
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ coverage/*
88
log*/*
99
.rbx/*
1010
.rspec
11+
*.swp

lib/rolify.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
module Rolify
99
extend Configure
1010

11-
attr_accessor :role_cname, :adapter, :resource_adapter, :role_join_table_name, :role_table_name
11+
attr_accessor :role_cname, :adapter, :resource_adapter, :role_join_table_name, :role_table_name, :strict_rolify
1212
@@resource_types = []
1313

1414
def rolify(options = {})
@@ -31,6 +31,9 @@ def rolify(options = {})
3131

3232
self.adapter = Rolify::Adapter::Base.create("role_adapter", self.role_cname, self.name)
3333
load_dynamic_methods if Rolify.dynamic_shortcuts
34+
35+
#use strict roles
36+
self.strict_rolify = true if options[:strict]
3437
end
3538

3639
def adapter
@@ -70,4 +73,5 @@ def role_class
7073
def self.resource_types
7174
@@resource_types
7275
end
76+
7377
end

lib/rolify/adapters/active_record/role_adapter.rb

+10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ def where(relation, *args)
88
relation.where(conditions, *values)
99
end
1010

11+
def where_strict(relation, args)
12+
resource = if args[:resource].is_a?(Class)
13+
{class: args[:resource].to_s, id: nil}
14+
else
15+
{class: args[:resource].class.name, id: args[:resource].id}
16+
end
17+
18+
relation.where(:name => args[:name], :resource_type => resource[:class], :resource_id => resource[:id])
19+
end
20+
1121
def find_or_create_by(role_name, resource_type = nil, resource_id = nil)
1222
role_class.where(:name => role_name, :resource_type => resource_type, :resource_id => resource_id).first_or_create
1323
end

lib/rolify/adapters/mongoid/role_adapter.rb

+10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ def where(relation, *args)
88
relation.any_of(*conditions)
99
end
1010

11+
def where_strict(relation, args)
12+
resource = if args[:resource].is_a?(Class)
13+
{class: args[:resource].to_s, id: nil}
14+
else
15+
{class: args[:resource].class.name, id: args[:resource].id}
16+
end
17+
18+
self.role_class.where(:name => args[:name], :resource_type => resource[:class], :resource_id => resource[:id])
19+
end
20+
1121
def find_or_create_by(role_name, resource_type = nil, resource_id = nil)
1222
self.role_class.find_or_create_by(:name => role_name,
1323
:resource_type => resource_type,

lib/rolify/role.rb

+6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ def add_role(role_name, resource = nil)
2323
alias_method :grant, :add_role
2424

2525
def has_role?(role_name, resource = nil)
26+
return has_strict_role?(role_name, resource) if self.class.strict_rolify and resource
27+
2628
if new_record?
2729
role_array = self.roles.detect { |r|
2830
r.name.to_s == role_name.to_s &&
@@ -38,6 +40,10 @@ def has_role?(role_name, resource = nil)
3840
role_array != []
3941
end
4042

43+
def has_strict_role?(role_name, resource)
44+
self.class.adapter.where_strict(self.roles, name: role_name, resource: resource).any?
45+
end
46+
4147
def has_all_roles?(*args)
4248
args.each do |arg|
4349
if arg.is_a? Hash

spec/rolify/resource_spec.rb

+26
Original file line numberDiff line numberDiff line change
@@ -528,11 +528,37 @@
528528
end
529529
end
530530

531+
531532
describe '.resource_types' do
532533

533534
it 'include all models that call resourcify' do
534535
Rolify.resource_types.should include("HumanResource", "Forum", "Group",
535536
"Team", "Organization")
536537
end
537538
end
539+
540+
541+
describe "#strict" do
542+
context "strict user" do
543+
before do
544+
@strict_user = StrictUser.first
545+
@strict_user.add_role(:forum, Forum.first)
546+
@strict_user.add_role(:forum, Forum)
547+
end
548+
549+
subject { Forum.first }
550+
551+
it "should return only strict forum" do
552+
@strict_user.has_role?(:forum, Forum.first).should be true
553+
end
554+
555+
it "should return false on strict another forum" do
556+
@strict_user.has_role?(:forum, Forum.last).should be false
557+
end
558+
559+
it "should return true if user has role on Forum model" do
560+
@strict_user.has_role?(:forum, Forum).should be true
561+
end
562+
end
563+
end
538564
end

spec/support/adapters/active_record.rb

+5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ class Role < ActiveRecord::Base
1818
extend Rolify::Adapter::Scopes
1919
end
2020

21+
# Strict user and role classes
22+
class StrictUser < ActiveRecord::Base
23+
rolify strict: true
24+
end
25+
2126
# Resourcifed and rolifed at the same time
2227
class HumanResource < ActiveRecord::Base
2328
resourcify :resources

spec/support/adapters/mongoid.rb

+9-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ class User
1818
field :login, :type => String
1919
end
2020

21+
# Standard user and role classes
22+
class StrictUser
23+
include Mongoid::Document
24+
rolify strict: true
25+
26+
field :login, :type => String
27+
end
28+
2129
class Role
2230
include Mongoid::Document
2331
has_and_belongs_to_many :users
@@ -148,4 +156,4 @@ class Organization
148156

149157
class Company < Organization
150158

151-
end
159+
end

spec/support/data.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Users
2-
[ User, Customer, Admin::Moderator ].each do |user|
2+
[ User, Customer, Admin::Moderator, StrictUser ].each do |user|
33
user.destroy_all
4-
4+
55
user.create(:login => "admin")
66
user.create(:login => "moderator")
77
user.create(:login => "god")

spec/support/schema.rb

+6-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
end
1111
end
1212

13-
[ :users, :human_resources, :customers, :admin_moderators ].each do |table|
13+
[ :users, :human_resources, :customers, :admin_moderators, :strict_users ].each do |table|
1414
create_table(table) do |t|
1515
t.string :login
1616
end
@@ -21,6 +21,11 @@
2121
t.references :role
2222
end
2323

24+
create_table(:strict_users_roles, :id => false) do |t|
25+
t.references :strict_user
26+
t.references :role
27+
end
28+
2429
create_table(:human_resources_roles, :id => false) do |t|
2530
t.references :human_resource
2631
t.references :role

0 commit comments

Comments
 (0)