首页 > 其他分享 >【第3章】Spring Cloud之Nacos服务端权限认证

【第3章】Spring Cloud之Nacos服务端权限认证

时间:2024-07-17 20:26:01浏览次数:14  
标签:core Spring Nacos auth nacos token 鉴权 服务端

文章目录


前言

上一章我们访问了控制台,这里为了安全我们开启Nacos的权限认证。


一、默认控制台登录页

2.2.2版本之前的Nacos默认控制台,无论服务端是否开启鉴权,都会存在一个登录页;这导致很多用户被误导认为Nacos默认是存在鉴权的。在社区安全工程师的建议下,Nacos自2.2.2版本开始,在未开启鉴权时,默认控制台将不需要登录即可访问,同时在控制台中给予提示,提醒用户当前集群未开启鉴权。

在用户开启鉴权后,控制台才需要进行登录访问。 同时针对不同的鉴权插件,提供新的接口方法,用于提示控制台是否开启登录页;同时在2.2.3版本后,Nacos可支持关闭开源控制台,并引导到用户自定义的Nacos控制台,详情可查看Nacos鉴权插件-服务端插件控制台手册-关闭登录功能

二、鉴权

1.相关参数

这里我们先学习鉴权相关参数,完成对应参数配置即可生效。

参数名默认值启止版本说明
nacos.core.auth.enabledfalse1.2.0 ~ latest是否开启鉴权功能
nacos.core.auth.system.typenacos1.2.0 ~ latest鉴权类型
nacos.core.auth.plugin.nacos.token.secret.keySecretKey012345678901234567890123456789012345678901234567890123456789(2.2.0.1后无默认值)2.1.0 ~ latest默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,使用默认值有安全风险
nacos.core.auth.plugin.nacos.token.expire.seconds180002.1.0 ~ latest用户登陆临时accessToken的过期时间
nacos.core.auth.enable.userAgentAuthWhitefalse1.4.1 ~ latest是否使用useragent白名单,主要用于适配老版本升级,置为true时有安全风险
nacos.core.auth.server.identity.keyserverIdentity(2.2.1后无默认值)1.4.1 ~ latest用于替换useragent白名单的身份识别key,使用默认值有安全风险
nacos.core.auth.server.identity.valuesecurity(2.2.1后无默认值)1.4.1 ~ latest用于替换useragent白名单的身份识别value,使用默认值有安全风险
nacos.core.auth.default.token.secret.keySecretKey0123456789012345678901234567890123456789012345678901234567891.2.0 ~ 2.0.4同nacos.core.auth.plugin.nacos.token.secret.key
nacos.core.auth.default.token.expire.seconds180001.2.0 ~ 2.0.4同nacos.core.auth.plugin.nacos.token.expire.seconds

2.服务端开启鉴权

2.1 开启鉴权

开启鉴权之后,application.properties中的配置信息为:

### If turn on auth system:
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true

第一项配置和默认相同,则无需改动

2.2 自定义密钥

自定义密钥

自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符。例如下面的的例子:

### The default token(Base64 String):
nacos.core.auth.default.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=

### 2.1.0 版本后
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=

注意:鉴权开关是修改之后立马生效的,不需要重启服务端。动态修改token.secret.key时,请确保token是有效的,如果修改成无效值,会导致后续无法登录,请求访问异常。
生成密钥

public static void customSecret(){
   String uuid = UUID.randomUUID().toString().replace("-","");
    System.out.println(uuid);
    String secret = Base64.getEncoder().encodeToString(uuid.getBytes(StandardCharsets.UTF_8));
    System.out.println(secret);
}
//输出
6da8b41d3cca4abebb49e72a3555e30b
NmRhOGI0MWQzY2NhNGFiZWJiNDllNzJhMzU1NWUzMGI=

3. 开启服务身份识别功能

开启鉴权功能后,服务端之间的请求也会通过鉴权系统的影响。考虑到服务端之间的通信应该是可信的,因此在1.2~1.4.0版本期间,通过User-Agent中是否包含Nacos-Server来进行判断请求是否来自其他服务端。

但这种实现由于过于简单且固定,导致可能存在安全问题。因此从1.4.1版本开始,Nacos添加服务身份识别功能,用户可以自行配置服务端的Identity,不再使用User-Agent作为服务端请求的判断标准。

开启方式:

### 开启鉴权
nacos.core.auth.enabled=true

### 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false

### 配置自定义身份识别的key(不可为空)和value(不可为空)
nacos.core.auth.server.identity.key=example
nacos.core.auth.server.identity.value=example

** 注意 ** 所有集群均需要配置相同的server.identity信息,否则可能导致服务端之间数据不一致或无法删除实例等问题。

4. 开启Token缓存功能

服务端自2.2.1版本后,默认鉴权插件模块支持token缓存功能,可参见ISSUE #9906

https://github.com/alibaba/nacos/issues/9906

