Friday, September 28, 2012

Configuring List Item Permissions with Workflow


The client had a pretty "simple" situation where:
  1. We want to create a Request list where different people in the company can add requests, but assign it to a department.
  2. Once created, only members in that department has access to this request item
PERMISSION GROUPS
You can use Active Directory groups here as well.  Here are my four security groups
image

DEPARTMENT LIST
I plan to use re-usable workflows later to configure the list item permissions.  So I need to create a few site columns, here's the first one DepartmentGroup.  This is basically a People or Groups field.
clip_image002
I create a list for the department, thus:
clip_image002[7]

REQUEST LIST
Here's the second site column.  This is a lookup column to the Department list.  I'm bringing over the ID field as an additional field.
clip_image002[9]
Add a few records:
clip_image002[11]
clip_image002[13] 
REMOVE LIST PERMISSIONS
Stop inheriting permissions from parent (site), and do a bit of house cleaning and remove the unnecessary groups.

LET'S WORK ON THAT WORKFLOW
The idea of the workflow is that:
  1. Whenever an item is updated
  2. Look up the group based on the selected Department (via the additional ID field)
  3. Assign item-level security to the list item
  4. Remove permissions to modify the item, and grant the department group permission to view and modify that request.
Create a re-usable workflow.  Target any content type.
We'll need the lookup site column, so associate that
clip_image002[15]
The permissions steps need to be run as impersonated steps.  The impersonated steps can not be mixed with the normal steps (such as Step 1)
clip_image002[17]
Remove (unused) Step 1, and add "Replace permission" action
clip_image002[19]
Start with the second parameter which is the easier one.  Click on "this list" and select Current Item
clip_image002[21]
clip_image002[23]
Click on "these permissions" and we want Contribute and Read permissions
clip_image002[25]
Click on "Choose" and set who we'll be granting Contribute/Read to
clip_image002[29]
Select "Workflow Lookup for a User…" and click Add
We want to do a look up on the Department list.
clip_image002[31]
The field we want is DepartmentGroup (our Person and Group site column).  Return the field as Login Name
Set the filter Field below to ID
clip_image002[33] 
Set the filter Value field to Current Item.Department:ID
(You can also use the DepartmentLookup field here, just return it as Integer)
clip_image002[35]
Final result:
clip_image002[37]
OK everything.  Remember to save and publish
clip_image002[39]

Go back to SharePoint list
Configure the workflow and make sure it runs when a list item is created or modified
clip_image002[41]
VERIFY RESULTS Check the permission of our first request (before the workflow)
clip_image002[43]
It is inheriting from list.  Nothing special.
clip_image002[45]

Create a new request for our Network department - see the workflow has completed
clip_image002[47]
Check its permissions
clip_image002[49]
"NetworkHeroes" has been assigned "Contribute" and "Read" permissions to the list item - everyone else has been stripped out.
The List Item has also stopped inheriting permissions from the parent list.

SUMMARY
So the solution works and is relatively elegant.  Though the client mocks me and says it was so much more easier in Lotus Notes :-(
The following features in SharePoint 2010 makes this example a little bit cleaner than with SharePoint 2007:
  • "Additional Fields"
  • Impersonation Step
  • Re-usable Workflows
  • Replace Permissions Action

No comments:

Post a Comment