ABP-Book Store Application中文讲解 - Part 5: Authorization

article/2025/6/8 15:27:26

ABP-Book Store Application中文讲解 - Part 5: Authorization

 1. 汇总

ABP-Book Store Application中文讲解-汇总-CSDN博客

2. 前一章 

ABP-Book Store Application中文讲解 - Part 4: Integration Tests-CSDN博客

项目之间的引用关系。

ABP有一套完整的权限控制系统,可以通知页面的显示级别或者按钮级别。具体可以参考官网的例子:Authorization | ABP.IO Documentation 

如果我们没有特殊的权限要求,可以完全借用ABP的权限管理,ABP帮我们设计好了一套UI和后端API的流程,我们只需要遵守其规则即可。本文主要是用于介绍基于ABP的permission规则如何控制Book页面的权限。

目录

1. 命名规则

2. 添加权限到BookStorePermissions.cs

3. 添加本地化资源

4. 定义权限到BookStorePermissionDefinitionProvider 

5. API应用权限

5.1 默认设置

5.2 利用Authorize设置

6. 在UI端应用权限-Angular Guard Configuration

6.1 添加AuthGuard和PermissionGuard控制页面权限

 6.2 html页面添加abpPermission,控制按钮权限

7. Permission UI

8. 继续学习


1. 命名规则

我们需要在BookStorePermission.cs中定义权限名称,此名称会用于本地化资源的key和UI端的key。

虽然ABP没有强制要求命名规则,但是它任然推荐用模块名的命名规则去定义权限。

2. 添加权限到BookStorePermissions.cs

在Acme.BookStore.Application.Contracts中展开Permissions文件夹,可以找到BookStorePermissions.cs,然后打开后编辑。

namespace Acme.BookStore.Permissions;public static class BookStorePermissions
{public const string GroupName = "BookStore";// other permissions...// 定义Books权限public static class Books{public const string Default = GroupName + ".Books";// 控制Book页面权限public const string Create = Default + ".Create";// 控制Create button的隐藏显示public const string Edit = Default + ".Edit";// 控制Edit button的隐藏显示public const string Delete = Default + ".Delete";// Delete button的隐藏显示}
}

3. 添加本地化资源

 在Acme.BookStore.Domain.Shared中打开Localization\BookStore,在en.json和zh-Hans.json添加权限名称。

en.json

    "Permission:BookStore": "Book Store","Permission:Books": "Book Management","Permission:Books.Create": "Creating new books","Permission:Books.Edit": "Editing the books","Permission:Books.Delete": "Deleting the books"

zh-Hans.json

    "Permission:BookStore": "书店","Permission:Books": "书籍管理","Permission:Books.Create": "新建书籍","Permission:Books.Edit": "编辑书籍","Permission:Books.Delete": "删除书籍"

 完整json-en.json

