Index: openacs-4/packages/acs-core-docs/www/permissions-design.html =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-core-docs/www/permissions-design.html,v diff -u -r1.6.2.7 -r1.6.2.8 --- openacs-4/packages/acs-core-docs/www/permissions-design.html 29 Apr 2003 05:58:34 -0000 1.6.2.7 +++ openacs-4/packages/acs-core-docs/www/permissions-design.html 7 May 2003 17:40:59 -0000 1.6.2.8 @@ -1,14 +1,11 @@ -OpenACS 4 Permissions Design

OpenACS 4 Permissions Design

+OpenACS 4 Permissions Design

OpenACS 4 Permissions Design

by John Prevost and Rafael H. Schloming
OpenACS docs are written by the named authors, and may be edited by OpenACS documentation staff. -

Essentials

Introduction

The goal of the Permissions system is to provide generic means to both -programmers and site administrators to designate operations (methods) as -requiring permissions, and then to check, grant, or revoke permissions via a +

Essentials

Introduction

The goal of the Permissions system is to provide generic means to both +programmers and site administrators to check, grant, or revoke permissions via a consistent interface. For example, we might decide that the transaction that bans a user from a sub-site is an operation a site administrator is able to assign to a particular user. Or perhaps an application developer might decide @@ -17,13 +14,11 @@ Permissions system will be seeing a lot of use - almost every page will make at least one permissions API call, and some will make several.

For programmers, the Permissions API provides a means to work with access control in a consistent manner. If a programmer's OpenACS package defines new -methods for itself, the Permissions API must provide simple calls to -determine whether the current user is authorized to perform the given method. -In addition, using the Permissions API, queries should easily select only +privilege for itself, the Permissions API must provide simple calls to +determine whether the current user is has been granted that privilege on a given +object. In addition, using the Permissions API, queries should easily select only those package objects on which a user has certain permissions.

For site administrators and other authorized users, the Permissions UI -provides a means to aggregate the primitive operations (methods) made -available by the programmer into logical privileges (like read, write, and -admin) that can be granted and revoked.

Historical Considerations

In earlier versions of the OpenACS, permissions and access control was handled +provides a means to grant and revoke privileges on objects.

Historical Considerations

In earlier versions of the OpenACS toolkit, permissions and access control was handled on a module-by-module basis, often even on a page-by-page basis. For example, a typical module might allow any registered user to access its pages read-only, but only allow members of a certain group to make changes. The way @@ -34,118 +29,98 @@ control were many, the two major ones being inconsistency, and repeated/redundant code. Thus the drive in OpenACS 4 to provide a unified, consistent permissions system that both programmers and administrators can -readily use.

Competitive Analysis

None available as of 10/2000.

Design Tradeoffs

The core of the permissions data model is quite simple. Unfortunately, the +readily use.

Design Tradeoffs

The core of the permissions data model is quite simple. Unfortunately, the hierarchical nature of default permissions entails quite a number of tree queries which could slow the system down. Since every page will have at least one permissions check, a number of views and auxiliary tables (de-normalizations of the data model) have been created to speed up access queries. As a consequence, speed of updates are decreased and requirements -for additional storage space increase.

Data Model Discussion

As described in section V., the core of the permissions data model is -simple, though a number of views and auxiliary tables exist to ensure -adequate performance. The core model consists of five tables:

acs_methods +for additional storage space increase.

Data Model Discussion

The core model consists of three tables:

acs_privileges -

The set of all defined methods.

acs_privileges +

The set of all defined privileges.

acs_privilege_hierarchy -

The set of all defined privileges.

acs_privilege_method_rules - -

A relation describing the set of methods directly -associated with each privilege.

acs_privilege_hierarchy -

A relation describing which privileges directly -"contain" other privileges.

acs_permissions +"contain" other privileges.

acs_permissions

A table with one (party, object, privilege) row for every privilege directly granted on any object in -the system - this is a denormalization of -acs_privilege_method_rules and -acs_privilege_hierarchy

There are also a number of views to make it easier to ask specific +the system. +

There are also a number of views to make it easier to ask specific questions about permissions. For example, a number of the above tables describe "direct" or explicit permissions. Inheritance and default values can, however, introduce permissions which are not directly specified. (For example, read access on a bboard allows read access on all the messages in the bboard.)

The following views provide flattened versions of inherited -information:

acs_privilege_method_map +information:

acs_object_grantee_priv_map -

Map of privileges to the methods they contain either directly or because -of another privilege which is included (at any depth).

acs_object_grantee_priv_map -

Relation on (object, party, privilege) for -privileges from acs_privileges) granted directly on the object, or -on the context of the object (at any depth).

acs_object_party_privilege_map +privileges from acs_privileges) granted directly on the object, or +on the context of the object (at any depth).

acs_object_party_privilege_map

