Defining "Who sees what" and "who does what" are the two important aspects of access control in any software application.
"Security"
is a much larger subject, but this article focuses on just the access
control aspects of Security in a software application.
The Older Paradigm - Roles and Page level access controls
When
you build a custom application for a specific customer, the access
control policies of the organization are often defined upfront as part
of the requirements phase. Depending on the vertical, domain and the
specific organizational structure of the business, first the roles are
defined. And then each role is given access to a set of screens, forms,
pages and reports. What role A sees might be different from what role B
sees. What role A can do could be different from what role B is allowed
to do. Of course, certain areas in the application can be accessed by
multiple roles. While building software products (used by several
customers), the roles are often generalized and predefined. The various
access control policies of the product are often hard coded in to the
roles. The customer will be able to assign one or more roles to their
users.
The new paradigm - Privilege based Access Controls
In
the new paradigm, before doing any action (including showing something
on the screen - which is the View action), you check / demand for the
privilege to view that information or do a certain action. It could be
standard actions such as view, edit and delete or special privileges
such as "Access to History Data" or "Access to information or content
created by people other than myself. In the new paradigm, a user / roles
privileges are resolved during run time - not hard coded at design
time. This allows the product developer to complete the development just
by demanding the necessary privileges at each step, without having to
worry about the users and roles in the system.
Mapping Privileges to Roles
By
enumerating the various privileges (entity wise or form wise standard
privileges as well as special privileges) in an administration screen,
we can allow the end customer to map the privileges to any specific
role, during run time. This takes care of dynamic changes in
organizational policy. This also allows the end customer to create
completely new roles (not originally envisaged by the product designer)
dynamically during actual usage and map a set of privileges to these new
roles using an admin screen.
For example in a HR product, the
product might have default roles such as "Employee" and "Manager"
whereas a customer may create a new role called "Team Leader" or
"Mentor".
Subsequently, users can be assigned with one or more
roles (including new custom roles). So when a user is using the system,
the application can resolve who the user is, what his or her role is,
what the privileges of the role are - all during run time. So before a
particular action, the application can simply check whether the required
privilege is available for the user and proceed. While this may seem
little challenging from the software design/development front, it will
bring in lot of flexibility for the customers.
Relationship based Privileges
Many
a time, mapping privileges to roles and assigning roles to users is
also not adequate. Let us illustrate this with an example:
userx@abc.com
has logged in to a performance management product. She has been
assigned the role of a "Manager" and a set of Privileges have been
assigned to this role. For example she can add certain new skills in the
skills master, which another user with an "Employee" role cannot do.
But
the real challenge however is in defining what she can and cannot see
and what she can and cannot do with respect to the performance appraisal
ratings of various employees.
Out of the 300 people in the
organization, userX, is a "Primary Manager" for 4 employees, "Co-Manager
for 5 employees", "Mentor" for 5 employees, "Department Head for 40
employees", and "Peer" for 15 employees. She is not related to the rest
of the employees in the organization (in the context of performance
management)
The privileges of what each of these "Relationships"
can and cannot do is different. For example, a Mentor can view
performance ratings but cannot edit them. A Primary Manager can edit
ratings, but cannot approve them. And a Department head can
approve/disapprove ratings, but cannot edit them.
How can we allow
userX to login in once, view all the employees related to her in a
single grid, but restrict her access depending on the relationship
between her and the employee on whom she is performing the action?
Step 1: Define relationships in a master: This could be added / edited by the end customer.
Step 2: Map each privilege to a set of relationships who are to be given this privilege.
Step
3: Resolve the relationship between the user and the employee during
run time and accordingly deduce whether the user has or does not have
the privilege to do an action.
Static Data Scope
Apart
from defining what a role can or cannot do / see, we often also want to
restrict the boundaries of the data that the user has access to. For
example, "Can edit employee profile information - but - only for people
in his division / department", "Can see salary details - but only for
employees reporting to her or to her down the line reports". Another
example is to say that the Sales manager can access leads / customers
only from his territory.
These datascopes should not be hard coded in
the product, but should be configurable by an end customer. For each
role and privilege mapping, the data scope can also be mapped.
The
meanings of these datascopes are defined as "Meta data" which are
nothing but Filter conditions. These filter conditions should be
dynamically applied on the data set being accessed during run time,
depending on the role-privilege-data scope resolved for the user
context.
Dynamic Data Scope
This is an extended form of Data scope, where the variable being defined for the data scope is itself defined dynamically.
For
example : "HR Administrator" role assigned to "User A" should
administer for employees in "Location, P, Q and R" and "HR
Administrator" role assigned to "User B" should administer for employees
in "Location S, T and V" - where the location itself is user defined by
the end customer in a Location Master.
Or , Finance Manager
should be able see the books of Divisions "A, B, C and D" where the
Divisions itself is user defined by the end customer in a Division
master.
Multi-tenant Access Control
When
the roles, relationships, privileges, static and dynamic data scopes
are user definable by the end customer, and when the sample application
serves multiple customers / tenants (from a single instance of the
application), then we need to store all these access control
configurations - tenant wise. So during run time, we should not only
resolve the data scopes-privileges-roles-users, but also apply the
tenant context and look up the appropriate tenant specific access
control settings, before deciding to allow or disallow a particular
action in the application.
Privilege mapping should be possible
at the field Level, entity Level, form Level and page Level, so that the
end customer / tenant has absolute control and flexibility in defining
and modifying "Who sees what" and "Who can do what" in the system.
Tying in Subscription/ License Control with Access Control
Different
tenants/ customers/ user groups should be given access or denied access
to different modules and features in the product. This depends on the
package that they have bought (in a SaaS product) or based on the
Organizational Policy (in a Private/ Internal SaaS product).
These
modules and features have to be first defined as Meta data and the
corresponding page level access controls have to be mapped to them. This
will allow the product to hide or show certain menu items and links to
users depending on the tenant context and the packages enabled for that
tenant/ user group.
Usage Based Quota and Access Control
Many
a times tenants are allowed to use the product for a specific no. of
users or for a specified quota of usage (For example can do XXX no. of
market surveys). These transactions and events have to be metered in the
product, and once the defined quota is exceeded, the access control
system should deny access to any user belonging to that tenant / user
group.
Summary
The
Access Control Paradigm of a Multi - tenant Application/ SaaS Product,
should enlarge its frame of reference to include extensive
customizability and configurability to suit different customers and
organizations while still maintaining a single instance and code base.
The
engineering stack of a Multi - tenant SaaS product, should have a
robust and flexible Access Control layer, so that all the dynamic and
run time capabilities are handled at the framework level. The developer
then can focus on building the business functions, follow the guidelines
provided by the underlying framework and demand a privilege before
doing any significant action.
About Author:
Ramkumar is the Founder and
Director of Mango DVM, a venture capital funded company in the digital
music space, currently going through a third round of funding. He is
also the Director of Product Management at Asteor Software Inc, where he
was instrumental in incubating and bringing to market two new software
products (Techcello & Synergita). He is also the Director of RSR
Innovations, a consultancy firm specializing on Strategic Marketing,
Innovation and Leadership Development. Before becoming an entrepreneur,
Ramkumar had spent over two decades in various corporates; in functions
such as Automation Engineering, Project management, Product management,
Marketing and General management.