authorization权限控制_Nacos 权限控制介绍及实战

2023-05-16

方案背景

Nacos自开源依赖,权限控制一直需求比较强烈,这也反应了用户需求将Nacos部署到生产环境的需求。最新发布的Nacos 1.2.0版本已经支持了服务发现和配置管理的权限控制,保障用户安全上生产。本文主要介绍Nacos权限控制的设计方案和使用指南。

什么是权限控制?

在分布式服务调用时,需要对未知的或者不受信任的请求来源的请求进行识别和拒绝。权限控制一般分为两个阶段:身份识别(Authentication)和权限识别(Authorization)。身份认证主要确定访问者的身份,权限识别则判断这个访问者是否有对应资源的权限。

在Nacos的场景中,配置管理的权限控制指的是设置某个配置能否被某个用户读写,这个比较好理解,没有权限的用户旧无法读取或者写入对应的配置。服务发现的权限控制指的是用户是否有权限进行某个服务的注册或者订阅,这里需要注意的是服务发现的权限控制只能够控制用户是否可以从Nacos获取到服务的地址或者在Nacos上修改服务的地址。但是如果已经获取到了服务的地址,Nacos无法在服务真正调用时进行权限控制,这个时候的权限控制需要由服务框架来完成。

fa023f7e2fda8e9faf5bad75f0e2c387.png

常见实现方式

认证(Authentication)

用户名+密码

Cookie(只适用于浏览器)

Session

Token(JWT,Oauth,LDAP,SAML,OpenID)

AK/SK

鉴权(Authorization)

ACL: 规定资源可以被哪些主体进行哪些操作;

DAC: 规定资源可以被哪些主体进行哪些操作 同时,主体可以将资源的权限,授予其他主体;

MAC:a. 规定资源可以被哪些类别的主体进行哪些操作 b. 规定主体可以对哪些等级的资源进行哪些操作 当一个操作,同时满足a与b时,允许操作;

RBAC: a. 规定角色可以对哪些资源进行哪些操作 b. 规定主体拥有哪些角色当一个操作,同时满足a与b时,允许操作;

ABAC: 规定哪些属性的主体可以对哪些属性的资源在哪些属性的情况下进行哪些操作。

方案详情

Nacos的权限控制,目标是能够满足用户基本的鉴权需求,同时能够保持扩展性,可以支持去对接用户自带的用户管理系统或者鉴权系统,包括后面和K8S生态以及Service Mesh生态能够无缝的融合。基于这样的考虑,目前Nacos权限控制的设计是自带一个基本的实现,然后可以支持用户扩展。具体的设计如下。

模块设计

整体的模块设计是尽量将鉴权的逻辑抽象出来,不在服务发现模块或者配置管理模块添加相关的逻辑。通过配置文件可以选择当前使用的鉴权系统。Nacos自带的认证系统使用JWT Token,自带的鉴权系统使用的是RBAC。

c669ef7f94346e3cefdbfe11283e55a4.png

认证算法

对于用户来说,不管是在控制台还是在客户端,都是上传用户名和密码来获取一个token,然后后续的每一次到Nacos的请求都会带上这个token来表明身份。这个token会有一个失效时间,对于控制台来说,只需要直接提示用户重新登录即可,对于客户端则需要有一个定期到Nacos刷新token的逻辑。

a336253877a85bcae621d42681599b77.png

鉴权算法

Nacos自带的鉴权系统使用的是RBAC模型,可以在网上查询相关的资料。

数据模型

鉴权的数据模型也是基于标准的RBAC来设计的,分为用户、角色和权限三部分。用户就是由用户名和密码组成的用户信息,角色则是一个逻辑上的用户组,Nacos启动时会自带一个全局管理员的角色,只有这个全局管理员的角色可以进行添加用户、添加角色、添加授权等操作,保证安全性。而权限则是由资源+动作来组成。

c544bec867119f0f2e240d6bfa222d8c.png

接口设计

以下接口涉及到登录和鉴权的所有逻辑,这些接口除了登录接口,其他接口都只能由全局管理员来调用。

用户管理

创建用户:POST

/nacos/v1/auth/users?username=xx&password=yy

删除用户:DELETE /nacos/v1/auth/users?username=xx&password=yy

更新用户:PUT /nacos/v1/auth/users?username=xx&oldPassword=yy&newPassword=zz

登录:POST

/nacos/v1/auth/users/login?username=xxx&password=yyy

角色管理

创建角色/绑定用户到角色:POST /nacos/v1/auth/roles?role=xx&username=yy

删除某个用户的角色:DELETE /nacos/v1/auth/roles?role=xx&username=yy

