The proposal seems very different to the access control systems used in commercial systems like SAP or proposed for IEC PAS 61850-90-19 ED1. These systems use a model where a user has a role that has many permissions.
Access control is performed for each user request to read/write data, i.e. an initial step before processing a message request. This is essentially checking for a match between the user/role permissions and the data request
Each permission is a set of { operation, data classes, parameters }
Conceptually permissions refer to classes / identifiers in the main CIM based data.
I'm not sure that permissions per-se belong in CIM but they are data => can be modelled => could be in an ancillary CIM package.
As I understand it, the proposal uses extra associations to a few classes.
But I suspect that what is really needed are extra attributes in the CIM model that can be compared with role permissions. I think at least some of the requests need time-date ranges for the relevant associations, not just for meter readings.
For example:
My understanding of a simple use case related to energy data space.
Customer X gives aggregator Y permission to “read data for customer X for period D1-D2”
(even though they don’t have a CustomerAgreement yet)
Readings has the data
ReadingType lookup data – not personal = no need to access control
MeterReading is associated with UsagePoint = which changes rarely
UsagePoint is associated with the existing CustomerAgreement = which can change = has a date range
CustomerAgreement is associated with Customer = which has a date range
Aggregator Y is associated with Customer X with a new class Permission with 0 to many authorisedReaders
With a date range
So I imagine two queries - a permission check + a data retrieval
SELECT { set of tables/properties AA }
FROM { set of tables/properties BB }
WHERE
(
Requesters identifier = Y
AND Customer identity = X
AND Y is in range [Customer.Permission.authorisedReaders]
AND permission is in date range [D1-D2]
)
And if passed the data retrieval is
SELECT { set of tables/properties A }
FROM { set of tables/properties B }
WHERE
(
Requesters identifier = Y
AND Customer identity = X
AND Y is in range [Customer.Permission.authorisedReaders]
AND CustomerAgreement is associated with Customer for date range [D1, D2]
AND UsagePoint is associated with CustomerAgreement for date range [D1, D2]
AND MeterReading is associated with UsagePoint
AND MeterReading type is active power
AND Reading is associated with MeterReading
AND Readings date IN range [D1, D2]
)