mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-06-29 15:53:31 +02:00
Developer documentation on roles and permissions
Signed-off-by: Neil Martinsen-Burrell <neil.martinsen-burrell@gsa.gov>
This commit is contained in:
parent
23eb9d448b
commit
7423ba3023
1 changed files with 40 additions and 0 deletions
40
docs/developer/user-permissions.md
Normal file
40
docs/developer/user-permissions.md
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
# User Permissions
|
||||||
|
|
||||||
|
In our registrar application, we need authenticated users (via Login.gov) to
|
||||||
|
be able to access domains that they are authorized to and not to access
|
||||||
|
domains that they are not authorized to. In our initial MVP design, this
|
||||||
|
access is controlled at the domain level, there is no "enterprise" or
|
||||||
|
"organization" layer for assigning permissions in bulk. (See [this
|
||||||
|
ADR](../architecture/decisions/0019-role-based-access-control.md) for more on
|
||||||
|
that decision.)
|
||||||
|
|
||||||
|
## Data modeling
|
||||||
|
|
||||||
|
We need a way to associate a particular user with a particular domain and the
|
||||||
|
role or set of permissions that they have. We use a `UserDomainRole`
|
||||||
|
[model](../../src/registrar/models/user_domain_role.py) with `ForeignKey`s to
|
||||||
|
`User` and `Domain` and a `role` field. There are reverse relationships called
|
||||||
|
`permissions` for a user and for a domain to get a list of all of the
|
||||||
|
`UserDomainRole`s that involve the user or the domain. In addition, there is a
|
||||||
|
`User.domains` many-to-many relationship that works through the
|
||||||
|
`UserDomainRole` link table.
|
||||||
|
|
||||||
|
## Permission decorator
|
||||||
|
|
||||||
|
The Django objects that need to be permission controlled are various views.
|
||||||
|
For that purpose, we add a very simple permission mixin
|
||||||
|
[`DomainPermission`](../../src/registrar/views/utility/mixins.py) that can be
|
||||||
|
added to a view to require that (a) there is a logged-in user and (b) that the
|
||||||
|
logged in user has a role that permits access to that view. This mixin is the
|
||||||
|
place where the details of the permissions are enforced. It can allow a view
|
||||||
|
to load, or deny access with various status codes, e.g. "403 Forbidden".
|
||||||
|
|
||||||
|
## Adding roles
|
||||||
|
|
||||||
|
The current MVP design uses only a single role called
|
||||||
|
`UserDomainRole.Roles.ADMIN` that has all access on a domain. As such, the
|
||||||
|
permission mixin doesn't need to examine the `role` field carefully. In the
|
||||||
|
future, as we add additional roles that our product vision calls for
|
||||||
|
(read-only? editing only some information?), we need to add conditional
|
||||||
|
behavior in the permission mixin, or additional mixins that more clearly
|
||||||
|
express what is allowed for those new roles.
|
Loading…
Add table
Add a link
Reference in a new issue