增加打手密码强度校验
This commit is contained in:
@@ -13,6 +13,7 @@ import { Navigate, useNavigate } from 'react-router'
|
||||
|
||||
import { loginWorker, registerWorker, sendWorkerSmsCode } from '@/services/worker'
|
||||
import { hasWorkerSession, setWorkerSession } from '@/utils/worker-auth'
|
||||
import { isWorkerPasswordStrong, WORKER_PASSWORD_RULE_MESSAGE } from '@/utils/worker-password'
|
||||
|
||||
const SMS_COUNTDOWN_SECONDS = 60
|
||||
|
||||
@@ -36,7 +37,7 @@ const brandFeatures = [
|
||||
|
||||
export default function WorkerLoginPage() {
|
||||
const navigate = useNavigate()
|
||||
const { message } = App.useApp()
|
||||
const { message, modal } = App.useApp()
|
||||
const [loading, setLoading] = useState(false)
|
||||
const [registerForm] = Form.useForm()
|
||||
const [countdown, setCountdown] = useState(0)
|
||||
@@ -56,8 +57,19 @@ export default function WorkerLoginPage() {
|
||||
try {
|
||||
const response = await loginWorker(values)
|
||||
setWorkerSession(response.data.token, response.data.expiresAt, response.data.worker)
|
||||
message.success('登录成功')
|
||||
void navigate('/hall', { replace: true })
|
||||
if (response.data.passwordWeak) {
|
||||
modal.confirm({
|
||||
title: '密码安全提醒',
|
||||
content: '当前密码强度较弱,为保障账号安全,建议立即修改密码。',
|
||||
okText: '去修改密码',
|
||||
cancelText: '稍后再说',
|
||||
onOk: () => void navigate('/profile', { replace: true }),
|
||||
onCancel: () => void navigate('/hall', { replace: true }),
|
||||
})
|
||||
} else {
|
||||
message.success('登录成功')
|
||||
void navigate('/hall', { replace: true })
|
||||
}
|
||||
} catch (error) {
|
||||
message.error(error instanceof Error ? error.message : '登录失败')
|
||||
} finally {
|
||||
@@ -275,10 +287,18 @@ export default function WorkerLoginPage() {
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
min: 6,
|
||||
message: '密码至少 6 位',
|
||||
message: '请输入密码',
|
||||
},
|
||||
{
|
||||
validator: (_, value) => {
|
||||
if (!value || isWorkerPasswordStrong(value)) {
|
||||
return Promise.resolve()
|
||||
}
|
||||
return Promise.reject(new Error(WORKER_PASSWORD_RULE_MESSAGE))
|
||||
},
|
||||
},
|
||||
]}
|
||||
extra={WORKER_PASSWORD_RULE_MESSAGE}
|
||||
>
|
||||
<Input.Password prefix={<LockOutlined />} autoComplete="new-password" />
|
||||
</Form.Item>
|
||||
|
||||
@@ -57,6 +57,7 @@ import type {
|
||||
import { formatDateTime } from '@/utils/date-time'
|
||||
import { useIsMobile } from '@/utils/use-is-mobile'
|
||||
import { clearWorkerSession } from '@/utils/worker-auth'
|
||||
import { isWorkerPasswordStrong, WORKER_PASSWORD_RULE_MESSAGE } from '@/utils/worker-password'
|
||||
|
||||
type RechargeFormValues = {
|
||||
amount?: number
|
||||
@@ -1650,8 +1651,16 @@ export default function WorkerProfilePage() {
|
||||
name="newPassword"
|
||||
rules={[
|
||||
{ required: true, message: '请输入新密码' },
|
||||
{ min: 6, message: '新密码至少 6 位' },
|
||||
{
|
||||
validator: (_, value) => {
|
||||
if (!value || isWorkerPasswordStrong(value)) {
|
||||
return Promise.resolve()
|
||||
}
|
||||
return Promise.reject(new Error(WORKER_PASSWORD_RULE_MESSAGE))
|
||||
},
|
||||
},
|
||||
]}
|
||||
extra={WORKER_PASSWORD_RULE_MESSAGE}
|
||||
>
|
||||
<Input.Password autoComplete="new-password" />
|
||||
</Form.Item>
|
||||
|
||||
@@ -334,6 +334,7 @@ export type WorkerLoginResponse = {
|
||||
token: string
|
||||
expiresAt: string
|
||||
worker: WorkerUser
|
||||
passwordWeak?: boolean
|
||||
}
|
||||
|
||||
export type WorkerListResponse<T> = {
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
export const WORKER_PASSWORD_MIN_LENGTH = 6
|
||||
|
||||
export const WORKER_PASSWORD_RULE_MESSAGE =
|
||||
'密码至少 6 位,且必须包含大写字母、小写字母、数字和标点符号'
|
||||
|
||||
export function isWorkerPasswordStrong(value: unknown): boolean {
|
||||
const password = String(value || '')
|
||||
return (
|
||||
password.length >= WORKER_PASSWORD_MIN_LENGTH &&
|
||||
/[A-Z]/.test(password) &&
|
||||
/[a-z]/.test(password) &&
|
||||
/\d/.test(password) &&
|
||||
/[\p{P}\p{S}]/u.test(password)
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user