《Techporters架构搭建》-Day01 第一个RESTful API接口

权限

为何得先了解功能权限,因为大多数系统都离不开权限,而且在做任何一个系统的业务功能之前,我认为首先得把功能权限设计出来,如果了解RBAC,此节可以跳过。

RBAC概述

**RBAC(Role-Based Access Control,基于角色的访问控制)**是一种被广泛使用的权限管理模型,用于控制用户对系统资源的访问权限。通过将权限与角色相关联,然后将角色分配给用户,从而实现更灵活、更易于管理的安全策略。

RBAC的组成

在RBAC模型里面,有3个基础组成部分,分别是:用户、角色和权限
RBAC通过定义角色的权限,并对用户授予某个角色从而来控制用户的权限,实现了用户和权限的逻辑分离(区别于ACL模型),极大地方便了权限的管理
下面在讲解之前,先介绍一些名词:

  • User(用户):每个用户都有唯一的UID识别,并被授予不同的角色
  • Role(角色):不同角色具有不同的权限
  • Permission(权限):访问权限
  • 用户-角色映射:用户和角色之间的映射关系
  • 角色-权限映射:角色和权限之间的映射

它们之间的关系如下图所示:
在这里插入图片描述
用户、角色、权限关系
例如下图,管理员和普通用户被授予不同的权限,普通用户只能去修改和查看个人信息,而不能创建创建用户和冻结用户,而管理员由于被授 予所有权限,所以可以做所有操作。
在这里插入图片描述

RBAC支持的安全原则

RBAC支持三个著名的安全原则:最小权限原则、责任分离原则和数据抽象原则

  • 最小权限原则:RBAC可以将角色配置成其完成任务所需的最小权限集合
  • 责任分离原则:可以通过调用相互独立互斥的角色来共同完成敏感的任务,例如要求一个计账员和财务管理员共同参与统一过账操作
  • 数据抽象原则:可以通过权限的抽象来体现,例如财务操作用借款、存款等抽象权限,而不是使用典型的读、写、执行权限

RBAC的3种模型

(1)RBAC0
RBAC0,是最简单、最原始的实现方式,也是其他RBAC模型的基础。
在这里插入图片描述
在该模型中,用户和角色之间可以是多对多的关系,即一个用户在不同场景下是可以有不同的角色,例如:项目经理也可能是组长也可能是架构师。同时每个角色都至少有一个权限。这种模型下,用户和权限被分离独立开来,使得权限的授权认证更加灵活。
(2)RBAC1
基于RBAC0模型,引入了角色间的继承关系,即角色上有了上下级的区别
在这里插入图片描述
角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构,实现角色间的单继承。
这种模型适合于角色之间层次分明,可以给角色分组分层。
(3)RBAC2
RBAC2,基于RBAC0模型的基础上,进行了角色的访问控制。
在这里插入图片描述
RBAC2中的一个基本限制是互斥角色的限制,互斥角色是指各自权限可以互相制约的两个角色。对于这类角色一个用户在某一次活动中只能被分配其中的一个角色,不能同时获得两个角色的使用权。
该模型有以下几种约束:

  • 互斥角色 :同一用户只能分配到一组互斥角色集合中至多一个角色,支持责任分离的原则。互斥角色是指各自权限互相制约的两个角色。对于这类角色一个用户在某一次活动中只能被分配其中的一个角色,不能同时获得两个角色的使用权。常举的例子:在审计活动中,一个角色不能同时被指派给会计角色和审计员角色。
    基数约束 :一个角色被分配的用户数量受限;一个用户可拥有的角色数目受限;同样一个角色对应的访问权限数目也应受限,以控制高级权限在系统中的分配。例如公司的领导人有限的;
    先决条件角色 :可以分配角色给用户仅当该用户已经是另一角色的成员;对应的可以分配访问权限给角色,仅当该角色已经拥有另一种访问权限。指要想获得较高的权限,要首先拥有低一级的权限。就像我们生活中,国家主席是从副主席中选举的一样。
    运行时互斥 :例如,允许一个用户具有两个角色的成员资格,但在运行中不可同时激活这两个角色。

搭建微服务架构

首先搭建系统管理模块,模块结构如下

tps-cloud
└── tps-system -- 系统管理模块
     └── tps-system-api -- 系统管理模块公共api模块
     └── tps-system-biz -- 系统管理模块业务处理模块[9001]

