1024创新实验室-公告

助力抖音1000个粉丝,开播写代码🎉🎉

打开【抖音APP】-点击【左上角侧边栏】-【点击扫一扫】-【进行关注】🎉🎉

和1024创新实验室一起,热爱代码,热爱生活,永远年轻,永远前行🎉🎉


Skip to content

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) {
    ...
    ...
}

密码加盐

具体请看 SecurityPasswordServicegetEncryptPwd方法


联系我们

1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室 致力于成为中原领先、国内一流的技术团队, 以AI+数字化为驱动,用技术为产业互联网提供无限可能, 业务如下:
  • 教育领域(高职院校数字化、就业创业大数据平台、继续教育平台;在线教育系统、视频直播、题库等,包含:医学、应急管理、成考、专升本等)
  • 供应链领域(网络货运平台、大宗贸易进销存ERP、物流管理TMS、B2B电商、仓储WMS、AI提效等)
  • 中医领域(诊所数字化管理、互联网医院、AI辅助诊疗、中医适宜技术、在线云问诊、空中药房等)
  • AI+软件领域(软件定制外包、开源技术、数据大屏、国产化改造、技术升级换代、人员外包、技术顾问、技术培训等)
加微信: 卓大
拉你入群,一起学习
公众号 :六边形工程师
分享:赚钱、代码、生活
请 “1024创新实验室”
烩面里加肉
咖啡配胡辣汤,提神又饱腹
抖音 : 六边形工程师
直播:赚钱、代码、中医