认证接口
这里将私钥配置在 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开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
tch(Exception e) {
throw new RuntimeException(e);
}
}
/**
-
获取公钥字符串(base64字符串)
-
@return
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-1MBHeei0-1714703129136)]
[外链图片转存中…(img-S1Nsf2Uw-1714703129137)]
[外链图片转存中…(img-jSWxdpZ1-1714703129137)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!