认证接口
这里将私钥配置在 applicaiton.yml
中。
@RestController
@RequestMapping(“auth”)
@Slf4j
public class LoginController {
@Value(“${rsa.private_key}”)
private String privateKey;
private final AuthenticationManagerBuilder authenticationManagerBuilder;
public LoginController(AuthenticationManagerBuilder authenticationManagerBuilder) {
this.authenticationManagerBuilder = authenticationManagerBuilder;
}
@PostMapping(“/login”)
public String login(@RequestBody FormUser formUser, HttpServletRequest request) {
log.info(“formUser encrypted: {}”, formUser);
// 用户信息RSA私钥解密,方法一:自定义工具类:RSAEncrypt
// String username = RSAEncrypt.decrypt(formUser.getUsername(), privateKey);
// String password = RSAEncrypt.decrypt(formUser.getPassword(), privateKey);
// log.info(“Userinfo decrypted: {}, {}”, username, password);
// 用户信息RSA私钥解密,方法二:使用hutool中的工具类进行解密
RSA rsa = new RSA(privateKey, null);
String username = new String(rsa.decrypt(formUser.getUsername(), KeyType.PrivateKey));
String password = new String(rsa.decrypt(formUser.getPassword(), KeyType.PrivateKey));
log.info(“Userinfo decrypted: {}, {}”, username, password);
// 核验用户名密码
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
log.info(“authentication: {}”, authentication);
return SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString();
}
}
自定义工具类进行解密
commons-codec
commons-codec
1.12
public class RSAEncrypt {
/**
-
RSA公钥加密
-
@param str 待加密字符串
-
@param publicKey 公钥
-
@return 密文
*/
public static String encrypt(String str, String publicKey) {
try {
//base64编码的公钥
byte[] decoded = Base64.decodeBase64(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance(“RSA”).generatePublic(new X509EncodedKeySpec(decoded));
//RSA加密
Cipher cipher = Cipher.getInstance(“RSA”);
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
return Base64.encodeBase64String(cipher.doFinal(str.getBytes(“UTF-8”)));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
-
RSA私钥解密
-
@param str 已加密字符串
-
@param privateKey 私钥
-
@return 明文
*/
public static String decrypt(String str, String privateKey) {
try {
//64位解码加密后的字符串
byte[] inputByte = Base64.decodeBase64(str.getBytes(“UTF-8”));
//base64编码的私钥
byte[] decoded = Base64.decodeBase64(privateKey);
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance(“RSA”).generatePrivate(new PKCS8EncodedKeySpec(decoded));
//RSA解密
Cipher cipher = Cipher.getInstance(“RSA”);
cipher.init(Cipher.DECRYPT_MODE, priKey);
return new String(cipher.doFinal(inputByte));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
使用hutool中的工具类进行解密
cn.hutool
hutool-all
5.0.6
基于 Vue3.0
, axios
实现极简登录页面。
Note:
-
前提需要有
Node.js
环境,可使用nvm
进行Node.js
的多版本管理;可参考https://heartsuit.blog.csdn.net/article/details/116665356 -
npm install <package>
默认会在依赖安装完成后将其写入package.json
,因此安装依赖的命令都未附加save
参数。
$ node -v
v12.16.1
安装vue-cli并创建项目
npm install -g @vue/cli
vue --version
vue create hello-world
刚开始的 package.json
依赖是这样:
“dependencies”: {
“core-js”: “^3.6.5”,
“vue”: “^3.0.0”
},
集成Axios
- 安装依赖
npm install axios
此时, package.json
的依赖变为:
“dependencies”: {
“axios”: “^0.21.1”,
“core-js”: “^3.6.5”,
“vue”: “^3.0.0”
},
- 按需引入
在需要使用axios的组件中引入 import axios from "axios";
集成jsencrypt
此时, package.json
的依赖变为:
“dependencies”: {
“axios”: “^0.21.1”,
“core-js”: “^3.6.5”,
“jsencrypt”: “^3.2.1”,
“vue”: “^3.0.0”
},
- 按需引入
在需要使用JSEncrypt的组件中引入 import JSEncrypt from "jsencrypt";
最终的前端登录组件代码
用户名
密码
- 开发环境跨域
方法一:通过开发环境(生产环境可通过Nginx实现)的代理服务进行请求转发,新建 vue.config.js
文件,内容如下:
module.exports = {
devServer: {
proxy: {
‘/api’: {
target: ‘http://localhost:8000/’,
changeOrigin: true,
ws: true,
secure: true,
pathRewrite: {
‘^/api’: ‘’
}
}
}
}
};
方法二:因为后端服务是我们自己开发的,所以可以在后端进行CORS配置,允许跨域
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping(“/**”).
allowedOriginPatterns(“*”).
allowedMethods(“*”).
allowedHeaders(“*”).
allowCredentials(true).
exposedHeaders(HttpHeaders.SET_COOKIE).maxAge(3600L);
}
};
}
}
当然,除了使用Windows、Linux上的openssl工具生成密钥对之外,我们也可以使用代码来直接生成。
org.bouncycastle
bcprov-jdk15on
1.64
public class RSAEncrypt {
private static final KeyPair keyPair = genKeyPair() ;
private static org.bouncycastle.jce.provider.BouncyCastleProvider bouncyCastleProvider = null;
public static synchronized org.bouncycastle.jce.provider.BouncyCastleProvider getInstance() {
if (bouncyCastleProvider == null) {
bouncyCastleProvider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
}
return bouncyCastleProvider;
}
/**
- 随机生成密钥对
*/
public static KeyPair genKeyPair() {
try {
// Provider provider =new org.bouncycastle.jce.provider.BouncyCastleProvider();
// Security.addProvider(DEFAULT_PROVIDER);
SecureRandom random = new SecureRandom();
KeyPairGenerator generator = KeyPairGenerator.getInstance(“RSA”, getInstance());
generator.initialize(1024,random);
return generator.generateKeyPair();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
/**
-
获取公钥字符串(base64字符串)
-
@return
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)
总结:绘上一张Kakfa架构思维大纲脑图(xmind)
其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?
若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理
梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。
-
Kafka入门
-
为什么选择Kafka
-
Kafka的安装、管理和配置
-
Kafka的集群
-
第一个Kafka程序
-
Kafka的生产者
-
Kafka的消费者
-
深入理解Kafka
-
可靠的数据传递
-
Spring和Kafka的整合
-
SpringBoot和Kafka的整合
-
Kafka实战之削峰填谷
-
数据管道和流式处理(了解即可)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
90466)]
总结:绘上一张Kakfa架构思维大纲脑图(xmind)
[外链图片转存中…(img-MaFYWeQa-1713788790467)]
其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?
若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理
梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。
-
Kafka入门
-
为什么选择Kafka
-
Kafka的安装、管理和配置
-
Kafka的集群
-
第一个Kafka程序
-
Kafka的生产者
-
Kafka的消费者
-
深入理解Kafka
-
可靠的数据传递
-
Spring和Kafka的整合
-
SpringBoot和Kafka的整合
-
Kafka实战之削峰填谷
-
数据管道和流式处理(了解即可)
[外链图片转存中…(img-Z6JqzHhH-1713788790467)]
[外链图片转存中…(img-3sybusqi-1713788790468)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!