本系列目录:Abp介绍和经验分享-目录

今天介绍下,如何使用T4根据json文件自动生成权限定义。

先看成果

成果是:

  1. 要新增一个权限定义时,打开Json文件,找到目标节点,加个权限定义;
  2. 生成下Core程序集(因为Json文件都是嵌入式资源文件);
  3. 跑一遍T4,ok,新增的权限名常量有了,权限树上也加了新权限。

截图:

开工

还是从Personball.Demo项目开始,我从dev分支新建了一个feature_t4_permissions

展开Personball.Demo.Core程序集,按下述步骤操作

安装包,获取相关文件

打开程序包管理器控制台,默认项目选中Personball.Demo.Core,执行如下命令,安装获取相关文件:

//安装过程中会提示是否执行T4,请取消,还有地方需要修改
Install-Package Abplus.T4.PermissionsFromJson

该nuget包带来如下几个文件:

  1. Authorization\Builders\Permissions\Sample.json
  2. Authorization\Builders\BuilderUtils.cs
  3. Authorization\Builders\PermissionBuilder.tt
  4. Authorization\Builders\T4MultipleOutputManager.ttinclude

几处修正

  1. 选中Sample.json,F4查看属性,确保json文件的属性是嵌入的资源
  2. 打开BuilderUtils.cs,将【YourCompany.YourProject】替换成Personball.Demo
  3. 打开PermissionBuilder.tt,将【YourCompany.YourProject】替换成Personball.Demo
  4. 打开PermissionBuilder.tt,修正你所使用的Newtonsoft.Json的引用路径(版本号)
  5. 打开Authorization\DemoAuthorizationProvider.cs,在SetPermissions方法中追加一行代码BuilderUtils.Build(context, "Sample");

其中SetPermissions方法中,可以注释掉原先的context.CreatePermission调用,然后针对每个权限定义json文件,增加代码:

//【Json文件名】替换,如Sample,无文件名后缀
BuilderUtils.Build(context, "【Json文件名】");

如果需要json文件的具体字段定义,请参考BuilderUtils.cs文件中PermissionJson类的定义。

Run

生成Core程序集,然后运行PermissionBuilder.tt(右键点击tt文件,运行自定义工具

清理

待所有AbpAuthorizeAttribute中用到的权限字符串常量(如标在TenantAppService上的[AbpAuthorize(PermissionNames.Pages_Tenants)])都替换成T4自动生成的以后,就可以删除Authorization目录下的PermissionNames.cs了。

同时可以清理DemoAuthorizationProviderSetPermissions方法中原有的代码,统一全部调用BuilderUtils.Build

感谢

感谢曾经的同事 @菜刀和板砖 提供本文关键实现。

[2017-11-21]Abp系列——T4应用:权限树定义的更多相关文章

  1. 2017/11/21 Leetcode 日记

    2017/11/21 Leetcode 日记 496. Next Greater Element I You are given two arrays (without duplicates) num ...

  2. Android系统编程入门系列之应用权限的定义与申请

    在之前关于应用内数据本地保存为文件时,曾提到应用需要申请外部存储设备的读写权限才能访问外部存储中的文件.那么针对某一种权限,应用程序具体应该怎么申请使用呢?本文将详细介绍. 应用中的权限主要分为两类, ...

  3. 2017.11.21 查询某个字段为null的记录

    注意,不使用 = null, 而是 is null. select fd_username, fd_tenantid, fd_validity from t_user WHERE fd_validit ...

  4. 2017.11.21 postgre更新时需要联合其他表的信息

    现在需要更新t_user表,但是前台传来的参数 tenant_name 并不在这个表中,需要联合另一个表t_tenant. 要注意的一点是:set后面的字段不要写成 u.fd_validity,否则会 ...

  5. 2017.11.21 基于JSP+Servlet+JavaBean实现复数运算(二)

    代码的实现 最基本的MVC模式 //input.jsp 输入界面 <%@ page language="java" import="java.util.*" ...

  6. 2017.11.17 C++系列---用malloc动态给c++二维数组的申请与释放操作

    方法一:利用二级指针申请一个二维数组. #include<stdio.h> #include<stdlib.h> int main() { int **a; //用二级指针动态 ...

  7. 第33次Scrum会议(11/21)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/21 11:35~11:57,总计22min.地点:东北 ...

  8. ABP(现代ASP.NET样板开发框架)系列之11、ABP领域层——仓储(Repositories)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是“ASP.NET Boilerplate Proj ...

  9. 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录

    ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视频:ABP架构设计交流群-7月18日上海线下交流会的内容分享(有高清录像视频的链接) 代码自动生成: ...

随机推荐

  1. 不得不知Git远程操作详解

    Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...

  2. ThinkPHP示例:CURD

    完整的控制器文件: class IndexAction extends Action { // 查询数据 public function index() { $Form = M("Form& ...

  3. WPF文字渲染相关的问题及解决

     wpf中常常遇到各种和文字渲染有关的问题. 如今列举下现象和解决方式. (1) 现象: 文字大小不一.不在同一水平线. 不同字渲染成同一个字, 或者字体发虚 原因:微软雅黑字体对中文字符的渲染支 ...

  4. 2016.6.20 eclipse中的jsp文件的字体大小在哪里修改

    刚打开eclipse的时候,觉得jsp文件的字体太小了.于是去修改字体,但是colors and fonts里的字体选项太多了,不知道哪一个是. 试了几个后发现,是structured text ed ...

  5. log4j.properties(信息打印)

    ### set log levels ###log4j.rootLogger = INFO , console , debug , error ### console ###log4j.appende ...

  6. leetcode第一刷_Word Search

    这道题之前一直没敢做,没想到前天用递归一遍过了. . 当时为什么想着用递归,而不是dp呢.由于我想到达某个位置的情况有非常多,即使从当前位置開始的搜索是已知的,但之前的状态是如何的也无从得知啊,实话实 ...

  7. spring(16)------spring的数据源配置

    在spring中,通过XML的形式实现数据源的注入有三种形式. 一.使用spring自带的DriverManagerDataSource 使用DriverManagerDataSource配置数据源与 ...

  8. fiddler不能监听 localhost和 127.0.0.1的问题 .

    localhost/127.0.0.1的请求不会通过任何代理发送,fiddler也就无法截获. 解决方案 用 http://localhost. (locahost紧跟一个点号) 用 http://1 ...

  9. codeforces 283C

    给 n 中 钱币.以及每两种钱币的关系,表示,ai 的 个数 要大于 bi 组合成一个价值val,求方案数,好奇妙的一个处理方式,不得不说又学到了 #include<stdio.h> #i ...

  10. 学习使用用Eclipse编写java程序

    本文讲解了在Eclipse中完成一个HelloWorld程序的编写过程. 刚刚学习java的同学们可能用 记事本编写java源代码,在命令提示符中完成java程序的编译和运行过程.这样的方法对于学习j ...