{"id":28495472,"url":"https://github.com/topbitdu/unidom-authorization","last_synced_at":"2025-07-02T08:31:19.180Z","repository":{"id":59158600,"uuid":"52424698","full_name":"topbitdu/unidom-authorization","owner":"topbitdu","description":"Unidom (UNIfied Domain Object Model) is a series of domain model engines. The Authorization domain model engine includes the Permission and Authorizing models. Unidom (统一领域对象模型)是一系列的领域模型引擎。授权领域模型引擎包括权限、授权的模型。","archived":false,"fork":false,"pushed_at":"2017-05-19T07:50:20.000Z","size":127,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-08T11:11:31.955Z","etag":null,"topics":["authorization","model","permission","unidom"],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/topbitdu.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"MIT-LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-02-24T07:58:04.000Z","updated_at":"2024-09-20T06:43:24.000Z","dependencies_parsed_at":"2022-09-13T20:10:30.248Z","dependency_job_id":null,"html_url":"https://github.com/topbitdu/unidom-authorization","commit_stats":null,"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/topbitdu/unidom-authorization","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/topbitdu%2Funidom-authorization","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/topbitdu%2Funidom-authorization/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/topbitdu%2Funidom-authorization/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/topbitdu%2Funidom-authorization/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/topbitdu","download_url":"https://codeload.github.com/topbitdu/unidom-authorization/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/topbitdu%2Funidom-authorization/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263102536,"owners_count":23414122,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authorization","model","permission","unidom"],"created_at":"2025-06-08T11:10:36.700Z","updated_at":"2025-07-02T08:31:19.168Z","avatar_url":"https://github.com/topbitdu.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Unidom Authorization 授权领域模型引擎\n\n[![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://www.rubydoc.info/gems/unidom-authorization/frames)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](http://opensource.org/licenses/MIT)\n\n[![Gem Version](https://badge.fury.io/rb/unidom-authorization.svg)](https://badge.fury.io/rb/unidom-authorization)\n[![Dependency Status](https://gemnasium.com/badges/github.com/topbitdu/unidom-authorization.svg)](https://gemnasium.com/github.com/topbitdu/unidom-authorization)\n\nUnidom (UNIfied Domain Object Model) is a series of domain model engines. The Authorization domain model engine includes the Permission and Authorizing models.\nUnidom (统一领域对象模型)是一系列的领域模型引擎。授权领域模型引擎包括权限、授权的模型。\n\n\n\n## Recent Update\n\nCheck out the [Road Map](ROADMAP.md) to find out what's the next.\nCheck out the [Change Log](CHANGELOG.md) to find out what's new.\n\n\n\n## Usage in Gemfile\n\n```ruby\ngem 'unidom-authorization'\n```\n\n\n\n## Run the Database Migration\n\n```shell\nrake db:migrate\n```\nThe migration versions start with 200004.\n\n\n\n## Call the Model\n\n```ruby\nUnidom::Authorization::Permission.valid_at.alive\nUnidom::Authorization::Authorizing.valid_at.alive\n\npermission = Unidom::Authorization::Permission.valid_at.alive.first\n\npermission.authorized? user, at: Time.now # false\nUnidom::Authorization::Authorizing.authorize! permission: permission, authorized: user\n# or: permission.authorize! user, by: current_user, at: Time.now\n# or: user.is_authorized! permission: permission, by: administrator, at: Time.now\n\npermission.authorize? user, at: Time.now # true\nuser.is_authorized? permission: permission, at: Time.now # true\n\nuser.is_prohibted! permission: permission, at: Time.now\n# or: permission.prohibit! user, at: Time.now\n\npermission.authorize? user, at: Time.now # false\nuser.is_authorized? permission: permission, at: Time.now # false\n```\n\n\n\n## Include the Concerns\n\n```ruby\ninclude Unidom::Authorization::Concerns::AsAuthorized\ninclude Unidom::Authorization::Concerns::AsPermission\n```\n\n### As Authorized concern\n\nThe As Authorized concern do the following tasks for the includer automatically:\n1. Define the has_many :authorizings macro as: ``has_many :authorizings, class_name: 'Unidom::Authorization::Authorizing', as: :authorized``\n\n2. Define the has_many :permissions macro as: ``has_many :permissions, through: :authorizings, source: :permission``\n\n3. Define the #is_authorized! method as: ``is_authorized!(permission: nil, by: nil, at: Time.now)``\n\n4. Define the #is_authorized? method as: ``is_authorized?(permission: nil, at: Time.now)``\n\n5. Define the #is_prohibited! method as: ``is_prohibited!(permission: nil, at: Time.now)``\n\n### As Permission concern\n\nThe As Permission concern do the following tasks for the includer automatically:\n1. Define the has_many :authorizings macro as: ``has_many :authorizings, class_name: 'Unidom::Authorization::Authorizing'``\n\n2. Define the #authorize! method as: ``authorize!(authorized, by: nil, at: Time.now)``\n\n3. Define the #authorize? method as: ``authorize?(authorized, at: Time.now)``\n\n4. Define the #prohibit! method as: ``prohibit!(authorized, at: Time.now)``\n\n\n\n## Disable the Model \u0026 Migration\n\nIf you only need the app components other than models, the migrations should be neglected, and the models should not be loaded.\n```ruby\n# config/initializers/unidom.rb\nUnidom::Common.configure do |options|\n\n  options[:neglected_namespaces] = %w{\n    Unidom::Authorization\n  }\n\nend\n```\n\n\n\n## RSpec examples\n\n### RSpec example manifest (run automatically)\n\n```ruby\n# spec/models/unidom_spec.rb\nrequire 'unidom/authorization/models_rspec'\n\n# spec/types/unidom_spec.rb\nrequire 'unidom/authorization/types_rspec'\n\n# spec/validators/unidom_spec.rb\nrequire 'unidom/authorization/validators_rspec'\n```\n\n### RSpec shared examples (to be integrated)\n\n```ruby\n# lib/unidom.rb\ndef initialize_unidom\n\n  Unidom::Party::Person.class_eval do\n    include Unidom::Authorization::Concerns::AsAuthorized\n  end\n\n  Unidom::Position::Post.class_eval do\n    include Unidom::Authorization::Concerns::AsAuthorized\n  end\n\nend\n\n# spec/rails_helper.rb\nrequire 'unidom'\ninitialize_unidom\n\n# spec/support/unidom_rspec_shared_examples.rb\nrequire 'unidom/authorization/rspec_shared_examples'\n\n# spec/models/unidom/party/person_spec.rb\ndescribe Unidom::Party::Person do\n\n  model_attribtues = {\n    name: 'Tim'\n  }\n\n  permission_attributes = {\n    path:      'administration/government_agency/create',\n    name:      'Create Government Agency',\n    opened_at: Time.now\n  }\n  permission = Unidom::Authorization::Permission.create! permission_attributes\n\n  authorizer_attributes = {}\n  authorizer = described_class.create! authorizer_attributes\n\n  it_behaves_like 'Unidom::Authorization::Concerns::AsAuthorized', model_attribtues, permission, authorizer\n\nend\n\n# spec/models/unidom/position/post_spec.rb\ndescribe Unidom::Position::Post do\n\n  model_attribtues = {\n    name:              'HR Manager',\n    organization_id:   SecureRandom.uuid,\n    organization_type: 'Unidom::Position::Organization::Mock',\n    position_id:       SecureRandom.uuid\n  }\n\n  permission_attributes = {\n    path:      'administration/government_agency/create',\n    name:      'Create Government Agency',\n    opened_at: Time.now\n  }\n  permission = Unidom::Authorization::Permission.create! permission_attributes\n\n  authorizer_attributes = {}\n  authorizer = described_class.create! authorizer_attributes\n\n  it_behaves_like 'Unidom::Authorization::Concerns::AsAuthorized', model_attribtues, permission, authorizer\n\nend\n\n# spec/models/unidom/authorization/permission_spec.rb\ndescribe Unidom::Authorization::Permission, type: :model do\n\n  before :each do\n  end\n\n  after :each do\n  end\n\n  context do\n\n    model_attributes = {\n      name: 'User Management',\n      path: 'users'\n    }\n\n    authorized_attributes = {}\n    authorized = Unidom::Visitor::User.create! authorized_attributes\n\n    authorizer_attributes = {}\n    authorizer = Unidom::Visitor::User.create! authorizer_attributes\n\n    it_behaves_like 'Unidom::Authorization::Permission', model_attributes, authorized, authorizer\n\n  end\n\nend\n\n# spec/models/unidom/authorization/authorizing_spec.rb\ndescribe Unidom::Authorization::Authorizing, type: :model do\n\n  before :each do\n  end\n\n  after :each do\n  end\n\n  context do\n\n    model_attributes = {\n      authorizer_id:   SecureRandom.uuid,\n      authorizer_type: 'Unidom::Authorization::Authorizer::Mock',\n      authorized_id:   SecureRandom.uuid,\n      authorized_type: 'Unidom::Authorization::Authorized::Mock',\n      permission_id:   SecureRandom.uuid\n    }\n    authorizer_class_list = [ Unidom::Visitor::User, Unidom::Party::Person ]\n\n    it_behaves_like 'Unidom::Authorization::Authorizing', model_attributes, authorizer_class_list, [ {}, { name: 'Tim' } ]\n\n  end\n\nend\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftopbitdu%2Funidom-authorization","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftopbitdu%2Funidom-authorization","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftopbitdu%2Funidom-authorization/lists"}