Friday, 22 April 2016

SharePoint online / Office 365 - Column level security - issues and possible options

Hi All,
In this article I’ll explain how to implement site column/field level security so that only authorized users can see the column value
Background : In one of the our SharePoint online project, in one list we need to store the server details and their passwords. Since list contains the passwords for the servers, password column value will only be visible to the IT admin. Rest of the other IT people / users can see other server details but not the Password column values. So we need to find the way to implement the column level security. We need to set the permissions on the Password column.
SharePoint Restrictions / Problem : By default SharePoint does not support the column level permissions. SharePoint only supports unique permissions till Item level. So OOB this scenario is not possible. Also since we have SharePoint online and not on premises there is no option to write the custom field type.
Solution / Approaches :
1. Target Audiences :
i. Creating separate new view and adding Password column only in this view. 
ii. Setting the Target Audiences property for the list viewer web part on this view page as 
Fig1. Target Audiences property
So that user who don't have permission they couldn't see any content on this view.
Problem with this approach: But one possible problem with this approach is if column is added in another view where Target Audiences is not set, then in another view all users can see the Password column values.
When this approach is useful : This approach is useful when there is no another admin for the site. There is only one admin who created the new view and set the Target Audiences. In this scenario there is no problem with this approach. Since no other admin will add the column to the view.
2. Using Password column as Look Up column :
Use Password column as a Look up column from another new list . In our project we are using this approach.
Following are the steps:
i. Consider our main list which have Server details and in this list we need to implement column level security for Password column - call this list as ListA
ii. Create a separate list for the values of Password column. Add the Password column in the list which we want to make secure - call this list as ListB (Lookup list)

iii. Add all the possible values of Password column as list items in ListB

iv. Break the inheritance of ListB

v. Give the permissions to only users who we want to see the Password column values in ListA

vi. Add the above column as a look up column to our main list ListA

vii. Now when user will visit the main list ListA only users who has the permissions to the look up list ListB, only those users can see the values of look up column in ListA
In this way we can have the Password column secured. This is the easiest approach to implement the column level security.
Only problem with this approach is Look up column, say for example if we need to add new password then we need to add it first in ListB (look up list) and then we can use that password in ListA (Main list).
Enjoy Reading :)
As usual any comment / suggestion / query always welcome!

Friday, 1 April 2016

Office 365 / SharePoint online : Lesson learned while deleting the items and restoring items of the list to which workflows are associated

Hi All,

Today few new learnings.
In this article I’ll explain what care should be taken while deleting the items and restoring the items back from the recycle bin, when workflow is associated with the respective list of which items are deleted or restored
Background / Scenario : In our project we have lists to which SharePoint 2010 platform workflow is associated. We have our sandbox solution web part in which we are showing workflow tasks assigned to current user.
Note: Here we don't have option except sand box solution custom web part since we have multiple lists in different different sub sites and respective approval workflows are associated with respective lists so the respective tasks lists.
Also we couldn't use Search since we don't want to be depend on crawling. We tried with CQWP but it was showing throttling exception since in our tasks lists having lots of task items and we need to keep those for auditing purpose so we cant delete them. CQWP showing following exception as :
Figure 1 : CQWP exception for current users tasks

Case 1 : One of the user by mistake deleted the few items from the list, on which workflow already triggered, since those are approval workflows, approval task has already been assigned to the respective approvers. So those tasks are visible in there My Task listings webpart.
But as one of the user has already deleted the list items, approvers couldn't open the task items, it shows error 
You cannot complete this workflow task because the item that the workflow is running on has been deleted. If the item is in your Recycle Bin, restore it, and then try again. ” 
Figure 2 : Error while opening workflow task item whose related item (item on which workflow was running) is deleted

Lesson Learned : By default If we delete any item from the list, there respective workflow tasks items are not get deleted. Those remains as it is and assigned to respective user. Also couldn't find the way to automate this. So need to delete manually.

Case 2: We have restored the deleted list items from the Recycle Bin. As soon as the items are restored in the list respective workflow triggered on these items. Our workflow was approval workflow and sending the mail. So workflow assigned the tasks to respective approvers and sent the mail. Which caused lots of confusion since workflow was already executed when item was created. Later item deleted.

User restored the items and workflow triggered again. 
Lesson Learned : Initially we were not realized that workflow will trigger again when items was restored from the recycle bin. So we understood this, need to be very careful while restoring the items if workflow is associated to the list.

One possible solution to this problem is remove the workflow association and then restore the items and then again associate the workflow.

Enjoy Reading :)
As usual any comment / suggestion / feedback / questions always welcome :)