老鸟飞过 , 只做学习使用,欢迎交流
1.概述
Nacos的控制台登录账号是nacos/nacos , 在生产环境中一定需要修改密码,不然一旦服务器地址泄露Nacos就会变得不安全,后果不堪设想。在上一章节我们做Nacos集群时我们基于MySql做了Nacos的数据持久化。在Nacos的数据库中有一个user
表 , 这个表就是用来记录Nacos的控制台登录账号的,我们只需要修改表中的password
字段的 值即可。如下
2.BCryptPasswordEncoder加密
Nacos的密码到底是使用什么样的加密方式来加密的呢?我这里截了一下Nacos源码中密码的加密工具如下:
package com.alibaba.nacos.console.utils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* Password encoder tool
*
* @author nacos
*/
public class PasswordEncoderUtil {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("nacos"));
}
public static Boolean matches(String raw, String encoded) {
return new BCryptPasswordEncoder().matches(raw, encoded);
}
public static String encode(String raw) {
return new BCryptPasswordEncoder().encode(raw);
}
}
Nacos用到了security的BCryptPasswordEncoder加密器进行加密,这种加密算法使用哈希算法+随机盐来对字符串加密,对相同的内容多次加密出来的结果不一样却又能校验成功,这样更能保证密码不被破解。BCryptPasswordEncoder提供了encode方法用来对明文进行加密,matches方法用来校验明文密码和密文是否匹配,下面是一段加密,验证的测试代码
public class PasswordEncoderUtil {
public static void main(String[] args) {
//创建加密器
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
//对字符串进行加密得到密文
String enPass = bCryptPasswordEncoder.encode("admin");
//验证明文的密码是否正确
boolean isMathch = bCryptPasswordEncoder.matches("admin", enPass);
System.out.println("密码比对成功"); //打印true
}
}
3.修改Nacos密码
如果要使用 BCryptPasswordEncoder 你需要导入Security的依赖,我这里在springcloudalibaba-user-server-1010工程中加入了如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
然后写了一段代码得到密文
public class PasswordEncoderUtil {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("admin"));
//密文:$2a$10$YrC76q2zs2zLLlUljW5MzubUS0L2hKtMYfjDQCmtWkNLFjFTCf9zO
}
}
这里把密码“admin”,加密成了密码,我们需要把密文修改到Nacos
的user
表中的 password
字段
注意:得到密文之后,请把 spring-boot-starter-security 包注释,因为不需要了,不然security会自动做权限检查会报错。
4.登录Nacos控制台
启动Nacos服务端,访问控制台 http://centos的ip:8848/nacos/
然后使用 nacos/admin
登录