Relation on (object, party, privilege) for -privileges directly from acs_object_grantee_priv_map or also because -a party is a member of a group (at any depth).

acs_object_party_method_map - -

Relation with every (object, party, method) -tuple implied by the above trees.

In general, only acs_object_party_method_map -should be used for queries from other modules. The other views are -intermediate steps in building that query.

The data model also includes two simple PL/SQL procedures -(acs_permission.grant_permission and -acs_permission.revoke_permission) for granting and revoking a +privileges directly from acs_object_grantee_priv_map or also because +a party is a member of a group (at any depth). This view is normally used in an exists +clause to constrain the rows returned by a query to those on which a given party has a given privilege.

The data model also includes two simple PL/SQL procedures +(acs_permission.grant_permission and +acs_permission.revoke_permission) for granting and revoking a specific privilege for a specific user on a specific object.

To sum up, the PL/SQL procedures are meant to be used to grant or revoke -permissions. The five base tables represent the basic data model of the +permissions. The three base tables represent the basic data model of the system, with a set of views provided to convert them into a format suitable for joining to answer specific questions. The exact means by which this transformation takes place should not be depended on, since they may change for efficiency reasons.

The transformations done create a set of default permissions, in which:

  • parties get the privileges of any groups they are directly or indirectly -a member of

  • privileges get associated with the methods of any other privileges they -have taken methods from (at any level) (see -acs_privilege_hierarchy)

  • objects get access control from direct grants, or inherit permissions +a member of

  • objects get access control from direct grants, or inherit permissions from their context (unless the "don't inherit" flag is -set)

Legal Transactions

There are three essential areas in which all transactions in the -permissions system fall:

  • Modification of methods and privileges

  • Modification of permissions

  • Queries on permissions

"Modification of methods and privileges." This +set)

Legal Transactions

There are two essential areas in which all transactions in the +permissions system fall (a privilege is a an operation like "read", +permissions define which parties have which privileges on which +objects):

  • Modification of privileges

  • Modification of permissions

  • Queries on permissions

"Modification of privileges." This refers to actions that happen mainly at package installation time - a package -will create a number of methods for its own use, then associate them with the -system's standard privileges, or new privileges which the package has -created. The association step might also happen later, if the site-wide -administrator chooses to change permissions policy.

These steps involve directly manipulating the acs_methods, -acs_privileges, and acs_privilege_method_rules tables. A -web page for manipulating these features should be limited to site-wide -administrators.

"Modification of permissions" - involves fairly +may create new privileges and aggregations of privileges. This should be done with care, as +each additional privilege and parent-child privilege relationship added to the system +decreases the performance of the permissions system. Historically, packages have created +their own versions of common privileges like "read" or "write" rather than use the global +permissions created by the kernel. This practice is now discouraged as it adds no +usable functionality, makes the design and implementation of general-purpose permissions UI pages +more difficult, and as mentioned previously negatively impacts performance. +

"Modification of permissions." - involves fairly common operations. Users are typically able to administer permissions for objects they themselves create. The two basic operations here are "grant" and "revoke". Granting permissions is done via -acs_permissions.grant_permission, and revocation via -acs_permissions.revoke_permission. These directly manipulate the -acs_permissions table.

Web pages for making these changes are available to all users, so they +acs_permissions.grant_permission, and revocation via +acs_permissions.revoke_permission. These directly manipulate the +acs_permissions table.

Web pages for making these changes are available to all users, so they should not be in an admin area. In order to grant and revoke permissions on -an object, the user must have the administer_privileges method -permission on that object.

"Queries on permissions" - by far the most +an object, the user must have the admin +privilege on that object.

"Queries on permissions" - by far the most common operation is querying the permissions database. Several kinds of questions are commonly asked: First, and most commonly, "Can this party -perform this method on this object?" Two Tcl functions are provided to +perform this operation on this object?" Two Tcl functions are provided to answer this - one which returns a boolean, the other of which results in an -error page. These tcl functions directly access the -acs_object_party_method_map.

The second most commonly asked question occurs when a list of objects is -being displayed, often in order to provide appropriate UI functionality: -"For this party, what methods are available on these objects?" +error page.

The second most commonly asked question occurs when a list of objects is +being displayed, often in order to provide appropriate UI functionality. Here, the SQL query needs to filter based on whether the party/user can -perform some operation on the object. This is done via a join or sub-select -against acs_object_party_method_map, or by calling the Tcl functions -for appropriate methods.

Finally, when administering the permissions for an object, a web page +perform some operation on the object. This is done by using an exists +clause that returns a value if any row exists in the acs_object_party_privilege_map +view with the given party, object and privilege.

Finally, when administering the permissions for an object, a web page needs to know all permissions directly granted on that object. This is done -by querying against acs_permissions.

API