获取用户的所有角色:GET /nacos/v1/auth/roles?username=xxx

权限管理

给角色添加权限:POST /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz

从角色删除权限:DELETE /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz

获取某个角色的权限:GET /nacos/v1/auth/permissions?role=xxx

Nacos权限控制实战

安装Nacos 1.2.0

mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

安装包解压,然后使用distribution/nacos-mysql.sql进行数据库初始化,主要是新增了users, roles, permissions三张表,standalone模式使用distribution/schema.sql进行初始化。

Server端打开权限控制开关。修改con/application.properties内容:

nacos.core.auth.enabled=true

这个开关采用了热加载模式,无需重启Server即可生效。因此当权限控制功能使用有异常时,可以直接回滚到不鉴权的模式。

使用权限控制

1、使用管理员账号登录Nacos控制台(如果页面提示错误,可以情况浏览器缓存刷新页面):

d4a4d1924b4c78c7d3fe6b6b9f45f740.png

可以看到,左侧边栏增加了一个父菜单和三个子菜单,分别用于权限控制里的用户创建、角色创建以及权限管         理。这个菜单栏只会在管理员登录的时候显示,也就意味着只有管理员才能进行权限的管理和分配。

2、管理用户。点击“用户列表”,进入用户管理页面,可以进行用户的创建、修改和删除:

4d41680af3926ebf9a02bb39c80bfe37.png

3、管理角色。因为Nacos的自带的权限是基于角色来进行分配的,因此需要给创建好的用户绑定一些角色:

ee5b66067c3954794910e15ff9854ecd.png

4、管理权限。角色创建好以后,就可以给这个角色赋予特定的权限了:

55d807b325aa99c7f4bafd040bedf473.png

在“添加资源”对话框里,可以选择绑定的角色,命名空间资源以及对应的动作类型,例如在上图中,我们给角色role1绑定命名空间test的读写权限。然后又因为刚刚我们是将user1绑定到了role1上,那么user1这个用户就可以对test这个命名空间的资源进行读写操作了。

5、使用user1登录控制台。点击控制台右上角,退出admin账号,然后用刚才创建的user1进行登录:

f54e4a5780d543465e499b012c8a492b.png

如上图所示,首先是左侧的权限管理菜单消失了,因为当前用户不是管理员。其次是会弹出一个鉴权失败的提示框。不用担心,这个提示框意思是user1没有public命名空间的读权限,所以会弹出,但是不影响我们将命名空间切换到test:

61d1d849f8b702e5ae31b142739f10b4.png

如上图所示,我们可以看到test命名空间的配置数据了,下面我们再来介绍客户端的使用。

6、首先依赖最新的nacos 1.2.0客户端,然后在初始化时添加如下代码:

Properties properties = new Properties();

properties.put(PropertyKeyConst.NAMESPACE, "99a791cf-41c4-4535-9e93-b0141652bad0");

properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");

// 配置用户名:

properties.put(PropertyKeyConst.USERNAME, "user1");

// 配置密码:

properties.put(PropertyKeyConst.PASSWORD, "pwd1");

ConfigService iconfig = NacosFactory.createConfigService(properties);

7、使用客户端进行正常的读写配置操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

