-
Notifications
You must be signed in to change notification settings - Fork 52
Description
Current (legacy) situation
On Invenio 1.X records are restricted based on collection rights (if the record is not in any collection it is restricted to the owner and the admins).
Also there is the possibility to grant access to a specific record inside a restricted collection by using certain MARC tags, i.e 506
Migration problem
Sometimes two collections were created artificially to restrict a set of records, i.e. "Videos" and "Restricted Videos".
Moreover in the situation where one gives access to a record inside the restricted collection to a given person, this person can't search for the record she/he is allow to see inside the restricted collection. This kind os technic allows the users to see the record only if they know the URL.
This artificial separation between public and restricted records can now be achieve using facets.
Proposal
Store the access rights inside the metadata of the record, i.e.
{
"_access": {
"read": {
"system": ["group_a", "group_b"],
"user": ["user_1@example.com"]
}
}
}The so called system field stores the access rights derived by the system from, for example, the collections/communities that the record belongs to. This field should not be modified by anyone except by the system.
On the other hand the user field is meant to be modify by the users, for example upon submission, so the user submitting something can decide to share her/his work with some else which is not part of the community.
If both fields are empty, the record is public.
Possible problems with this solution
- Potentially the records will get modify just to change the access rights and this will generate unnecessary versions.
- If we combine this solution with collections (or any other thing defining access rights) we need to be sure the access rights are correctly propagated to the record.
Possible benefits of this solution
- Potentially the records will get modify just to change the access rights and this will generate a useful trace of the evolution of the access rights (maybe easier to combine with memento API if we want to expose all the versions).
- Makes migration much easier eliminating the headache of cleaning the collection tree and the access right definitions for
viewrestrcollaction. - Access rights are defined in one place, so answering questions like "why don't I have access to this record?" are much easier to answer.
We have made a small proof of concept on the CDS overlay
Counterproposal
Migrate the viewrestrcoll action as it is, creating a parametrised action, and when migrating the records also migrate the collections they belong to so they can be used to decide whether a user has access to a given record or not.
Possible problems with this solution
- The "user" access rights definitions have to be migrated and treated in the same way as in the first proposal.
- All the access rights definitions are going to be migrated, meaning a cleanup in the current system needs to be done (always talking from the point of view of v1.2 -> v3.0 migration)
Possible benefits of this solution
- Access rights don't need to be propagated to the record.
Note for the reader
The RFC might seems "migration driven" but, regardless if one starts clean or from an existing system, the way access rights are defined IMHO should be the same for the sake of everyone 😉
CC @inveniosoftware/triagers @omelkonian