Skip to content

Commit f791e4f

Browse files
author
Warren Buckley
committed
Adds our-member-include & our-member-exclude attribute
1 parent 4f6c60c commit f791e4f

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using Microsoft.AspNetCore.Razor.TagHelpers;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
using Umbraco.Cms.Core.Security;
6+
7+
namespace Our.Umbraco.TagHelpers
8+
{
9+
/// <summary>
10+
///
11+
/// </summary>
12+
[HtmlTargetElement("*", Attributes = "our-member-include")]
13+
[HtmlTargetElement("*", Attributes ="our-member-exclude")]
14+
public class MemberTagHelper : TagHelper
15+
{
16+
private IMemberManager _memberManager;
17+
18+
/// <summary>
19+
///
20+
/// </summary>
21+
[HtmlAttributeName("our-member-exclude")]
22+
public string ExcludeRoles { get; set; }
23+
24+
/// <summary>
25+
///
26+
/// </summary>
27+
[HtmlAttributeName("our-member-include")]
28+
public string IncludeRoles { get; set; }
29+
30+
public MemberTagHelper(IMemberManager memberManager)
31+
{
32+
_memberManager = memberManager;
33+
}
34+
35+
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
36+
{
37+
var currentMember = await _memberManager.GetCurrentMemberAsync();
38+
var currentMemberRoles = new List<string>();
39+
if(currentMember != null)
40+
{
41+
currentMemberRoles.AddRange(await _memberManager.GetRolesAsync(currentMember));
42+
}
43+
44+
// Process excluded roles
45+
if (!string.IsNullOrWhiteSpace(this.ExcludeRoles) && IsUserInRole(ExcludeRoles, currentMemberRoles) == true)
46+
{
47+
output.SuppressOutput();
48+
return;
49+
}
50+
51+
// Process included roles
52+
else if (!string.IsNullOrWhiteSpace(this.IncludeRoles) && IsUserInRole(IncludeRoles, currentMemberRoles) == false)
53+
{
54+
output.SuppressOutput();
55+
return;
56+
}
57+
}
58+
59+
private bool IsUserInRole(string roleString, List<string> currentMemberRoles)
60+
{
61+
// roles is a CSV of member groups they need to have access to
62+
var roles = roleString.Split(',').Select(x => x.Trim());
63+
foreach (var role in roles)
64+
{
65+
// Role ? == all anonymous users (User not logged in)
66+
if (role == "?" && _memberManager.IsLoggedIn() == false)
67+
{
68+
return true;
69+
}
70+
71+
// Role * == all authenticated users
72+
if (role == "*" && _memberManager.IsLoggedIn())
73+
{
74+
return true;
75+
}
76+
77+
if (currentMemberRoles.Contains(role))
78+
{
79+
return true;
80+
}
81+
}
82+
83+
return false;
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)