SmartAdmin三级等保-密码相关
密码相关
SmartAdmin的登录功能完全满足三级等保,且支持配置化,具体如下功能:
- 密码必须为长度8-20位且必须包含大小写字母、数字、特殊符号(如:@#$%^&*()_+-=)等三种字符
- 要求用户对口令(密码)定期更换,默认:更换周期为6个月,更新的口令(密码) 5 次内不能重复
- 密码加密保存,默认:使用 md5 + salt(加盐) 存储
密码复杂度
系统默认 密码复杂度为 密码必须为长度8-20位且必须包含大小写字母、数字、特殊符号(如:@#$%^&*()_+-=)等三种字符
具体后端代码可在 SecurityPasswordService
java
public static final String PASSWORD_PATTERN = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\\W_!@#$%^&*`~()-+=]+$)(?![0-9\\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\\W_!@#$%^&*`~()-+=]*$";
public ResponseDTO<String> validatePassComplexity(String password) {
...
// 无需校验
if (!level3ProtectConfigService.isPasswordComplexityEnabled()) {
return ResponseDTO.ok();
}
// 密码复杂度
if (!password.matches(PASSWORD_PATTERN)) {
return ResponseDTO.userErrorParam(PASSWORD_FORMAT_MSG);
}
return ResponseDTO.ok();
}
密码定期更换
默认功能为:更换周期为6个月,更新的口令(密码) 5 次内不能重复 表结构:使用 t_password_log
记录密码的修改记录,修改前的密码和修改后的密码 代码实现:
1)登录时候 校验 t_password_log
上次修改密码时间,超过时间则打开修改密码弹窗
2)修改密码后,在 t_password_log
表中记录本次修改的密码
表结构
sql
CREATE TABLE `t_password_log` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` bigint NOT NULL COMMENT '用户id',
`user_type` tinyint NOT NULL COMMENT '用户类型',
`old_password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '旧密码',
`new_password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '新密码',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `user_and_type_index` (`user_id`,`user_type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='密码修改记录';
前端:是否需要修改密码的状态记录在 pinia
user state中 needUpdatePwdFlag
字段
javascript
export const useUserStore = defineStore({
id: 'userStore',
state: () => ({
...
//是否需要修改密码
needUpdatePwdFlag: false,
前端:强制修改密码弹窗在 /layout/index.vue
文件中引入 强制修改密码弹窗 RegularChangePasswordModal.vue
javascript
/layout/index.vue
<template>
<!--左侧菜单 模式-->
<SideLayout v-if="layout === LAYOUT_ENUM.SIDE.value" />
<!--左侧展开菜单 模式-->
<SideExpandLayout v-if="layout === LAYOUT_ENUM.SIDE_EXPAND.value" />
<!--顶部菜单 模式-->
<TopLayout v-if="layout === LAYOUT_ENUM.TOP.value" />
<!--定期修改密码-->
<RegularChangePasswordModal />
</template>
regular-change-password-modal.vue
javascript
<template>
<a-modal :open="visible" width="620px" :footer="null" :bodyStyle="{ height: '420px' }" title="" :closable="false" :maskClosable="true">
<a-alert style="width: 550px" message="根据《网络安全法》和《数据安全法》要求,需要定期修改密码保障数据安全!" type="warning" show-icon />
<Password @on-success="refresh" />
</a-modal>
</template>
<script setup>
import { computed } from 'vue';
import Password from '/@/views/system/account/components/password/index.vue';
import { useUserStore } from '/@/store/modules/system/user.js';
import { loginApi } from '/@/api/system/login-api.js';
import { smartSentry } from '/@/lib/smart-sentry.js';
import { SmartLoading } from '/@/components/framework/smart-loading/index.js';
//修改密码弹窗
const visible = computed(() => {
return useUserStore().$state.needUpdatePwdFlag;
});
//刷新
async function refresh() {
try {
SmartLoading.show();
//获取登录用户信息
const res = await loginApi.getLoginInfo();
//更新用户信息到pinia
useUserStore().setUserLoginInfo(res.data);
} catch (e) {
smartSentry.captureError(e);
} finally {
SmartLoading.hide();
}
}
</script>
登录密码请求加密
在前端代码 login.vue
中,在发送登录请求之前,使用 lib/encrypt.js
,支持SM4和AES加密, 进行加密,后端使用 ApiEncryptService
的实现类进行密码解密,代码如下
js
try {
SmartLoading.show();
// 密码加密
let encryptPasswordForm = Object.assign({}, loginForm, {
password: encryptData(loginForm.password),
});
const res = await loginApi.login(encryptPasswordForm);
// 登录成功
stopRefreshCaptchaInterval();
localSave(LocalStorageKeyConst.USER_TOKEN, res.data.token ? res.data.token : '');
message.success('登录成功');
//更新用户信息到pinia
useUserStore().setUserLoginInfo(res.data);
//构建系统的路由
buildRoutes();
router.push('/home');
} catch (e) {
...
...
}
密码加盐
具体请看 SecurityPasswordService
类 getEncryptPwd
方法
联系我们
1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室 致力于成为中原领先、国内一流的技术团队, 以AI+数字化为驱动,用技术为产业互联网提供无限可能, 业务如下:
- 教育领域(高职院校数字化、就业创业大数据平台、继续教育平台;在线教育系统、视频直播、题库等,包含:医学、应急管理、成考、专升本等)
- 供应链领域(网络货运平台、大宗贸易进销存ERP、物流管理TMS、B2B电商、仓储WMS、AI提效等)
- 中医领域(诊所数字化管理、互联网医院、AI辅助诊疗、中医适宜技术、在线云问诊、空中药房等)
- AI+软件领域(软件定制外包、开源技术、数据大屏、国产化改造、技术升级换代、人员外包、技术顾问、技术培训等)
加微信: 卓大 拉你入群,一起学习 | 公众号 :六边形工程师 分享:赚钱、代码、生活 | 请 “1024创新实验室” 烩面里加肉 咖啡配胡辣汤,提神又饱腹 | 抖音 : 六边形工程师 直播:赚钱、代码、中医 |