The API to the permissions system consists of a few well-known tables, -plus a pair of PL/SQL procedures and a pair of Tcl functions.

Tables

acs_methods, acs_privileges, and -acs_privilege_method_rules manage the set of permissions in the -system. At installation time, a package will add to these three tables to -introduce new permissions into the system.

The main table for queries is acs_object_party_method_map, which -contains (object, party, method) triples for all -allowed operations in the system.

Also of interest for queries is acs_permissions, which lists -directly granted privileges. Neither acs_object_party_method_map -(which is a view) nor acs_permissions should be updated -directly.

PL/SQL Procedures

acs_permissions.grant_permission introduces new permissions for +by querying against acs_permissions.

API

The API to the permissions system consists of a few well-known tables, +plus a pair of PL/SQL procedures and a pair of Tcl functions.

Tables and views

The main view for queries is acs_object_party_privlege_map, which +contains (object, party, privilege) triples +for all allowed operations in the system.

Also of interest for queries is acs_permissions, which lists +directly granted privileges. Neither acs_object_party_privilege_map +(which is a view) nor acs_permissions should be updated +directly.

PL/[pg]SQL Procedures

acs_permissions.grant_permission introduces new permissions for an object. It should be given an (object, party, privilege) triple, and will always succeed. If the permission is -already in the system, no change occurs. The interface for this procedure -is:

+already in the system, no change occurs.

The interface for this procedure is:

 procedure grant_permission (
   object_id    acs_permissions.object_id%TYPE,
   grantee_id   acs_permissions.grantee_id%TYPE,
   privilege    acs_permissions.privilege%TYPE
 );
-

acs_permissions.revoke_permission removes a permission entry +

acs_permissions.revoke_permission removes a permission entry given a triple. It always succeeds--if a permission does not exist, nothing changes. The interface for this procedure is:

 procedure revoke_permission (
@@ -154,15 +129,14 @@
   privilege    acs_permissions.privilege%TYPE
 );
 

These procedures are defined in -permissions-create.sql

Tcl Procedures

Two tcl procedures provide a simple call for the query, "Can this +permissions-create.sql

Tcl Procedures

Two tcl procedures provide a simple call for the query, "Can this user perform this method on this object?" One returns true or false, the other presents an error page.

To receive a true or false value, Tcl code should call:

-ad_permission_p $object_id $object_type $method -user_id $user_id
-

If the user_id argument is left out, then the currently logged in -user is checked. To create an error page, Tcl code should call:

-ad_require_permission $object_id $object_type $method
-

These procedures are defined in acs-permissions-procs.tcl.

User Interface

All users of the permissions system are the same at the user-interface -level. If you have the administer_privileges method permission on an +permission::permission_p -party_id $party_id -object_id $object_id -privilege $privilege +

To create an error page, Tcl code should call:

+permission::require_permission -party_id $party_id -object_id $object_id -privilege $privilege
+

These procedures are defined in acs-permissions-procs.tcl.

User Interface

All users of the permissions system are the same at the user-interface +level. If you have the admin privilege on an object, then you may edit privileges for that object with the UI.

The UI currently provides a list of all granted permissions on the object. If the user wishes to revoke privileges, she may select a set of grants, choose revoke, confirm their deletion, and be returned to the same page after @@ -173,15 +147,15 @@ one object" screen.

If it makes sense, the system will also display a checkbox which the user may select to toggle whether permissions are inherited from the object's context.

There are a number of potential future enhancements for the permissions -UI, outlined below.

Configuration/Parameters

There are no configuration options for the permissions system.

Future Improvements/Areas of Likely Change

The most important future changes to the Permissions system are likely to +UI, outlined below.

Configuration/Parameters

There are no configuration options for the permissions system.

Future Improvements/Areas of Likely Change

The most important future changes to the Permissions system are likely to be in the UI:

  • There should be a page displaying a list of all objects for which the current user is allowed to administer privileges.

  • Users should be able to view the permissions on any object, or perhaps on objects which they have the "read_permissions" method. This would allow them to see what grants are affecting their objects through -inheritance.

Authors

System creator +inheritance.

Authors

System creator -

Rafael H. Schloming

System owner +

Rafael H. Schloming

System maintainer -

Rafael H. Schloming

Documentation author +

Don Baccus

Documentation author -

John Prevost

Revision History

Document Revision #Action Taken, NotesWhen?By Whom?
0.1Creation9/11/2000John Prevost
0.2Edited for ACS 4 Beta release10/04/2000Kai Wu
View comments on this page at openacs.org
+

John Prevost

Revision History

Document Revision #Action Taken, NotesWhen?By Whom?
0.1Creation9/11/2000John Prevost
0.2Edited for ACS 4 Beta release10/04/2000Kai Wu
0.3Edited for OpenACS 4.6.305/04/2003Don Baccus
View comments on this page at openacs.org