{"Culture": "en","Texts": {"Menu:Home": "Home","Welcome": "Welcome","LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP. For more information, visit abp.io.",// 以下内容是新增内容"Menu:BookStore": "Book Store","Menu:Books": "Books","Actions": "Actions","Close": "Close","Delete": "Delete","Edit": "Edit","Save": "Save","Cancel": "Cancel","Update": "Update","PublishDate": "Publish date","NewBook": "New book","EditBook": "Edit book","Name": "Name","Type": "Type","Price": "Price","CreationTime": "Creation time","AreYouSure": "Are you sure?","AreYouSureToDelete": "Are you sure you want to delete this item?","Enum:BookType.0": "Undefined","Enum:BookType.1": "Adventure","Enum:BookType.2": "Biography","Enum:BookType.3": "Dystopia","Enum:BookType.4": "Fantastic","Enum:BookType.5": "Horror","Enum:BookType.6": "Science","Enum:BookType.7": "Science fiction","Enum:BookType.8": "Poetry","Permission:BookStore": "Book Store","Permission:Books": "Book Management","Permission:Books.Create": "Creating new books","Permission:Books.Edit": "Editing the books","Permission:Books.Delete": "Deleting the books"}
}

 完整zh-Hans.json

{"culture": "zh-Hans","texts": {"AppName": "BookStore","Menu:Home": "首页","Welcome": "欢迎","LongWelcomeMessage": "欢迎使用本应用程序。这是一个基于 ABP 框架的启动项目。更多信息,请访问 abp.io。",// 以下内容是新增内容"Menu:BookStore": "书店","Menu:Books": "书籍管理","Actions": "操作","Close": "关闭","Delete": "删除","Edit": "编辑","Save": "保存","Cancel": "取消","Update": "更新","PublishDate": "发布日期","NewBook": "新增书","EditBook": "编辑书","Name": "名字","Type": "类型","Price": "价格","CreationTime": "新建日期","AreYouSure": "你确定吗?","AreYouSureToDelete": "你确定你要删除此条目吗?","Enum:BookType.0": "未定义","Enum:BookType.1": "冒险","Enum:BookType.2": "传记","Enum:BookType.3": "反乌托邦","Enum:BookType.4": "奇幻","Enum:BookType.5": "恐怖","Enum:BookType.6": "科学","Enum:BookType.7": "科幻","Enum:BookType.8": "诗歌","Permission:BookStore": "书店","Permission:Books": "书籍管理","Permission:Books.Create": "新建书籍","Permission:Books.Edit": "编辑书籍","Permission:Books.Delete": "删除书籍"}
}

4. 定义权限到BookStorePermissionDefinitionProvider 

在Acme.BookStore.Application.Contracts中展开Permissions文件夹,可以找到BookStorePermissionDefinitionProvider.cs,然后打开后编辑。

using Acme.BookStore.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;namespace Acme.BookStore.Permissions;public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider
{public override void Define(IPermissionDefinitionContext context){var bookStoreGroup = context.AddGroup(BookStorePermissions.GroupName, L("Permission:BookStore"));var booksPermission = bookStoreGroup.AddPermission(BookStorePermissions.Books.Default, L("Permission:Books"));booksPermission.AddChild(BookStorePermissions.Books.Create, L("Permission:Books.Create"));booksPermission.AddChild(BookStorePermissions.Books.Edit, L("Permission:Books.Edit"));booksPermission.AddChild(BookStorePermissions.Books.Delete, L("Permission:Books.Delete"));}private static LocalizableString L(string name){return LocalizableString.Create<BookStoreResource>(name);}
}

5. API应用权限

5.1 默认设置

打开BookAppService.cs类,并将策略名称设置为上面定义的权限名称:

using Acme.BookStore.Permissions;
using System;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;namespace Acme.BookStore.Books
{public class BookAppService :CrudAppService<Book, //The Book entityBookDto, //Used to show books in UIGuid, //Primary key of the book entityPagedAndSortedResultRequestDto, //Used for paging/sortingCreateUpdateBookDto>, //Used to create/update a bookIBookAppService //implement the IBookAppService{public BookAppService(IRepository<Book, Guid> repository) : base(repository){GetPolicyName = BookStorePermissions.Books.Default;// DefaultGetListPolicyName = BookStorePermissions.Books.Default;CreatePolicyName = BookStorePermissions.Books.Create;UpdatePolicyName = BookStorePermissions.Books.Edit;DeletePolicyName = BookStorePermissions.Books.Delete;}}
}

5.2 利用Authorize设置

此处也可以通过设置[Authorize(...)]去控制权限,例如:

[Authorize(BookStorePermissions.Books.Create)] public override Task<BookDto> CreateAsync(CreateUpdateBookDto input){return base.CreateAsync(input);}

因为此处用的是CrudAppService,所以只能通过override实现权限的重新设置。

如果直接继承的ApplicationService,则不需要override。

例子如下:

var authorManagement = myGroup.AddPermission("Author_Management");
authorManagement.AddChild("Author_Management_Create_Books");
authorManagement.AddChild("Author_Management_Edit_Books");
authorManagement.AddChild("Author_Management_Delete_Books");
[Authorize("Author_Management")]
public class AuthorAppService : ApplicationService, IAuthorAppService
{public Task<List<AuthorDto>> GetListAsync(){...}public Task<AuthorDto> GetAsync(Guid id){...}[Authorize("Author_Management_Create_Books")]public Task CreateAsync(CreateAuthorDto input){...}[Authorize("Author_Management_Edit_Books")]public Task UpdateAsync(CreateAuthorDto input){...}[Authorize("Author_Management_Delete_Books")]public Task DeleteAsync(CreateAuthorDto input){...}
}

6. 在UI端应用权限-Angular Guard Configuration

6.1 添加AuthGuard和PermissionGuard控制页面权限

打开/src/app/book/book-routing.module.ts

  • Imported authGuard and permissionGuard from the @abp/ng.core.
  • Added canActivate: [authGuard, permissionGuard] to the route definition.
import { authGuard, permissionGuard } from '@abp/ng.core';
const routes: Routes = [{ path: '', component: BookComponent, canActivate: [authGuard, permissionGuard] },
];

打开/src/app/route.provider.ts,在/book-store/books添加 requiredPolicy: 'BookStore.Books'

import { RoutesService, eLayoutType } from '@abp/ng.core';
import { APP_INITIALIZER } from '@angular/core';export const APP_ROUTE_PROVIDER = [{ provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true },
];function configureRoutes(routesService: RoutesService) {return () => {routesService.add([{path: '/',name: '::Menu:Home',iconClass: 'fas fa-home',order: 1,layout: eLayoutType.application,},{path: '/book-store',name: '::Menu:BookStore',iconClass: 'fas fa-book',order: 2,layout: eLayoutType.application,requiredPolicy: 'BookStore.Books',// new added},{path: '/books',name: '::Menu:Books',// iconClass: 'fas fa-user',parentName: '::Menu:BookStore',order: 3,layout: eLayoutType.application,requiredPolicy: 'BookStore.Books',// new added}]);};
}

 6.2 html页面添加abpPermission,控制按钮权限

打开/src/app/book/book.component.html

新建按钮权限

<!-- Add the abpPermission directive -->
<button *abpPermission="'BookStore.Books.Create'" id="create" class="btn btn-primary" type="button" (click)="createBook()"><i class="fa fa-plus me-1"></i><span>{{ '::NewBook' | abpLocalization }}</span>
</button>

*abpPermission="'BookStore.Books.Create'" 如果当前用户没有BookStore.Books.Create权限,则新建按钮会被隐藏。

编辑和删除按钮权限

<!-- Add the abpPermission directive -->
<button *abpPermission="'BookStore.Books.Edit'" ngbDropdownItem (click)="editBook(row.id)">{{ '::Edit' | abpLocalization }}
</button><!-- Add the abpPermission directive -->
<button *abpPermission="'BookStore.Books.Delete'" ngbDropdownItem (click)="delete(row.id)">{{ '::Delete' | abpLocalization }}
</button>

*abpPermission="'BookStore.Books.Edit'" 如果当前用户没有BookStore.Books.Edit权限,则编辑按钮会被隐藏。 

*abpPermission="'BookStore.Books.Delete'" 如果当前用户没有BookStore.Books.Delete权限,则删除按钮会被隐藏。 

7. Permission UI

当我们完成以上步骤后,重新编译程序,打开浏览器输入localhost:4200,用admin账号登录成功后既可以看到Administration菜单,然后一次打开 Administration -> Identity -> Roles page.

可以checked或者unchecked权限后,刷新页面,然后到Books页面去检测权限。

 

8. 继续学习

ABP-Book Store Application中文讲解 - Part 6: Authors: Domain Layer-CSDN博客

 


http://www.hkcw.cn/article/TpaNYmggQX.shtml

相关文章

安全月报 | 傲盾DDoS攻击防御2025年5月简报

引言 在2025年5月&#xff0c;全球数字化进程高歌猛进&#xff0c;各行各业深度融入数字浪潮&#xff0c;人工智能、物联网、大数据等前沿技术蓬勃发展&#xff0c;进一步夯实了数字经济的基石。然而&#xff0c;在这看似繁荣的数字生态背后&#xff0c;网络安全威胁正以惊人的…

rabbitMQ初入门

1、MQ定义及作用 MQ即MessageQueue&#xff0c;消息队列。其中消息Message&#xff1a;在不同的应用中传递的数据&#xff1b;队列Queue&#xff1a;一种FIFO先进先出的数据结构。将消息以队列的形式存储起来&#xff0c;并且在不同的应用程序之间进行传递&#xff0c;这就成了…

重新审视自回归语言模型的知识蒸馏

Revisiting Knowledge Distillation for Autoregressive Language Models 发表&#xff1a;ACL 2024 机构&#xff1a;School of Computer Science Abstract 知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09;是一种常见的方法&#xff0c;用于压缩教师模型&…

力扣 88.合并两个有序数组

文章目录 题目介绍题解 题目介绍 题解 法一&#xff1a;暴力法 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {for(int i 0; i < n; i){nums1[mi] nums2[i];}Arrays.sort(nums1);} }法二&#xff1a;倒序双指针 时间复杂度为O(mn) 从右…

生成模型+两种机器学习范式

生成模型&#xff1a;从数据分布到样本创造 生成模型&#xff08;Generative Model&#xff09; 是机器学习中一类能够学习数据整体概率分布&#xff0c;并生成新样本的模型。其核心目标是建模输入数据 x 和标签 y 的联合概率分布 P(x,y)&#xff0c;即回答 “数据是如何产生的…

Python趣学篇:Turtle绘制炫酷彩色螺旋图案

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《Python星球日记》 目录 一、螺旋之美&#xff1a;当数学遇上艺…

学习threejs,交互式神经网络可视化

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.EffectComposer 后期…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Dad Jokes(冷笑话卡片)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— DadJokes 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 豆包翻译确实可以&#xff0c;冷笑话应该属于各类语言比较难理解的…

ESP32开发之LED闪烁和呼吸的实现

硬件电路介绍GPIO输出模式GPIO配置过程闪烁灯的源码LED PWM的控制器(LEDC)概述LEDC配置过程及现象整体流程 硬件电路介绍 电路图如下&#xff1a; 只要有硬件基础的应该都知道上图中&#xff0c;当GPIO4的输出电平为高时&#xff0c;LED灯亮&#xff0c;反之则熄灭。如果每间…

【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理)

背景需求&#xff1a; 1-4月电子屏表格&#xff0c;都是用这个代码将EXCEL数据整理成分类成3个WORD表格。 【办公类-48-04】20250118每月电子屏台账汇总成docx-4&#xff08;提取EXCLE里面1月份的内容&#xff0c;自制月份文件夹&#xff09;-CSDN博客文章浏览阅读1.2k次&…

25年宁德时代新能源科技SHL 测评语言理解数字推理Verify题库

宁德时代新能源科技的SHL测评中&#xff0c;语言理解部分主要考察阅读理解、逻辑填空和语句排序等题型&#xff0c;要求应聘者在17分钟内完成30题。阅读理解需要快速捕捉文章主旨和理解细节信息&#xff1b;逻辑填空则要根据语句逻辑填入最合适的词汇&#xff1b;语句排序是将打…

Windows下WSL(Ubuntu)安装1Panel

1Panel 1Panel 提供了一个直观的 Web 界面和 MCP Server&#xff0c;帮助用户轻松管理 Linux 服务器中的网站、文件、容器、数据库以及大型语言模型&#xff08;LLMs&#xff09;。 官网地址&#xff1a;1Panel - 现代化、开源的 Linux 服务器运维管理面板 - 官网 前置条件 …

virtualbox安装扩展工具以支持共享文件夹

1.下载扩展镜像 https://download.virtualbox.org/virtualbox/7.0.16/ 2.加载扩展镜像并安装 3. 配置共享文件夹

实现仿中国婚博会微信小程序

主要功能&#xff1a; 1、完成底部标签导航设计、首页海报轮播效果设计和宫格导航设计&#xff0c;如图1所示 2、在首页里&#xff0c;单击全部分类宫格导航的时候&#xff0c;会进入到全部分类导航界面&#xff0c;把婚博会相关内容的导航集成到一个界面里&#xff0c;如图2…

Meta ASC广告:智能电商营销利器解析

Meta推出的ASC广告&#xff08;全称Advantage Shopping Campaign&#xff09;是专为电商卖家打造的智能营销利器。作为新一代自动化购物广告解决方案&#xff0c;它通过AI技术重塑了传统广告投放模式&#xff0c;为商家带来更高效的转化路径。 五大核心优势解析&#xff1a; 全…

1.1Nodejs和浏览器中的二进制处理

Buffer 在 Node.js 中&#xff0c;Buffer 类用于处理二进制数据。由于 JavaScript 在浏览器环境中主要用于处理字符串和数字等类型的数据&#xff0c;对二进制数据的处理能力较弱&#xff0c;因此 Node.js 引入了 Buffer 类来弥补这一不足&#xff0c;特别是在处理文件系统操作…

redis的哨兵模式和Redis cluster

目录 一. redis的主从复制 二. 哨兵模式 2.1 定义 2.2 作用 2.3 配置实例 三. Redis cluster 3.1 定义 3.2 作用 3.3 配置实例 1. 新建集群文件目录 2. 准备可执行文件到每个文件夹 3. 开启群集功能 4. 启动redis节点 5. 查看是否启动成功 6. 启动集群 7. 测试…

[Java 基础]打印金字塔

实现一个 Java 程序&#xff0c;让用户输入金字塔的层数&#xff0c;打印出对应层数的金字塔。 比如&#xff0c;如果用户指定金字塔的层数是 5&#xff0c;那么将会打印如下的金字塔&#xff1a; 0000* 000*** 00***** 0******* 假如 i 代表的是行&#xff0c;i 从 1 开始…

ollama的安装及加速下载技巧

下载ollama ollama的安装可以从官网下载&#xff0c;地址&#xff1a; https://ollama.com 但是下载会很慢&#xff0c;我是去的这里下载&#xff1a;https://www.gy328.com/app/ollama/ 和官网一样。 下载好了&#xff0c;点击安装&#xff0c;安装好了&#xff…

Qiskit:量子计算模拟器

参考文献&#xff1a; IBM Qiskit 官网Qiskit DocumentationQiskit Benchpress packageQiskit Algorithms package量子计算&#xff1a;基本概念常见的几类矩阵&#xff08;正交矩阵、酉矩阵、正规矩阵等&#xff09;Qiskit 安装指南-博客园使用Python实现量子电路模拟&#x…