{ "info": { "author": "Kaos Labs Inc.", "author_email": "keyvan@keyvanm.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 3.2", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "# Django Identity and Access Management\n\nRoles and access management for django apps\n\n## Quick Setup\n\n```shell\npip install django-iam\n```\n\nMake sure you have a custom user model setup and in `settings.py` you have\n\n```python\nAUTH_USER_MODEL = 'users.User' # Point to your custom user model\n```\n\nAdd `iam` to your `INSTALLED_APPS`\n\n```python\n# settings.py\nINSTALLED_APPS = [\n 'django.contrib.admin',\n ..., # django apps\n 'iam',\n ..., # Your apps\n]\n\nAUTHENTICATION_BACKENDS = [\n ...,\n 'rules.permissions.ObjectPermissionBackend',\n 'django.contrib.auth.backends.ModelBackend',\n ...\n]\n```\n\nCreate a profile for the role, e.g.\n\n```python\n# app/models.py\nfrom django.db import models\nfrom iam.factories import AbstractProfileFactory\nfrom iam.contrib.utils import get_profile_cls_verbose_name_plural\n\n\nclass SomeRoleProfile(\n AbstractProfileFactory.as_abstract_model(related_name='blog_author_profile'),\n models.Model\n):\n # user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) # comes from AbstractProfileFactory\n\n class Meta:\n # Adds a little \ud83d\udc64 emoji to the name in admin, to make it clear this is a profile model\n verbose_name_plural = get_profile_cls_verbose_name_plural('BlogAdminProfile')\n```\n\nIn your app, create a `rules.py`:\n\n```python\n# app/rules.py\nimport rules\nfrom iam.utils import lazy_get_predicate\n\n# refer to https://github.com/dfunckt/django-rules#permissions-in-the-admin for why this is here\nrules.add_perm('some_app', rules.is_staff)\n\nis_some_role = lazy_get_predicate('some_app.SomeRole')\n```\n\nIn your model that you are planning to set access to:\n\n```python\n# app/models.py\nfrom rules.contrib.models import RulesModel\nfrom some_app.rules import is_some_role\n\n\nclass SomeModel(\n RulesModel\n):\n name = models.CharField(max_length=100)\n\n class Meta:\n rules_permissions = {\n 'add': is_some_role,\n 'view': is_some_role,\n 'change': is_some_role,\n 'delete': is_some_role,\n }\n```\n\nAs the last step, enable your user model to work with IAM and roles by having it inherit `IAMUserMixin`:\n\n```python\n# users/models.py\nfrom iam.mixins import IAMUserMixin\n\n\nclass User(\n IAMUserMixin,\n ...,\n AbstractUser\n):\n ...\n```\n\nNow only users that have a `SomeRoleProfile` profile can access `SomeModel`.\n\nFor more examples, check out `example/blog`.\n\n## Rationale\n\nThis package aims to improve upon the built-in Django authorization and permissions system, by making the system fully\nprogrammatic and not rely on database objects like the built-in `Group` and `Permission` models. We believe access\ngovernance in applications and projects should be evident form the code, and should not rely on database states and\nmigrations. An instance of an app deployed on a server should not have a different access governance structure than\nanother instance somewhere else (which can be the case using the Django built-in authorization system).\n\nThe excellent library [`django-rules`](https://github.com/dfunckt/django-rules) drastically improves upon the Django\npermission system by enabling developers to create rule based systems similar to decision trees, without the need for\nthe database to be involved. It also allows devs to create object level permissions, something which the built-in\npermission system doesn't allow.\n\n`django-iam` builds on `django-rules` by introducing the concept of Roles and Profiles. In IAM each user is assigned one\nor many roles, which determine their access to certain objects or paths in the application. Each Role has an associated\n`Profile` which is a database model/object with a 1-1 relationship to the `User` model. A user has a Role if their User\naccount has the associated profile in an active state. Please check the [Quick Setup](#quick-setup) section for an\nexample on how to set IAM up in your Django project.\n\n## Main tools\n\n### registry\n\n### AbstractProfileFactory (`iam.factories.AbstractProfileFactory`)\n\n### `lazy_get_predicate`\n\n### Deactivating profiles\n\n### predicates\n\n### `HasOwnerFactory`\n\n### Override permissions\n\n## Optional tools and utilities (`iam.contrib`)\n\n### `ProfileAdmin`\n\n### `AutoOwnerAdminMixin`\n\n### Admin roles\n\n### `AbstractIAMUser`\n\n### `IAMUserAdmin`\n\n### `get_profile_class_verbose_name_plural`\n\n## Development and Testing\n\n### IDE Setup\n\nAdd the `example` directory to the `PYTHONPATH` in your IDE to avoid seeing import warnings in the `tests` modules. If\nyou are using PyCharm, this is already set up.\n\n### Running the Tests\n\nInstall requirements\n\n```\npip install -r requirements.txt\n```\n\nFor local environment\n\n```\npytest\n```\n\nFor all supported environments\n\n```\ntox\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/kaoslabsinc/django-iam", "keywords": "django,iam,users,auth,authorization,kaos", "license": "BSD-3-Clause", "maintainer": "", "maintainer_email": "", "name": "django-iam", "package_url": "https://pypi.org/project/django-iam/", "platform": null, "project_url": "https://pypi.org/project/django-iam/", "project_urls": { "Homepage": "https://github.com/kaoslabsinc/django-iam" }, "release_url": "https://pypi.org/project/django-iam/0.3.0/", "requires_dist": [ "django (>=3.2)", "rules (~=3.0)", "django-building-blocks (~=0.1.0)", "djangorestframework (~=3.13)", "tox ; extra == 'test'", "pytest-django ; extra == 'test'", "pytest-pythonpath ; extra == 'test'", "pytest-cov ; extra == 'test'" ], "requires_python": "", "summary": "Roles and access management for django apps", "version": "0.3.0", "yanked": false, "yanked_reason": null }, "last_serial": 13693299, "releases": { "0.2.0rc7": [ { "comment_text": "", "digests": { "md5": "06ce25b283bb6d5446790b05d9167cc4", "sha256": "10a28c85a5548a1bec0c644d33d0c07af685ad1a7cd1d22edfd8b3c466885646" }, "downloads": -1, "filename": "django_iam-0.2.0rc7-py3-none-any.whl", "has_sig": false, "md5_digest": "06ce25b283bb6d5446790b05d9167cc4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14278, "upload_time": "2022-01-22T00:33:12", "upload_time_iso_8601": "2022-01-22T00:33:12.038069Z", "url": "https://files.pythonhosted.org/packages/00/81/8f747a57de4fa8a3774136e29b7bd8991d7eccef07951366d14504a4d283/django_iam-0.2.0rc7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f5a24c46766a263f5288bcce27f92eea", "sha256": "5830ba95337bf30bf79fa848bef57f870d86343abe228d5a915e6819bb762ce9" }, "downloads": -1, "filename": "django-iam-0.2.0rc7.tar.gz", "has_sig": false, "md5_digest": "f5a24c46766a263f5288bcce27f92eea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10472, "upload_time": "2022-01-22T00:33:13", "upload_time_iso_8601": "2022-01-22T00:33:13.726959Z", "url": "https://files.pythonhosted.org/packages/65/1e/c7627ab4d5d3ea4c093385cb7f3d5c828a18b490f0dc26628f29b9f12132/django-iam-0.2.0rc7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "4a9fd54568648b7eb733fe4468f494af", "sha256": "0fceed738fe10058ea8b5c9c8615a485b92467dd9324b13e8e8851efa3dba693" }, "downloads": -1, "filename": "django_iam-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4a9fd54568648b7eb733fe4468f494af", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15162, "upload_time": "2022-05-02T22:10:54", "upload_time_iso_8601": "2022-05-02T22:10:54.216856Z", "url": "https://files.pythonhosted.org/packages/6c/cb/9223eedc848b1f82cab1772b58ea1fefffa07d880bbb7227e9281c336973/django_iam-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8b9112299926df9f194a86add1a153fc", "sha256": "c453d651a2e8cebd676a58399b65ec08484fd3330f397cfc7b9e082780b6cc77" }, "downloads": -1, "filename": "django-iam-0.3.0.tar.gz", "has_sig": false, "md5_digest": "8b9112299926df9f194a86add1a153fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10921, "upload_time": "2022-05-02T22:10:55", "upload_time_iso_8601": "2022-05-02T22:10:55.675706Z", "url": "https://files.pythonhosted.org/packages/53/d4/1786094c830cefee00d421ca3c18d06446a0291130eefdad3417c1c87c33/django-iam-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0rc1": [ { "comment_text": "", "digests": { "md5": "9ca1230f484f4ac79a8eb8b4fd114547", "sha256": "7b05a5bd602d87c28e9d713be0521879c1e5dcb0a470df888c47d8818ec570cb" }, "downloads": -1, "filename": "django_iam-0.3.0rc1-py3-none-any.whl", "has_sig": false, "md5_digest": "9ca1230f484f4ac79a8eb8b4fd114547", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15204, "upload_time": "2022-05-02T20:32:53", "upload_time_iso_8601": "2022-05-02T20:32:53.299956Z", "url": "https://files.pythonhosted.org/packages/3c/46/317d8a54baf52a671c7a1eb6fafc67563a17614446d8b0fe551a8b719135/django_iam-0.3.0rc1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "280f557c05d6f71c53553f18ac4b0d65", "sha256": "1c4c60dfddf86b9fe2a8054c831b0623101c40f8d396f920657c22346b417709" }, "downloads": -1, "filename": "django-iam-0.3.0rc1.tar.gz", "has_sig": false, "md5_digest": "280f557c05d6f71c53553f18ac4b0d65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11016, "upload_time": "2022-05-02T20:32:55", "upload_time_iso_8601": "2022-05-02T20:32:55.130097Z", "url": "https://files.pythonhosted.org/packages/80/9c/344657f46459a55ec5570e24e84117bb42d14a9dbefda021207aaf0c6b83/django-iam-0.3.0rc1.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4a9fd54568648b7eb733fe4468f494af", "sha256": "0fceed738fe10058ea8b5c9c8615a485b92467dd9324b13e8e8851efa3dba693" }, "downloads": -1, "filename": "django_iam-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4a9fd54568648b7eb733fe4468f494af", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15162, "upload_time": "2022-05-02T22:10:54", "upload_time_iso_8601": "2022-05-02T22:10:54.216856Z", "url": "https://files.pythonhosted.org/packages/6c/cb/9223eedc848b1f82cab1772b58ea1fefffa07d880bbb7227e9281c336973/django_iam-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8b9112299926df9f194a86add1a153fc", "sha256": "c453d651a2e8cebd676a58399b65ec08484fd3330f397cfc7b9e082780b6cc77" }, "downloads": -1, "filename": "django-iam-0.3.0.tar.gz", "has_sig": false, "md5_digest": "8b9112299926df9f194a86add1a153fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10921, "upload_time": "2022-05-02T22:10:55", "upload_time_iso_8601": "2022-05-02T22:10:55.675706Z", "url": "https://files.pythonhosted.org/packages/53/d4/1786094c830cefee00d421ca3c18d06446a0291130eefdad3417c1c87c33/django-iam-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }