zoukankan      html  css  js  c++  java
  • 转载:asp.net core mvc权限控制:在视图中控制操作权限

    转载:地址  https://www.cnblogs.com/dxp909/p/6388874.html

    在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式判断权限,我们现在就来介绍下具体的操作方法。

    如果在控制器方法里想要判断当前用户是否具有某个权限,可以直接使用HttpContext.User.HasClaim(string cliamtype,string cliamvalue)方法进行判断,该方法返回bool类型,返回true表示具有权限,否则不具有。

    在视图上我们往往需要控制某个按钮或者超链接的权限,具有权限按钮就显示,否则不现实。那怎么样才能达到这样的效果?方法介绍如下:

    1,在视图中直接使用HttpContext.User.HasClaim(string cliamtype,string cliamvalue)判断权限,然后控制按钮是否显示

    1
    2
    3
    4
    @if(HttpContext.User.HasClaim("User","Delete"))
    {
    <input type='button' value="删除"/>
    }

    上面的代码写在视图中,表示如果具有用户的删除权限,就显示删除按钮。这种方式比如在所有需要验证的地方,都按照这样的格式去书写。

    2,借助于asp.net core mvc的新特性taghelper可以简化第一种方式,至于什么是taghelper,以及它的作用这里就不再介绍,大家可以百度或谷歌搜索,这里直接介绍如何自定义权限验证的taghelper。

    1
    <a asp-claim="goods,edit" asp-action="addgoods" asp-route-id="@goods.Id" class="btn-icon " title="编辑"><i class="icon-common-edit icon-pencil"></i></a>

    上面的代码是我们最终的效果,表示这个超链接是有在用户具有claim(type=goods,value=edit)权限的时候才显示,下面我们就来介绍如何实现这个taghelper。

    1)首先我们定义一个类,派生自TagHelper类,并增加claim属性定义,并增加ViewContext

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class ClaimTagHelper:TagHelper
    {
    private const string ClaimAttributeName = "asp-claim";
        public ClaimTagHelper()
        {
        }
        [HtmlAttributeName(ClaimAttributeName)]
        public string Claim { get; set; }
    }

    2)我们的权限控制taghelper只运用于button,a,input的元素上,所有我们需要加上HtmlTargetElement的特性,代码如下:

    1
    2
    3
    4
    5
    6
    7
    [HtmlTargetElement("a", Attributes = ClaimAttributeName)]
      [HtmlTargetElement("button", Attributes = ClaimAttributeName)]
      [HtmlTargetElement("input", Attributes = ClaimAttributeName, TagStructure = TagStructure.WithoutEndTag)]
      public class ClaimTagHelper: TagHelper
    {
    ......
    }

    3)重写TagHelper的Process方法,在方法中使用HttpContext.User.HasClaim进行权限判断。在视图中访问HttpContext必须借助于ViewContext对象,所以我们需要在当前的TagHelper类中增加ViewContext引用,具体代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class ClaimTagHelper: TagHelper
    {
    .....
     
    [HtmlAttributeNotBound]
        [ViewContext]
        public ViewContext ViewContext { get; set; }
    .....
    }

    基本条件都具备了,然后就是Process实现,直接上代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public override void Process(TagHelperContext context, TagHelperOutput output)
        {
          if (string.IsNullOrEmpty(Claim))
          {
            return;
          }
          string[] claimData = Claim.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
          if (claimData.Length == 1)
          {
            if (!ViewContext.HttpContext.User.HasClaim(m => m.Type == claimData[0]))
            {
              //无权限
              output.SuppressOutput();
            }
          }
          else
          {
            if (!ViewContext.HttpContext.User.HasClaim(m => m.Type == claimData[0] && m.Value == claimData[1]))
            {
              //无权限
              output.SuppressOutput();
            }
          }
    }
  • 相关阅读:
    年末反思
    Flink运行时架构
    Phoenix 启动报错:Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.
    Clickhouse学习
    Flink简单认识
    IDEA无法pull代码到本地,Can't Update No tracked branch configured for branch master or the branch doesn't exist.
    第1章 计算机系统漫游
    简单的 Shell 脚本入门教程
    开源≠免费 常见开源协议介绍
    MySQL 视图
  • 原文地址:https://www.cnblogs.com/shuaiheng/p/12427235.html
Copyright © 2011-2022 走看看