authorization权限控制_Nacos 权限控制介绍及实战 的相关文章

  • Outlook 日历 .Net Core Web API GetList(tokenCredential 参数不能为空。(参数 'tokenCredential'))

    我有一个与 Outlook 日历集成相关的 API 项目 通过此项目 您可以访问您的 Outlook 帐户 我想在访问日历部分后列出所有事件 我看了你的文字记录 但有些地方我不明白 我怎样才能得到这个列表 这份文件但我不明白 appsett
  • 寻找许可证密钥算法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Stack Overflow 上有很多与许可证密钥相关的问题 但他们不回答这个问题 任何人都可以提供一个简单的许可证密钥算法 该算法独
  • 全局授权过滤器不适用于 Swagger UI Asp.net Web Api

    我正在实施招摇的用户界面 https swagger io tools swagger ui 对于我的 Asp net WEB Api 项目 我使用默认值System Web Http AuthorizeAttribute 我已将其注册到我
  • 如何使用 JWT 令牌管理多设备同时登录?

    我的疑问是关于使用 JWT 令牌支持同一用户同时进行多设备登录 我使用 NestJS 作为我的后端 用户表 userid 用户名 密码 包含哈希密码 名称 refreshToken 包含哈希刷新令牌 当用户执行 api login 调用时
  • Laravel 授权策略 AccessDeniedHttpException 此操作未经授权

    我有这样的设置 应用程序 策略 观察策略
  • 拒绝访问文件夹但允许访问该文件夹内的文件

    我想拒绝匿名用户访问文件夹 test 但排除并允许访问测试文件夹内的文件 webform1 为什么这不起作用
  • ASP.NET Core 中 Mongodb 数据存储的基于简单令牌的身份验证/授权

    我需要实现非常简单的身份验证机制 基本上有两个角色 Owners and Users 我认为拥有 Enum 就足够了 应用程序本身是SPA 通过Asp net core实现webapi 我看到文章 如何使用 EF Identity 实现它
  • 内置身份验证机制-API网关

    API网关具有执行授权的内置功能 但是 awslabs 提供的示例将 lambda 连接到 API 网关 其中 lambda 根据此进行授权code https github com awslabs serverless applicati
  • 控制器类中授权角色的继承

    我创建了控制器类来协助角色授权 我有一个基类ControllersAuthorities 这是最高级别的权限 我创建了其他类来扩展每个基类 Authorize Roles Owner public abstract class Contro
  • 使用 IIS 和 ACL 的 WCF 授权

    我正在尝试保护一些 WCF 服务 如果可能的话 我想使用 IIS 或 Web config 来完成所有繁重的工作 配置 我不想在我的代码中嵌入任何东西 我想我知道这可能不可行 如果可能的话 我想实现这一点而不必求助于 AspCompatib
  • 如何以轻松的方式实现身份验证?

    我正在使用 python 在网络应用程序谷歌应用程序引擎上构建图片日记 用户可以注册并将照片发布到他们的日记中 另外 我正在尝试尽可能地遵循 REST 架构 Web 应用程序的身份验证方案基于以下形式 1 从前端发布用户名 密码2 认证成功
  • OAuth 授权码何时到期?

    我知道 在 OAuth 中使用授权代码 授权代码 时 访问令牌的生命周期应该很短 但刷新令牌的生命周期可以很长 所以我为我的项目决定 访问令牌生命周期 1 天 刷新令牌生命周期 30 天 但授权码的典型生命周期是多长 我认为它应该非常非常短
  • Graphql @include 带表达式

    我正在实现一个查询 该查询应该根据用户登录状态提供响应中的某些字段 具体来说 我想得到 点率 仅当字段 authenticationToken已通过并且希望避免通过 authenticated在下面的查询中 我想避免发送的原因 authen
  • 使用 IIS8.0 Express (vs2013) 的 .NET Forms 身份验证 - 401.2.:未经授权:由于服务器配置导致登录失败

    需要注意的一件事 我创建了一个带有个人用户帐户身份验证的 Web 应用程序并添加了 它完全按照预期工作 我想知道这个应用程序和从无身份验证开始时有什么不同 我创建了一个新的 Web 表单应用程序 带有 不带有身份验证 只是为了确保我的项目中
  • 具有用于角色授权的空间的 AD 组

    我正在尝试获得与 AD 组合作的角色授权 然而 由于它包含空格 它似乎不起作用 我尝试过没有空格的 AD 组 它们工作得很好
  • 将 access_token 存储在用户声明中以进行授权是否安全?

    因此 我在设置 IdentityServer4 时遇到了承载身份验证问题 基本上 我无法调用我的 API 资源并收到 401 错误 当我使用 access token 添加授权标头时 我能够从我的网络请求中获取数据 using var cl
  • 使用XACML来表达策略,它是一个逻辑表达式

    我对 XACML 很陌生 我正在使用 XACML 来表达策略 但除了以下几个例子之外 我找不到任何好的例子OASIS XACML技术委员会 http docs oasis open org xacml 3 0 xacml 3 0 core
  • 优雅地退出 Laravel 作用域

    我有一个范围 它根据用户角色以限制方式起作用 您可以将一组规则转发到限制数据库最终输出的范围 一个非常简化的角色限制示例 first name foo 只会返回其记录first name开始于foo 这实际上意味着我已禁止具有该角色的用户查
  • Google API 令牌端点 POST 返回错误请求 400

    我正在尝试用一次性 Google Plus 授权代码换取访问令牌 但我不断收到 400 Bad Request 我正在使用VB NET 这是代码 We should now have a good one time authorizatio
  • 编写 CherryPy 装饰器以进行授权

    我有一个cherrypy应用程序 在某些视图上我想开始只允许某些用户查看它们 并将其他任何人发送到需要授权的页面 有没有办法使用自定义装饰器来做到这一点 我认为这将是最优雅的选择 这是我想做的一个基本示例 class MyApp autho

随机推荐