{"id":23893928,"url":"https://github.com/raminrahimzada/aditum","last_synced_at":"2026-06-17T22:31:39.946Z","repository":{"id":116486947,"uuid":"372756484","full_name":"raminrahimzada/Aditum","owner":"raminrahimzada","description":"Granular User Management - Users, Groups, Operations, Permissions","archived":false,"fork":false,"pushed_at":"2021-06-06T08:59:01.000Z","size":85,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-06-04T06:06:57.928Z","etag":null,"topics":["access-control","authorization","csharp","user-management"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/raminrahimzada.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-06-01T08:28:01.000Z","updated_at":"2021-06-06T08:59:04.000Z","dependencies_parsed_at":"2023-04-13T01:35:17.983Z","dependency_job_id":null,"html_url":"https://github.com/raminrahimzada/Aditum","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/raminrahimzada/Aditum","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raminrahimzada%2FAditum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raminrahimzada%2FAditum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raminrahimzada%2FAditum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raminrahimzada%2FAditum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/raminrahimzada","download_url":"https://codeload.github.com/raminrahimzada/Aditum/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raminrahimzada%2FAditum/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34468766,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["access-control","authorization","csharp","user-management"],"created_at":"2025-01-04T14:50:00.664Z","updated_at":"2026-06-17T22:31:39.936Z","avatar_url":"https://github.com/raminrahimzada.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Aditum\nGranular User Access Management - Users, Groups, Operations, Permissions (fully thread-safe)\n\n\n\n| | |\n| --- | --- |\n| **Quality** | [![SonarCloud](https://sonarcloud.io/api/project_badges/measure?project=raminrahimzada_Aditum\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=raminrahimzada_Aditum) [![GitHub issues](https://img.shields.io/github/stars/raminrahimzada/Aditum)](https://github.com/raminrahimzada/Aditum/issues) | \n| **Nuget** | [![Nuget](https://buildstats.info/nuget/Aditum.Core)](http://nuget.org/packages/Aditum.Core) |\n\n\nWith Aditum You can set permission to user or group according to Operations\u003cbr/\u003e\nUser , Group and Operation details are not stored in Aditum \u003cbr/\u003e\nYou can only set it's identity - Id ,\u003cbr/\u003e\nIf you want to store additional detail -  just store them elsewhere with referencing it's id  \u003cbr/\u003e\nBecause Aditum is intended only for authorization purposes \u003cbr/\u003e\nHere Id can be int,long,Guid and whatever you want \n\n# Configuration  (for asp.net core configuration see [this](https://github.com/raminrahimzada/Aditum/tree/master/DemoAspNetCoreApp))\nFor example if our user id,group id, operation id is int and our permission is just a bool - yes/no \nthen\n```cs\npublic class AppUserService : UserService\u003cint,int,int,bool\u003e\n{\n...\n```\n\nIf we want to mention that we have these users,groups,operations:\n```cs\n//getting instance \nvar service = new AppUserService();\n\n//just numbering their id's\n\n//user\nconst int bob = 1;\nconst int tom = 2;\n//groups\nconst int admins = 1;\n//operations\nconst int canSeeSecretsOfUniverse = 1;\nconst int canChangeSecretsOfUniverse = 2;\n\n\n//mentioning that we have these\nservice.EnsureUserId(bob);\nservice.EnsureGroupId(admins);\nservice.EnsureOperationId(canSeeSecretsOfUniverse);\n\n//change group permissions\nservice.SetGroupPermission(admins, canSeeSecretsOfUniverse, true);\nservice.SetGroupPermission(admins, canChangeSecretsOfUniverse, true);\n\n//add tom and bob to admins\nservice.EnsureUserIsInGroup(bob, admins);\nservice.EnsureUserIsInGroup(tom, admins);\n\n\n//deny bob for canChangeSecretsOfUniverse although he is admin\nservice.SetUserExclusivePermission(bob,admins,false);\n\n//these will return true and  true\nvar tomCanSee = GetUserPermission(tom,canSeeSecretsOfUniverse);\nvar tomCanChange = GetUserPermission(tom,canChangeSecretsOfUniverse);\n\n//these will return true and false\nvar bobCanSee = GetUserPermission(bob,canSeeSecretsOfUniverse);\nvar bobCanChange = GetUserPermission(bob,canChangeSecretsOfUniverse);\n//Because we exclusively deny bob for canChangeSecretsOfUniverse operation\n//although he is in admins and in admins by default all users can 'canChangeSecretsOfUniverse'\n```\n\n# Persistence\n```cs\n//Aditum has thread-safe change mechanism so you can listen for its setting change event \n//to store current settings and load the next time system startup\n//For that purpose there is 2 methods\n\n//dumping to file or stream:\n\nservice.DumpTo(\"aditum.db\");\n//or\nservice.DumpTo(stream);\n\n\n//and loading from file or stream :\n\nservice.LoadFrom(\"aditum.db\");\n//or\nservice.LoadFrom(stream);\n```\nDump/Load is  using memory mapped structure and this causes less space (usually in KBs)  \u003cbr/\u003e\nTo Optimize dump/load speed and storage size customize serialization strategy,\u003cbr/\u003e\nIf you are using int,long,guid or byte as id type then there is built in serialization strategies implemented \u003cbr/\u003e\nFor detailed configuration  code see [this](https://github.com/raminrahimzada/Aditum/blob/master/DemoAspNetCoreApp/AppUserService.cs)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framinrahimzada%2Faditum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Framinrahimzada%2Faditum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framinrahimzada%2Faditum/lists"}