我目前有一个系统,其中有一个用户表,一个角色表和一个用户角色关联表,其中一个用户可以与多个角色(如Admin,BasicUser等)相关联。我能够根据这些角色授权操作方法。这来自Identity框架。
现在我想添加对权限的支持,以便可以根据这些权限而不仅仅是角色来限制操作方法。例如,在Controller中,我可能有一个HTTPPost操作,只有具有“写入”权限的人才能成功执行。
我需要做哪些更改才能为角色分配权限? I.E.,我想选择“Admin”角色以获得“Write”和“Read”权限,而“BasicUser”角色只会被赋予“Read”权限。这样,管理员可以访问Write权限允许的任何方法,而BasicUser则不能。
如果我要创建另一个名为“Privilege”的表以及该角色和角色之间的关联表,以及在角色中设置权限的代码,我该如何将该权限用作过滤器?因此,例如,只允许用户在具有归属于它的“写入”权限的角色中执行以下操作。
new_level0 = []
new_level1 = []
new_values = []
for level0 in df.index.levels[0].values:
#this will loop with A and B
#retrieve the values
level1_values = df[level0]['Value'].values
#retrieve the index, we will keep some of the values of it
level1_index = df[level0].index.values
#split the values into two vectors
#reverse so that it starts pairing values from the end
level1_even = [i for enum,i in enumerate(level1_values) if enum%2==0].reverse()
level1_odd = [i for enum,i in enumerate(level1_values) if enum%2==1].reverse()
#
#
#sum and reverse again to bring back to normal order
summed = [i+j for i,j in zip(level1_even,level1_odd)]
summed.reverse()
#
#
#now that we have the values, lets get the index that we need
#again, reverse so that we keep the right one
level1_index.reverse()
#keep only the multiples of two, then undo the reverse
new_index = [i for enum,i in enumerate(level1_values) if enum%2==0].reverse()
#now store the combination of level0, level1 and value
new_level0 += [level0 for i in summed]
new_level1 += new_index
new_values += summed
#your final structure is:
s = pd.Series(summed, index= [new_level0, new_level1])
谢谢。
答案 0 :(得分:1)
与AuthorizeAttribute的工作方式相同,您可以创建从中继承的自定义授权属性:
public class AuthorizePrivilegeAttribute : AuthorizeAttribute
{
// Custom property
public string Privilege { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// Reusing default authentication.
var isAuthorized = base.AuthorizeCore(httpContext);
if (!isAuthorized)
{
return false;
}
return YourCustomCode.HasPrivilege(this.Privilege))
}
}
然后在你的方法上使用它:
[AuthorizePrivilege(Privilege = "Write")]
public ActionResult Create()
{
return View();
}