+1-888-365-2779
Try Now
More in this section

Forums / Developing with Sitefinity / Limit widgets in PageControls toolbox for certain roles/users

Limit widgets in PageControls toolbox for certain roles/users

6 posts, 0 answered
  1. Denis
    Denis avatar
    105 posts
    Registered:
    27 Feb 2009
    26 Jan 2013
    Link to this post

    I have a requirement - some editors don't have to see some widgets, like: navigation, data, javascript, etc. We need to make them see only basic content widgets: content block, image, etc. I'm speaking about Pages module, backend page edit functionality.

    Not sure how to do it in Sitefinity 5.3. Was searching on forums and found solution for Sitefinity 3. Can I do something similar for Sitefinity 5? Can I override how PageControls toolbox is contracted some how? Also, some topics mention Policy functionality, but looks like it doesn't work.

    Please advice how to do this.
    Thanks,
    Denis.

  2. Jen Peleva
    Jen Peleva avatar
    568 posts
    Registered:
    10 Nov 2016
    31 Jan 2013
    Link to this post
    Hello Denis,

    You can achieve this by registering a custom pageEditorRouteHandler in the Global.asax file.

    The sample allows you to restrict access to any number of widgets based on a role. This is configured through a new setting in the toolbox section called disallowed roles. All you have to do is include the code sample in your project and enumerate the disallowed roles in your configurations.

    Instructions

    Unpack the attached code sample

    Include the Global.asax file in your project root

    You can add rules from the toolbox settings in your administration. You are able to set the different deny rules for a specific set of roles separated by a coma. Create a new Toolbox Item parameter called DisallowedRoles for any control and set the list of roles. Here is a screenshot of a sample configuration:

    I have attached the custom RouteHandler, where we specify the logic for displaying toolbox items for users from particular role only.

    Kind regards,
    Jen Peleva
    the Telerik team
  3. Stefani Tacheva
    Stefani Tacheva avatar
    718 posts
    Registered:
    06 Dec 2016
    18 Mar 2014
    Link to this post
    Hello,

    Please find a modified custom page editor route handler which is working with version Sitefinity 6.x:

    public class CustomPageEditorRouteHandler : PageEditorRouteHandler
      {
          protected override void ApplyLayoutsAndControls(System.Web.UI.Page page, System.Web.Routing.RequestContext requestContext)
          {
              base.ApplyLayoutsAndControls(page, requestContext);
              var zoneEditor = page.Form.FindControl("ZoneEditor") as ZoneEditor;
      
              // ZoneEditor is not available is some cases like when the page is locked
              if (zoneEditor == null)
              {
                  return;
              }
      
              Guid userId = SecurityManager.GetCurrentUserId();
              User user = UserManager.GetManager().GetUser(userId);
      
              var tools = new Dictionary<string, ToolboxItem>();
              foreach (var section in zoneEditor.ControlToolbox.Sections)
              {
                  foreach (ToolboxItem tool in section.Tools)
                  {
                      if (!tools.ContainsKey(tool.Name))
                      {
                          tools.Add(tool.Name, tool);
                      }
                  }
              }
      
              foreach (var toolboxItem in tools)
              {
                  var disallowedRoles = toolboxItem.Value.Parameters["DisallowedRoles"];
                  if (!string.IsNullOrEmpty(disallowedRoles)) // means that there are role based limitations set for the specific widget
                  {
                      var roleNames = disallowedRoles.Split(CustomPageEditorRouteHandler.RoleSeparator, StringSplitOptions.RemoveEmptyEntries);
                      foreach (var roleName in roleNames)
                      {
                          if (IsUserInRole(userId, roleName.Trim()))
                          {
                              toolboxItem.Value.Enabled = false;
                          }
                      }
                  }
              }
          }
      
          private bool IsUserInRole(Guid userId, string roleName)
          {
              bool isUserInRole = false;
                                    // here we get the AppRoles provider, because Authors and Editors roles are in this provider
              RoleManager roleManager = RoleManager.GetManager("AppRoles");
      
              bool roleExists = roleManager.RoleExists(roleName);
      
              if (roleExists)
              {
                  isUserInRole = roleManager.IsUserInRole(userId, roleName);
              }
      
              return isUserInRole;
          }
          private static readonly char[] RoleSeparator = new[] { ',' };
      }

    AppRoles contains the following roles:
        [0]: Role "Editors", Id={a4f170a2-dc31-43d0-b61f-1f594d5f9782}
        [1]: Role "Everyone", Id={b7210e90-5a45-4073-9d0e-35c3d1849219}
        [2]: Role "BackendUsers", Id={842c900e-1db1-46df-94df-3949c505ccf4}
        [3]: Role "Authenticated", Id={146ce21d-8a5e-491c-875e-4702b0a7bf7d}
        [4]: Role "Anonymous", Id={325b1c5b-98db-4c6a-811e-78170cc25843}
        [5]: Role "Administrators", Id={e6529888-9fa0-490f-b8d4-80fbb675c2bd}
        [6]: Role "Authors", Id={413b3b3e-a237-4125-a873-89cf2d201968}
        [7]: Role "Owner", Id={ec5f81f5-f129-4f18-9b6b-aa144f5c7692}
        [8]: Role "Users", Id={10cd1139-4154-458b-b140-b7f0ec1f7432}
        [9]: Role "Designers", Id={ce349fe5-29c0-4bf3-98d7-f2511cd56e4c}


    Then you need to Build the project and add toolboxes item parameter DisallowedRoles under the widget you do not want to be visible by specific role. Please review the screenshot:

    http://screencast.com/t/cPoPDLi6


    I have added the parameter for ImageControl widget.


    Regards,
    Stefani Tacheva
    Telerik
     
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Sitefinity CMS Ideas&Feedback Portal and vote to affect the priority of the items
     
  4. Richard
    Richard avatar
    103 posts
    Registered:
    04 Apr 2013
    31 Jul 2014 in reply to Stefani Tacheva
    Link to this post

    Can you show how the global.asax file should look with the PageEditorRouteHandler.cs registered?

    Where would one place the PageEditorRouteHandler?

  5. Richard
    Richard avatar
    103 posts
    Registered:
    04 Apr 2013
    31 Jul 2014 in reply to Richard
    Link to this post

    Hi Richard, 

    I found this page that does it for me using 6.3.5000. Works good :) Has an example of the global.asax as well. 

    http://www.sitefinity.com/documentation/documentationarticles/restrict-usage-of-widgets-based-on-roles

  6. Stefani Tacheva
    Stefani Tacheva avatar
    718 posts
    Registered:
    06 Dec 2016
    31 Jul 2014
    Link to this post
    Hello,

    Thank you for sharing the article with the community.

    The article is connected to the blog post we created regarding this functionality.

    I am glad to hear that it was useful.

    Regards,
    Stefani Tacheva
    Telerik
     
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Sitefinity CMS Ideas&Feedback Portal and vote to affect the priority of the items
     
6 posts, 0 answered