背景
无论是客户端SDK还是OpenAPI,在调用login接口获取accessToken之后,携带accessToken访问服务端,服务端解析Token进行鉴权。解析的动作比较耗时,如果想要提升接口的性能,可以考虑开启缓存Token的功能,用字符串比较代替Token解析。

开启方式

nacos.core.auth.plugin.nacos.token.cache.enable=true

注意事项
在开启Token缓存功能之前,服务端对每一个携带用户名密码访问login接口的请求都会生成新的token,接口的返回值中的tokenTtl字段跟服务端配置文件中设置的值相等,配置如下:

nacos.core.auth.plugin.nacos.token.expire.seconds=18000

在开启Token缓存功能之后,服务端对每一个携带用户名密码访问login接口的请求,会先检查缓存中是否存在该用户名对应的token。若不存在,生成新的Token,插入缓存再返回;若存在,返回该token,此时tokenTtl字段的值为配置文件中设置的值减去该Token在缓存中存留的时长。 如果Token在缓存中存留的时长超过配置文件设置的值的90%,当login接口收到请求时,尽管缓存中存在该用户名对应的Token,服务端会重新生成Token返回给请求方,并更新缓存。因此,最差情况下,请求方收到的tokenTtl只有配置文件设置的值的10%。

三、效果

http://192.168.137.192:8848/nacos/
nacos/nacos
在这里插入图片描述
在这里插入图片描述

四、用户列表

在这里插入图片描述

我们可以通过用户列表修改默认密码,或新增用户进一步规范控制台访问权限,保证应用的安全。


总结

回到顶部

更多内容请查看官网服务鉴权

标签:core,Spring,Nacos,auth,nacos,token,鉴权,服务端
From: https://blog.csdn.net/qq_44824164/article/details/140416248

相关文章

  • 【第4章】Spring Cloud之Nacos单机模式支持mysql
    文章目录前言一、初始化1.初始化数据库2.修改配置文件二、效果1.重新启动2.新增用户总结前言在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:安装数据库,版本要......
  • Spring Cloud Alibaba——OpenFeign
            OpenFeign是一个显示声明式的WebService客户端。使用OpenFeign能让编写WebService客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。Springcloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts......
  • Spring AOP当方法被内部调用时,增强逻辑失效问题原因及解决方案
    首先,这个问题本质原因和我之前写的这篇文章《Spring事务调用类自己方法失效解决办法和原因》是一样的,都是动态代理失效导致的。最近在开发中遇到了一个关于SpringAOP的问题。需求是统计某个方法的调用次数,我尝试使用SpringAOP来实现,但发现当方法被内部调用时,增强逻辑不生效。以......
  • SpringBoot学习笔记
    微服务阶段javaSE:OOPmySQL:持久化html+css+js+jquery+框架:视图,框架不熟练,css不好;javaweb:独立开发MVC三层架构的的网站:原始ssm:框架:简化了我们的开发流程,配置也开始较为复杂;war:tomcat运行spring再简化:springBoot-jar:内嵌tomcat;微服务架构!服务越来越多:springcloud!高内聚,低耦......
  • Spring5-基础(完整流程)
    1、Spring1.1、简介Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。Spring理念:使......
  • Spring Boot引入外部Jar
    springboot引入外部jar包并打包-乐子不痞-博客园(cnblogs.com)Jar存放位置 引入dependency<dependency><groupId>com.zebra.sdk</groupId><artifactId>com.zebra.sdk</artifactId><version>1.0.......
  • springboot自学(1)bean的加载方式
    第一个加载方式:Xml:声明和加载自定义的bean 声明第三方的bean遍历bean名称(id)如果不自定义id的话,会自动命名一个 Xml+注解:对xml文件进行修改  配置第三方的bean       纯注解:   FactoryBean    为什么会有这个......
  • NACOS配置管理
    1、配置管理可以解决什么问题(1)统一管理微服务模块相同的配置(2)实现热部署,更新配置不需要重启服务(3)实现动态路由1.1、实现统一管理配置1.1.1、新增配置1.1.2、配置基本属性 还可以将共有的swagger和log的配置抽取出来,新建shared-swagger.yaml和shared-log.yaml在cart......
  • 基于java+springboot+vue实现的实验室管理系统(文末源码+Lw)127
    基于SpringBoot+Vue的实现的实验室管理系统(源码+数据库+万字Lun文+流程图+ER图+结构图+演示视频+软件包)系统功能:实验室管理系统管理员功能有个人中心,学生管理,教师管理,公告信息管理,知识库管理,实验课程管理,实验室信息管理,实验室预约管理,实验设备管理,采购记录管理,维修记录管理......
  • 基于java+springboot+vue实现的汽车资讯网站(文末源码+Lw)125
    基于SpringBoot+Vue的实现的汽车资讯网站系统(源码+数据库+万字Lun文+流程图+ER图+结构图+演示视频+软件包)系统功能:汽车资讯网站有管理员和用户。管理员功能有个人中心,用户管理,汽车品牌管理,价格分类管理,经销商管理,汽车信息管理,留言板管理,系统管理等。用户可以查看各种汽车信......