You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何在Strapi 5.2.0后台登录表单添加验证码字段?

在Strapi 5.2.0后台登录表单添加验证码字段的可行方案

Strapi 5的后台登录表单确实没有预留自定义组件注入点,旧版本的全量替换方法也不适用,但可以通过官方提供的Admin UI扩展机制来实现,完全不需要补丁方案,步骤如下:

1. 替换默认登录页面组件

Strapi 5允许通过src/admin/app.tsx扩展Admin UI,直接替换登录页面组件来添加验证码字段:

首先在项目根目录创建src/admin/app.tsx(如果不存在),写入以下代码:

import React from 'react';
import { LoginPage as BaseLoginPage } from '@strapi/admin/admin/src/pages/LoginPage';
import { Input } from '@strapi/design-system/Input';
import { Label } from '@strapi/design-system/Label';
import { Button } from '@strapi/design-system/Button';

const LoginPage = (props) => {
  const [captcha, setCaptcha] = React.useState('');
  const [captchaImg, setCaptchaImg] = React.useState('');

  // 加载/刷新验证码
  const refreshCaptcha = async () => {
    const res = await fetch('/api/captcha/generate', { method: 'GET' });
    const blob = await res.blob();
    setCaptchaImg(URL.createObjectURL(blob));
  };

  React.useEffect(() => {
    refreshCaptcha();
  }, []);

  const handleSubmit = async (event) => {
    event.preventDefault();
    // 先验证验证码
    const verifyRes = await fetch('/api/captcha/verify', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ captcha })
    });
    const { isValid } = await verifyRes.json();

    if (!isValid) {
      alert('验证码错误');
      refreshCaptcha();
      return;
    }

    // 验证码通过,执行原登录逻辑
    await props.handleSubmit(event);
  };

  return (
    <BaseLoginPage
      {...props}
      handleSubmit={handleSubmit}
    >
      {/* 自定义验证码字段区域 */}
      <div style={{ marginBottom: 16 }}>
        <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
          <div style={{ flex: 1 }}>
            <Label htmlFor="captcha">验证码</Label>
            <Input
              type="text"
              name="captcha"
              id="captcha"
              value={captcha}
              onChange={(e) => setCaptcha(e.target.value)}
              required
              placeholder="请输入验证码"
            />
          </div>
          <Button
            variant="secondary"
            onClick={refreshCaptcha}
            style={{ height: 48 }}
          >
            <img src={captchaImg} alt="验证码" style={{ height: '100%' }} />
          </Button>
        </div>
      </div>
    </BaseLoginPage>
  );
};

export default {
  bootstrap(app) {
    app.injectComponent('LoginPage', 'replace', LoginPage);
  },
};

2. 后端实现验证码生成与验证逻辑

2.1 安装验证码依赖(可选,自生成验证码用)

如果不需要第三方验证码服务,用自生成的SVG验证码,先安装依赖:

npm install svg-captcha

2.2 创建验证码服务与路由

在src/api/captcha目录下创建以下文件:

控制器文件 src/api/captcha/controllers/captcha.js

'use strict';
const svgCaptcha = require('svg-captcha');

module.exports = {
  // 生成验证码
  generate: async (ctx) => {
    const captcha = svgCaptcha.create({
      size: 4,
      noise: 3,
      width: 120,
      height: 48
    });
    // 把验证码文本存在session里,用于后续验证
    ctx.session.captcha = captcha.text.toLowerCase();
    ctx.type = 'image/svg+xml';
    ctx.send(captcha.data);
  },

  // 验证验证码
  verify: async (ctx) => {
    const { captcha } = ctx.request.body;
    const isValid = captcha?.toLowerCase() === ctx.session.captcha;
    
    // 验证后清空session里的验证码,防止重复使用
    if (isValid) {
      delete ctx.session.captcha;
    }

    ctx.send({ isValid });
  },
};

路由文件 src/api/captcha/routes/captcha.js

'use strict';

module.exports = {
  routes: [
    {
      method: 'GET',
      path: '/captcha/generate',
      handler: 'captcha.generate',
      config: {
        auth: false, // 无需登录即可访问
      },
    },
    {
      method: 'POST',
      path: '/captcha/verify',
      handler: 'captcha.verify',
      config: {
        auth: false,
      },
    },
  ],
};

2.3 启用Session

确保config/middlewares.js里包含session中间件:

module.exports = [
  'strapi::errors',
  'strapi::security',
  'strapi::cors',
  'strapi::poweredBy',
  'strapi::logger',
  'strapi::query',
  'strapi::body',
  'strapi::session', // 确保这个存在
  'strapi::favicon',
  'strapi::public',
];

3. 测试效果

启动Strapi服务后,访问后台登录页面,就能看到新增的验证码字段,输入正确验证码后才能完成登录。

这种方式完全基于Strapi官方的扩展机制,不属于补丁方案,符合规范,也能完美适配Strapi 5.2.0版本。

内容的提问来源于stack exchange,提问作者RadioZahra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:11:20