Terminology:

This is a suggestion for how user data could flow to Grouper in future state

The problem this is trying to solve


Setup entity resolvers

The first configuration step is to set up entity resolvers

For users

Returns

Two types of data fields

Point in time

Assumption

All institutions are either

Data field resolver loads the data


Subject source


When data fields are referenced, also a two part process.  If a group (and user allowed to see), go to group table(s), if anything other than a group, then its the data field tables

Loaders

UI/WS

Provisioning

Summary

In summary here is a metaphor... we used to have SQL credentials in multiple places, then we made an external system layer to re-use that.  This suggested is similar.  Have a data layer that can we re-used across things.  Includes real-time updates, security, and data manipulation configured centrally...  why?  if we want to be ABAC and data field-based, we need to organize our data fields

Data model

grouper_members

Existing table can be stripped down since data is in the entity tables

grouper_members_identifiers

Make sure unique identifiers.

When subjects are looked up, it can be a two part process (instead of N-part for N subject sources).

  1. Look at groups in group table,
  2. Look at entities (including GrouperSystem, users, apps, things) in the data_field tables based on data fields that are marked as identifiers

grouper_data_field

Types of data fields for user or rows

grouper_data_row

Type of data field rows available for users

grouper_data_row_field

Which fields are in which rows

grouper_data_member_field

Assignment of a data field to an entity.   When data is synced to the data field tables it will need to do some matching and assign a new grouper_members row if existing not found

grouper_data_member_changelog

Events that happen to data fields to be processed by loaders/provisioners/etc.  Keep data for a week then delete

grouper_data_member_field_pit

History of data field to entity

grouper_data_member_row

Assignment of a row of data to an entity

grouper_data_member_row_pit

HIstory of assignment of a row of data to an entity

grouper_data_member_row_field

Assignment of a field to a row assignment

grouper_data_member_row_field_pit

History of assignment of a field to a row assignment

grouper_dictionary

Keep data field values here to reduce data redundancy


grouper_data_field_sec_group_mem_cache

Cache these memberships so lookups are fast.  Cache this in memory too for long running processes.  The groups that are cached are... any groups that secure fields, any groups that secure rows, etc

grouper_data_field_row_sec

Row level security for data

grouper_data_field_row_pop_group