This makes perfect sense. And I agree that we can handle this merely by
using a naming convention. For sake of not changing the names of the bulk
of existing privileges (and privilege.name is the pk of that table), I
propose that we go with:

(api-level privileges, stick with the same naming)

   - View Xyz (for metadata and data)
   - Manage Xyz (for metadata)
   - Add Xyz, Edit Xyz, Delete Xyz, Purge Xyz (for data)

(application-level privileges, follow the pattern from
patientDashboardForm.jsp)

   - Page Name - View Xyz Section


(Ironically patientDashboardForm.jsp is the *only* jsp page I'm aware of
where we've actually done this right. So yes, good choice of example. :-) )

So, I guess the proper solution is to look at all of our jsp and jsp-like
files (.tag, and anything else?) for <openmrs:hasPrivilege, and identify
every one of those in core (and ideally also bundled modules) that uses an
API-level privilege. (This will be 90% of them.)

Then, for this list of privilege checks, we need to:
1. create a new, matching application-layer privilege
2. switch the jsp to check against the new privilege
3. write a liquibase changeset that will grant the new application-level
privilege to every role that has the old api-level privilege.

-Darius

On Wed, May 9, 2012 at 11:16 PM, Dave Thomas <pihd...@gmail.com> wrote:

> First I apologise for using the dashboard as an example -- it was
> hypothetical, and therefore crappy.
>
> And yes, your suggestion is exactly right, but it's a pattern that I think
> should be applied globally, and not just to the patient dashboard
> components.
>
> Here's another example:  'View Concepts' is required by gutter.jsp to show
> the Dictionary gutter item.  There's no reason why our data officers or lab
> technicians need to be looking up concepts through the UI.  They just need
> to be able to fill out forms and look at patient records for data quality.
> We've also had instances where research staff have looked for Concepts
> associated with specific forms without really knowing the correct way to do
> this, which resulted in bad data being exported.  Without access to the
> Dictionary, they would have been forced to ask us for help.
>
> So there are a couple of groups of people for whom i'd like to hide the
> Dictionary gutter item.
>
> But if you take away 'View Concepts' for a user, this basically breaks all
> of OpenMRS for that user.  More than 1/2 the ConceptService requires this
> privilege.
>
> This is kind of an extreme example in terms of the functionality that
> would be lost by removing the privilege.  I feel like we've run into more
> subtle 'accidental' restrictions mistakes that might only manifest
> themselves in 1 or 2 unexpected places, sometimes in a module, or maybe in
> the various reporting mechanisms we've used.
>
> What i think would be a good step forward would be a complete separation
> between privileges used by the app layer and privileges used by the api,
> which I think could be handled through naming conventions for privileges.
> This doesn't require any new architecture, but would greatly increase the
> granularity of what you can restrict and for whom.  Privileges used
> concurrently in app and api layers are too blunt of an instrument, and lead
> to (sometimes strikingly) sub-optimal role configurations.
>
> I know that increased granularity seems like it would lead to greater
> complexity for implementations, but i'd argue that at least in our
> experience its the opposite.
>
> Does this make sense?
>
> d
>
>
> On Wed, May 9, 2012 at 5:24 PM, Darius Jazayeri 
> <djazayeri+...@gmail.com>wrote:
>
>> All dashboard tabs *do* have application-level privileges already. At
>> least in 1.9.x, patientDashboardForm.jsp has:
>>
>> <openmrs:hasPrivilege privilege="Patient Dashboard - View Overview
>> Section">
>> <openmrs:hasPrivilege privilege="Patient Dashboard - View Regimen
>> Section">
>> <openmrs:hasPrivilege privilege="Patient Dashboard - View Visits Section">
>> <openmrs:hasPrivilege privilege="Patient Dashboard - View Encounters
>> Section">
>> <openmrs:hasPrivilege privilege="Patient Dashboard - View Demographics
>> Section">
>> <openmrs:hasPrivilege privilege="Patient Dashboard - View Graphs Section">
>> <openmrs:hasPrivilege privilege="Form Entry">
>>
>>
>> However looking at patientOverview.jsp I see we refer to the underlying
>> API-level privileges:
>>
>> <openmrs:hasPrivilege privilege="View Patient Programs">
>> <openmrs:hasPrivilege privilege="View Relationships">
>> <openmrs:hasPrivilege privilege="View Allergies">
>> <openmrs:hasPrivilege privilege="View Problems">
>>
>>
>> Seems like we should write a ticket to:
>>
>>    1. introduce new privileges like "Patient Overview - View Programs
>>    Section", etc
>>    2. use those in all dashboard portlets rather than the API
>>    counterparts
>>    3. do a liquibase changeset so that every role that has "View Patient
>>    Programs" also gets "Patient Overview - View Programs Section", etc. (That
>>    way nobody loses the ability to see something they currently see.)
>>
>> Dave, would that help?
>>
>> Daniel, want to do this?
>>
>> -Darius
>>
>>
>> On Wed, May 9, 2012 at 2:33 PM, Dave Thomas <pihd...@gmail.com> wrote:
>>
>>> Burke, sorry for not being clear before.  I think what you said in #1 is
>>> pretty much what i'm asking for.
>>>
>>> The terminology can be worked out (to use your example 'Access' could
>>> imply API-level privileges, and 'View' could imply app-level privileges),
>>> but the important thing to me would be to not have 'Access Patient Data'
>>> sometimes be applied at the API level and sometimes applied at the app
>>> level.  With 'Access Patient Data' used at both the API and app layers, if
>>> I restrict 'Access Patient Data' for a user, it is incredibly difficult to
>>> tell what i've actually restricted.  This is when pieces of the
>>> application, other than the one I was trying to restrict, start throwing
>>> errors unexpectedly (per mark's example).
>>>
>>> Part two of this argument (and maybe this is a different discussion)
>>> would be that once there was a clear distinction between api and app level
>>> privileges, the app level privileges could start to reflect actual UI
>>> components a little more.  If each portlet on the patient dashboard had its
>>> own privilege for example, like 'view regimen tab', the UI would be a LOT
>>> more easy to customise in a meaningful way using privileges and roles.
>>>
>>> d
>>>
>>>
>>> On Wed, May 9, 2012 at 1:43 PM, Burke Mamlin <bmam...@regenstrief.org>wrote:
>>>
>>>> Mark,
>>>>
>>>> This is an interesting point.  Your example helps me understand Dave's
>>>> point and suggests that we should distinguish between "Access Patient Data"
>>>> and "View Patient Data" – i.e., the use of "View" in the privilege term
>>>> describing API-level access to data per our conventions implies that
>>>> getting data at the API level also means that the user should be able to
>>>> view it within the application, which is not always the case.  In your
>>>> example (a person being able to view aggregate patient data without viewing
>>>> individual patient records), we have two choices:
>>>>
>>>>    1. Grant the user "Access Patient Data" as the API-level privilege,
>>>>    meaning that they would be permitted to execute API calls that return
>>>>    patient information, but would not imply that the application should let
>>>>    them view the data directly.
>>>>
>>>>    2. Allow the methods that need to access patient data to proxy
>>>>    privileges for the user.
>>>>
>>>> The first seems like the better option to me.  Proxying privileges
>>>> seems like a hacky way to override privileges that are there for a reason.
>>>>  The first option will take some effort (maybe more than the upcoming
>>>> sprint can muster), but seems like a better long-term solution.  Maybe we
>>>> can come up with a way to start heading that direction.
>>>>
>>>> -Burke
>>>>
>>>>
>>>> On Wed, May 9, 2012 at 3:55 PM, Mark Goodrich <mgoodr...@pih.org>wrote:
>>>>
>>>>> +1 for this.  We’ve run into issues with this a lot.  For instance,
>>>>> say you have a user who should not be able to view patients, but should
>>>>> have access to a report of aggregate patient data that calls getPatients()
>>>>> behind the scenes to perform the necessary calculations.  If you take away
>>>>> the “view patient” privilege from the user, they’ll get a stack trace when
>>>>> they attempt to execute the report.****
>>>>>
>>>>> ** **
>>>>>
>>>>> This issue has been prevalent enough for us that we basically are
>>>>> unable to use privileges and roles for access control … ****
>>>>>
>>>>> ** **
>>>>>
>>>>> Mark****
>>>>>
>>>>> ** **
>>>>>
>>>>> ** **
>>>>>
>>>>> *From:* dev@openmrs.org [mailto:dev@openmrs.org] *On Behalf Of *Dave
>>>>> Thomas
>>>>> *Sent:* Wednesday, May 09, 2012 2:51 PM
>>>>> *To:* openmrs-deve...@listserv.iupui.edu
>>>>> *Subject:* Re: [OPENMRS-DEV] Roles and Privileges Sprint****
>>>>>
>>>>> ** **
>>>>>
>>>>> If i can weigh in on a discussion of roles and privileges briefly,
>>>>> I've found (and maybe things are improved in versions greater than 1.6.x)
>>>>> that we've run into trouble when a privilege is used both at the api and
>>>>> web layer.  This happens when we want to hide something in the UI that is
>>>>> wrapped in a <privilege/> tag, but then when we remove that privilege for 
>>>>> a
>>>>> user, it turns out that the same privilege was wrapped around a couple of
>>>>> API methods, causing unexpected and hard-to-track-down UI problems across
>>>>> all of openmrs.
>>>>>
>>>>> If there's a dedicated pass at roles+privileges, has there been any
>>>>> thought to separating api privileges from ui privileges?  I kind of feel
>>>>> like this is low-hanging fruit.  This wouldn't even need re-architecting,
>>>>> maybe just privilege naming conventions?
>>>>>
>>>>> Or is the general sense that this type of problem has disappeared in
>>>>> newer versions?
>>>>>
>>>>> d****
>>>>>
>>>>> On Wed, May 9, 2012 at 10:29 AM, Burke Mamlin <bu...@openmrs.org>
>>>>> wrote:****
>>>>>
>>>>> (bringing this conversation about preparing for the Roles & Privileges
>>>>> sprint onto the dev list)****
>>>>>
>>>>> ** **
>>>>>
>>>>> Reviewing the notes <http://notes.openmrs.org/2012-roadmap> on Roles
>>>>> & Permissions section from Jembi & PIH, it looks like there are some
>>>>> fundamental improvements requested:****
>>>>>
>>>>>    - Ship OpenMRS with pre-defined roles****
>>>>>    - Better documentation on managing roles (avoiding pitfalls)****
>>>>>    - More informative handling of privilege exceptions (make it
>>>>>    easier to understand where/which privileges are missing)****
>>>>>    - Data-level permissions (restricting access to specific data
>>>>>    based on privileges)****
>>>>>
>>>>> We've had prior conversations about improving roles/privileges:****
>>>>>
>>>>>    - Avoiding the common pitfall of conflating organizational roles
>>>>>    (job title) with application roles (authorization within OpenMRS); 
>>>>> they may
>>>>>    align early on in simple systems, but exceptions are common over time 
>>>>> or as
>>>>>    a a system grows.****
>>>>>    - Creating privilege groups vs. programmatically defined roles –
>>>>>    e.g., a web page wants to limit access to those who have a set of
>>>>>    privileges.****
>>>>>    - Introducing location-based privileges****
>>>>>
>>>>> There seem to be some potential short-term wins that could be done in
>>>>> the sprint:****
>>>>>
>>>>>    - Improve our documentation to better introduce people to roles &
>>>>>    privileges and cover the common pitfalls.****
>>>>>    - Improve privilege error messages in core and/or create a module
>>>>>    that makes it easier to troubleshoot privilege errors (e.g., log all
>>>>>    privilege checks during an operation and present the unique list of
>>>>>    privileges and/or roles that would cover the operation, allowing 
>>>>> someone to
>>>>>    step through a workflow as superuser and then see the list of 
>>>>> privileges
>>>>>    required to complete the workflow).****
>>>>>    - Come up with some basic application roles that can be
>>>>>    pre-defined within OpenMRS (ship with the application)****
>>>>>    - Design (and, if possible, implement) an approach for privilege
>>>>>    groups or system roles (i.e., uneditable sets of privileges that
>>>>>    applications can program against)****
>>>>>
>>>>> Data-level privileges (limiting access to data based on privileges)
>>>>> would be a terrific addition, but I'm afraid it will take more design that
>>>>> we can muster between now & the beginning of this sprint.  Maybe we could
>>>>> come up with some small but useful first attempts at solving this problem
>>>>> (e.g., a module requiring permissions to access certain observations … or 
>>>>> a
>>>>> module that limits access to specific patients based on permissions).*
>>>>> ***
>>>>>
>>>>> ** **
>>>>>
>>>>> Cheers,****
>>>>>
>>>>> ** **
>>>>>
>>>>> -Burke****
>>>>>
>>>>> ** **
>>>>>
>>>>> On Wed, May 9, 2012 at 9:49 AM, Burke Mamlin <bu...@openmrs.org>
>>>>> wrote:****
>>>>>
>>>>> Looking back at notes from AMPATH, the only reference to anything
>>>>> close to roles & privileges I found was the desire for the Data Entry
>>>>> Statistics Module to have a basic view privilege that allows a data
>>>>> assistant to see only his/her own statistics.****
>>>>>
>>>>> ** **
>>>>>
>>>>> -Burke****
>>>>>
>>>>> ** **
>>>>>
>>>>> On Wed, May 9, 2012 at 9:44 AM, Ben Wolfe <b...@openmrs.org> wrote:****
>>>>>
>>>>> Dawn found this link for me:
>>>>> http://notes.openmrs.org/2012-roadmap
>>>>>
>>>>> Is has the (mostly raw) notes from the calls we had with
>>>>> Jembi/PIH/AMPATH.
>>>>>
>>>>> Daniel, can you tease out the topics from that and the other text
>>>>> below in the next 4 hours?
>>>>>
>>>>> Ben****
>>>>>
>>>>> ** **
>>>>> ------------------------------
>>>>>
>>>>> Click here to 
>>>>> unsubscribe<lists...@listserv.iupui.edu?body=SIGNOFF%20openmrs-devel-l>from
>>>>>  OpenMRS Developers' mailing list
>>>>> ****
>>>>>
>>>>> ** **
>>>>> ------------------------------
>>>>>
>>>>> Click here to 
>>>>> unsubscribe<lists...@listserv.iupui.edu?body=SIGNOFF%20openmrs-devel-l>from
>>>>>  OpenMRS Developers' mailing list
>>>>> ****
>>>>> ------------------------------
>>>>> Click here to 
>>>>> unsubscribe<lists...@listserv.iupui.edu?body=SIGNOFF%20openmrs-devel-l>from
>>>>>  OpenMRS Developers' mailing list
>>>>>
>>>>
>>>> ------------------------------
>>>> Click here to 
>>>> unsubscribe<lists...@listserv.iupui.edu?body=SIGNOFF%20openmrs-devel-l>from
>>>>  OpenMRS Developers' mailing list
>>>>
>>>
>>> ------------------------------
>>> Click here to 
>>> unsubscribe<lists...@listserv.iupui.edu?body=SIGNOFF%20openmrs-devel-l>from 
>>> OpenMRS Developers' mailing list
>>>
>>
>> ------------------------------
>> Click here to 
>> unsubscribe<lists...@listserv.iupui.edu?body=SIGNOFF%20openmrs-devel-l>from 
>> OpenMRS Developers' mailing list
>>
>
> ------------------------------
> Click here to 
> unsubscribe<lists...@listserv.iupui.edu?body=SIGNOFF%20openmrs-devel-l>from 
> OpenMRS Developers' mailing list
>

_________________________________________

To unsubscribe from OpenMRS Developers' mailing list, send an e-mail to 
lists...@listserv.iupui.edu with "SIGNOFF openmrs-devel-l" in the  body (not 
the subject) of your e-mail.

[mailto:lists...@listserv.iupui.edu?body=SIGNOFF%20openmrs-devel-l]

Reply via email to