el-admin
基于 vue+springboot 的全栈脚手架,详细信息可以 google 和百度,这里借用这个脚手架学习 spring 以及完成自己想要的一些功能
MySQL坑
赋权
Mysql8后的赋予权限时,无需在写用户密码,只要按照类似下面的执行即可
CREATE USER 'root'@'%' IDENTIFIED BY 'PASSWORD';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
踩过的坑记录
- SpringSecurity 的 BadCrential
这个会有很多种情况,像帐号问题,加密问题,数据库存储的是加密字符串 etc。这里说一个场景是在 eladmin 操作界面把数据库密码改了,然后登录时忘记了这茬。= & = 一直用 123456 继续登录,导致悲剧的发生哭了。
可以通过 debug 找到是
public boolean matches(CharSequence rawPassword, String encodedPassword) {
if (rawPassword == null) {
throw new IllegalArgumentException("rawPassword cannot be null");
} else if (encodedPassword != null && encodedPassword.length() != 0) {
if (!this.BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
this.logger.warn("Encoded password does not look like BCrypt");
return false;
} else {
// qiao:此处会发现密码不对,就能找到问题了,后面就是对数据库加密字符串解密看看设置的是啥在处理下就解决了
return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
}
} else {
this.logger.warn("Empty encoded password");
return false;
}
}
- redis 集群握手失败
每个 redis 集群节点都需要打开两个 TCP 链接,用于给 client 提供服务的 redis tcp 端口,比如说 6379,加上通过向数据端口添加 10000 获得的端口,比如 6379 的数据向端口为 16379
第二个高端口用于集群总线,做故障检查,配置更新,故障转移授权 etc。
如果是用云服务器的,应注意这些端口是否有打开
idea 启动失败,报端口已被占用
netsh int ipv4 set dynamicport tcp start=49152 num=16383
netsh int ipv4 set dynamicport udp start=49152 num=16383
# 如果上面两个不行,就用下面的大招
net stop winnat
net start winnat
Unable to find a @SpringBootConfiguration when doing a JpaTest
问题原因,单元测试类的包路径与启动类的包路径不在同一个目录下,这里可以选择放同一个包路径下或者自行指定启动类
- 链接 redis 数据库时报错
把 redis.database 和.host 搞混了,database 是指 redis 的分库概念,比如哨兵是 0-15 一共 16 个分库,正常选 0 库即可。而 host 是指 redis 的 ip
JUnit测试提示Java.lang.Exception: No runnable methods
包引用问题,换成 org.junit 即可解决
- redis 链接失败 > 需要自行配置 redis 相关配置,在 application-dev.xml 里面配置
- 如果是云主机
- 注意看下控制台设置了端口开放了没,然后就是记得每一个 redis 节点都需放开 bind 才能远程连接
必备的配置项
redis 集群设置密码
记得给所有节点都加上密码
搭建 redis 集群
redis-cli --cluster create 193.112.28.19:6379 193.112.28.19:6378 193.112.28.19:6377 193.112.28.19:6376 193.112.28.19:6375 193.112.28.19:6374 --cluster-replicas 1
加解密配置项密码
- 资源引入
<!--加密解密jasypt--> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>${jasypt.version}</version> </dependency>
- 配置文件中配置沙子
此处注意,为了防止沙子外泄,建议是作为命令行启动防止泄露,或者放到配置中心等
# 加解密内容的沙子,加密解密的关键钥匙,通过命令行启动,避免上传到服务器上导致被破解 # 启动命令为: java -Djasypt.encryptor.password="password" -jar my-application.jar #jasypt: # encryptor: # password:
- 加解密的测试类
/** * 测试jasypt加解密$ * <p> * 创建时间: 2021/3/20 21:32 * 博客地址: <a href="https://tyrantqiao.com">详情戳我(╯‵□′)╯︵┻━┻)</a> * * @author tyrantqiao * @version 1.0 **/ @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class TestEncryCode { @Autowired private StringEncryptor stringEncryptor; /** * 加密解密密码 */ @Test public void testEncryPassword() { extracted("test"); } private void extracted(String needEncryStr) { String encryptStr = stringEncryptor.encrypt(needEncryStr); assert !StringUtils.isEmpty(encryptStr); String decryptResult = stringEncryptor.decrypt(encryptStr); assert decryptResult.equals(needEncryStr); System.out.println(encryptStr); System.out.println(decryptResult); } @Test public void contextLoads() { } }