项目作者: topbitdu

项目描述 :
Unidom (UNIfied Domain Object Model) is a series of domain model engines. The Authorization domain model engine includes the Permission and Authorizing models. Unidom (统一领域对象模型)是一系列的领域模型引擎。授权领域模型引擎包括权限、授权的模型。
高级语言: Ruby
项目地址: git://github.com/topbitdu/unidom-authorization.git


Unidom Authorization 授权领域模型引擎

Documentation
License

Gem Version
Dependency Status

Unidom (UNIfied Domain Object Model) is a series of domain model engines. The Authorization domain model engine includes the Permission and Authorizing models.
Unidom (统一领域对象模型)是一系列的领域模型引擎。授权领域模型引擎包括权限、授权的模型。

Recent Update

Check out the Road Map to find out what’s the next.
Check out the Change Log to find out what’s new.

Usage in Gemfile

  1. gem 'unidom-authorization'

Run the Database Migration

  1. rake db:migrate

The migration versions start with 200004.

Call the Model

  1. Unidom::Authorization::Permission.valid_at.alive
  2. Unidom::Authorization::Authorizing.valid_at.alive
  3. permission = Unidom::Authorization::Permission.valid_at.alive.first
  4. permission.authorized? user, at: Time.now # false
  5. Unidom::Authorization::Authorizing.authorize! permission: permission, authorized: user
  6. # or: permission.authorize! user, by: current_user, at: Time.now
  7. # or: user.is_authorized! permission: permission, by: administrator, at: Time.now
  8. permission.authorize? user, at: Time.now # true
  9. user.is_authorized? permission: permission, at: Time.now # true
  10. user.is_prohibted! permission: permission, at: Time.now
  11. # or: permission.prohibit! user, at: Time.now
  12. permission.authorize? user, at: Time.now # false
  13. user.is_authorized? permission: permission, at: Time.now # false

Include the Concerns

  1. include Unidom::Authorization::Concerns::AsAuthorized
  2. include Unidom::Authorization::Concerns::AsPermission

As Authorized concern

The As Authorized concern do the following tasks for the includer automatically:

  1. Define the has_many :authorizings macro as: has_many :authorizings, class_name: 'Unidom::Authorization::Authorizing', as: :authorized

  2. Define the has_many :permissions macro as: has_many :permissions, through: :authorizings, source: :permission

  3. Define the #is_authorized! method as: is_authorized!(permission: nil, by: nil, at: Time.now)

  4. Define the #is_authorized? method as: is_authorized?(permission: nil, at: Time.now)

  5. Define the #is_prohibited! method as: is_prohibited!(permission: nil, at: Time.now)

As Permission concern

The As Permission concern do the following tasks for the includer automatically:

  1. Define the has_many :authorizings macro as: has_many :authorizings, class_name: 'Unidom::Authorization::Authorizing'

  2. Define the #authorize! method as: authorize!(authorized, by: nil, at: Time.now)

  3. Define the #authorize? method as: authorize?(authorized, at: Time.now)

  4. Define the #prohibit! method as: prohibit!(authorized, at: Time.now)

Disable the Model & Migration

If you only need the app components other than models, the migrations should be neglected, and the models should not be loaded.

  1. # config/initializers/unidom.rb
  2. Unidom::Common.configure do |options|
  3. options[:neglected_namespaces] = %w{
  4. Unidom::Authorization
  5. }
  6. end

RSpec examples

RSpec example manifest (run automatically)

  1. # spec/models/unidom_spec.rb
  2. require 'unidom/authorization/models_rspec'
  3. # spec/types/unidom_spec.rb
  4. require 'unidom/authorization/types_rspec'
  5. # spec/validators/unidom_spec.rb
  6. require 'unidom/authorization/validators_rspec'

RSpec shared examples (to be integrated)

  1. # lib/unidom.rb
  2. def initialize_unidom
  3. Unidom::Party::Person.class_eval do
  4. include Unidom::Authorization::Concerns::AsAuthorized
  5. end
  6. Unidom::Position::Post.class_eval do
  7. include Unidom::Authorization::Concerns::AsAuthorized
  8. end
  9. end
  10. # spec/rails_helper.rb
  11. require 'unidom'
  12. initialize_unidom
  13. # spec/support/unidom_rspec_shared_examples.rb
  14. require 'unidom/authorization/rspec_shared_examples'
  15. # spec/models/unidom/party/person_spec.rb
  16. describe Unidom::Party::Person do
  17. model_attribtues = {
  18. name: 'Tim'
  19. }
  20. permission_attributes = {
  21. path: 'administration/government_agency/create',
  22. name: 'Create Government Agency',
  23. opened_at: Time.now
  24. }
  25. permission = Unidom::Authorization::Permission.create! permission_attributes
  26. authorizer_attributes = {}
  27. authorizer = described_class.create! authorizer_attributes
  28. it_behaves_like 'Unidom::Authorization::Concerns::AsAuthorized', model_attribtues, permission, authorizer
  29. end
  30. # spec/models/unidom/position/post_spec.rb
  31. describe Unidom::Position::Post do
  32. model_attribtues = {
  33. name: 'HR Manager',
  34. organization_id: SecureRandom.uuid,
  35. organization_type: 'Unidom::Position::Organization::Mock',
  36. position_id: SecureRandom.uuid
  37. }
  38. permission_attributes = {
  39. path: 'administration/government_agency/create',
  40. name: 'Create Government Agency',
  41. opened_at: Time.now
  42. }
  43. permission = Unidom::Authorization::Permission.create! permission_attributes
  44. authorizer_attributes = {}
  45. authorizer = described_class.create! authorizer_attributes
  46. it_behaves_like 'Unidom::Authorization::Concerns::AsAuthorized', model_attribtues, permission, authorizer
  47. end
  48. # spec/models/unidom/authorization/permission_spec.rb
  49. describe Unidom::Authorization::Permission, type: :model do
  50. before :each do
  51. end
  52. after :each do
  53. end
  54. context do
  55. model_attributes = {
  56. name: 'User Management',
  57. path: 'users'
  58. }
  59. authorized_attributes = {}
  60. authorized = Unidom::Visitor::User.create! authorized_attributes
  61. authorizer_attributes = {}
  62. authorizer = Unidom::Visitor::User.create! authorizer_attributes
  63. it_behaves_like 'Unidom::Authorization::Permission', model_attributes, authorized, authorizer
  64. end
  65. end
  66. # spec/models/unidom/authorization/authorizing_spec.rb
  67. describe Unidom::Authorization::Authorizing, type: :model do
  68. before :each do
  69. end
  70. after :each do
  71. end
  72. context do
  73. model_attributes = {
  74. authorizer_id: SecureRandom.uuid,
  75. authorizer_type: 'Unidom::Authorization::Authorizer::Mock',
  76. authorized_id: SecureRandom.uuid,
  77. authorized_type: 'Unidom::Authorization::Authorized::Mock',
  78. permission_id: SecureRandom.uuid
  79. }
  80. authorizer_class_list = [ Unidom::Visitor::User, Unidom::Party::Person ]
  81. it_behaves_like 'Unidom::Authorization::Authorizing', model_attributes, authorizer_class_list, [ {}, { name: 'Tim' } ]
  82. end
  83. end