1.新建Project
① 选择 File -> New -> Project菜单,如下图所示:
在这里插入图片描述
② 选择 Gradle类型,输入名字为 tps-cloud,并点击 Next按钮,如下图所示:
在这里插入图片描述
③ 选择当前稳定的Spring Boot 3.3.1版本,点击Create
在这里插入图片描述
④打开 项目tps-cloud,删除 src 文件夹,然后右击tps-cloud项目创建tps-system模块,如下图所示:
在这里插入图片描述
填写模块名称,选择Gradle
在这里插入图片描述在这里插入图片描述
⑤删除tps-system的src文件夹,并在tps-system模块下新建 tps-system-api 与tps-system-biz模块 ,整个过程和“新建tps-system模块”是一致的,如下图所示:
在这里插入图片描述
在这里插入图片描述
⑥ 服务创建完成后,整体代码结构
在这里插入图片描述
⑦ 点击IDEA右边的Gradle,可以看到项目之间不是父子结构,所以需要调整项目依赖关系
在这里插入图片描述
⑧ 修改tps-cloud项目下settings.gradle文件,通过include命令,删除所有子模块的settings.gradle文件,一个项目该文件只需要一个就行。

rootProject.name = 'tps-cloud'
//系统模块
include 'tps-system'
//系统模块下子模块
include 'tps-system:tps-system-api'
include 'tps-system:tps-system-biz'

分析一下项目的build.gradle

#
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.3.1'
    id 'io.spring.dependency-management' version '1.1.5'
}

group = 'com.tps.cloud'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
    useJUnitPlatform()
}

plugins(插件)
Gradle 插件的作用,主要有以下几个方面:

  • 添加任务到项目中,可对项目进行测试、编译、打包;
  • 添加依赖到项目中,可用来配置项目构建过程中需要的依赖;
  • 可以向项目中现有的对象类型添加新的扩展属性、方法等,可方便项目的配置和构建优化,比如 Android 项目构建中的 android{}就是 Android Gradle 插件为 Project 对象添加的一个扩展;
  • 可以对项目进行一些约定,如使用 Java Gradle插件可以约定 src/main/java 目录下源代码的存放位置,在编译的时候就可以编译指定目录下的 Java 源代码文件。

repositories (仓库)
Gradle默认使用Maven的中心库下载依赖包;
如果从中心库下载jar包的速度慢,我们可以通过阿里云或者腾讯云的Maven库镜像来加速,当然也可以使用你公司内部的Maven库私服来加速。

maven { url 'https://maven.aliyun.com/repository/public/' }
maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }

dependecies(依赖)
我们只需要按照下面的格式即可引入依赖:

implementation group: '***', name: '***', version: '***'

或简写成:

implementation 'group:name:version'

因为插件,只要被Spring Boot所管理的依赖,版本也无须维护,可以更加精简的写成:

implementation 'group:name'

如果你想找某个依赖包,可以通过https://mvnrepository.com/查找添加依赖
在这里插入图片描述一般情况下,我们会把复制来的版本号给去掉,以防Spring Boot已经对它做了版本管理,这样我们就能直接下载兼容性良好的依赖包;如果去掉版本后不能下载依赖包,意味着Spring Boot没有做该包的版本管理,这时我们按照自己的需要添加合适的版本号。
下面看看其他几个依赖的关键字,一般情况下我们不需要过多的关注。
测试依赖:testImplementation,测试相关的依赖,使用testImplementation,规则和普通依赖一致。

dependencies {
	//...
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

编译依赖:compileOnly,只在编译期起效的依赖。

dependencies {
	//...
	compileOnly 'org.projectlombok:lombok'
  //...
}

运行时依赖:runtimeOnly,只在运行时起效的依赖。

dependencies {
	//...
	runtimeOnly 'com.mysql:mysql-connector-j'
	//...
}

添加Demo接口

① 在 com.tps.cloud.system包,新建一个 DemoController 类,并新建一个 /demo/get 接口。代码如下:

package com.tps.cloud.system.controller;

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/get")
    public String get() {
        return "恭喜你,你的接口通了!";
    }
}

② 上面代码肯定是报错,因为很多注解我们并没有引入相对应的Spring启动器,通过IDEA快捷键,可以查看IDEA建议我们引入spring-boot-starter-web
在这里插入图片描述
③ 在模块tps-system-biz下的build.gradle文件添加spring-boot-starter-web依赖,然后Gradle reload一下,Gradle会去下载依赖包在这里插入图片描述
④ 现在我们可以引入相关依赖包,通过错误提示
在这里插入图片描述
引入相关类

package com.tps.cloud.system.controller;


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/get")
    public String get() {
        return "恭喜你,你的接口通了!";
    }
}

⑤ 将tps-system-biz服务运行起来,默认接口是8080
在这里插入图片描述
通过Postman或者Apifox调用接口http://localhost:8080/demo/get,查看返回结果。
在这里插入图片描述
现在我们已经成功启动一个微服务,并且调通 一个RESTful API 接口,当然这个接口目前的功能很简单,下一章我们将数据库集成进来,做一个表的增删改查功能

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值