1
0
forked from baron/baron-sso

code check 오류 수정

This commit is contained in:
2026-03-31 11:45:00 +09:00
parent 68114eea66
commit 98bb6be549
6 changed files with 60 additions and 30 deletions

View File

@@ -34,7 +34,12 @@ import {
} from "../../components/ui/card"; } from "../../components/ui/card";
import { Input } from "../../components/ui/input"; import { Input } from "../../components/ui/input";
import { Label } from "../../components/ui/label"; import { Label } from "../../components/ui/label";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "../../components/ui/tabs"; import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "../../components/ui/tabs";
import { toast } from "../../components/ui/use-toast"; import { toast } from "../../components/ui/use-toast";
import { import {
type UserSummary, type UserSummary,
@@ -311,10 +316,12 @@ function UserDetailPage() {
queryFn: () => fetchTenants(100, 0), queryFn: () => fetchTenants(100, 0),
}); });
const tenants = tenantsData?.items ?? []; const tenants = tenantsData?.items ?? [];
const { data: passwordPolicy, isLoading: isPasswordPolicyLoading } = useQuery({ const { data: passwordPolicy, isLoading: isPasswordPolicyLoading } = useQuery(
queryKey: ["password-policy"], {
queryFn: fetchPasswordPolicy, queryKey: ["password-policy"],
}); queryFn: fetchPasswordPolicy,
},
);
const { const {
register, register,
@@ -978,9 +985,10 @@ function UserDetailPage() {
"msg.userfront.signup.policy.summary", "msg.userfront.signup.policy.summary",
"보안 정책: {{rules}}", "보안 정책: {{rules}}",
{ {
rules: buildPasswordPolicyDescription( rules:
passwordPolicy, buildPasswordPolicyDescription(
), passwordPolicy,
),
}, },
)} )}
</p> </p>
@@ -988,9 +996,7 @@ function UserDetailPage() {
<div className="relative flex-1"> <div className="relative flex-1">
<Input <Input
id="manualPassword" id="manualPassword"
type={ type={isManualPasswordVisible ? "text" : "password"}
isManualPasswordVisible ? "text" : "password"
}
value={manualPassword} value={manualPassword}
placeholder=" " placeholder=" "
className="peer pr-12 pt-5" className="peer pr-12 pt-5"
@@ -1005,7 +1011,10 @@ function UserDetailPage() {
htmlFor="manualPassword" htmlFor="manualPassword"
className="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 bg-background px-1 text-sm text-muted-foreground transition-all peer-placeholder-shown:top-1/2 peer-placeholder-shown:text-sm peer-focus:top-0 peer-focus:translate-y-[-50%] peer-focus:text-xs peer-[&:not(:placeholder-shown)]:top-0 peer-[&:not(:placeholder-shown)]:translate-y-[-50%] peer-[&:not(:placeholder-shown)]:text-xs" className="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 bg-background px-1 text-sm text-muted-foreground transition-all peer-placeholder-shown:top-1/2 peer-placeholder-shown:text-sm peer-focus:top-0 peer-focus:translate-y-[-50%] peer-focus:text-xs peer-[&:not(:placeholder-shown)]:top-0 peer-[&:not(:placeholder-shown)]:translate-y-[-50%] peer-[&:not(:placeholder-shown)]:text-xs"
> >
{t("ui.userfront.reset.new_password", "새 비밀번호")} {t(
"ui.userfront.reset.new_password",
"새 비밀번호",
)}
</label> </label>
<Button <Button
type="button" type="button"
@@ -1032,9 +1041,7 @@ function UserDetailPage() {
<div className="relative flex-1"> <div className="relative flex-1">
<Input <Input
id="manualPasswordConfirm" id="manualPasswordConfirm"
type={ type={isManualPasswordVisible ? "text" : "password"}
isManualPasswordVisible ? "text" : "password"
}
value={manualPasswordConfirm} value={manualPasswordConfirm}
placeholder=" " placeholder=" "
className="peer pr-12 pt-5" className="peer pr-12 pt-5"

View File

@@ -16,15 +16,15 @@ import (
) )
type KratosIdentity struct { type KratosIdentity struct {
ID string `json:"id"` ID string `json:"id"`
SchemaID string `json:"schema_id,omitempty"` SchemaID string `json:"schema_id,omitempty"`
Traits map[string]interface{} `json:"traits"` Traits map[string]interface{} `json:"traits"`
State string `json:"state,omitempty"` State string `json:"state,omitempty"`
MetadataAdmin interface{} `json:"metadata_admin,omitempty"` MetadataAdmin interface{} `json:"metadata_admin,omitempty"`
MetadataPublic interface{} `json:"metadata_public,omitempty"` MetadataPublic interface{} `json:"metadata_public,omitempty"`
ExternalID string `json:"external_id,omitempty"` ExternalID string `json:"external_id,omitempty"`
CreatedAt time.Time `json:"created_at,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"`
UpdatedAt time.Time `json:"updated_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty"`
} }
type KratosAdminService interface { type KratosAdminService interface {

View File

@@ -313,6 +313,10 @@ not_found = "Not Found"
update_error = "Failed to User Edit." update_error = "Failed to User Edit."
update_success = "Update Success" update_success = "Update Success"
password_generated = "A secure password has been generated." password_generated = "A secure password has been generated."
password_generated_help = "Generate a temporary password that meets the security policy and apply it immediately."
password_manual_required = "Please enter a password."
reset_password_help = "Force-reset the user's password and apply either an auto-generated password or a manually entered one."
self_password_reset_blocked = "Please change your own password from the UserFront settings page."
[msg.admin.users.detail.form] [msg.admin.users.detail.form]
field_required = "Required." field_required = "Required."
@@ -1155,6 +1159,11 @@ back = "Back"
edit_title = "Edit Title" edit_title = "Edit Title"
title = "User Details" title = "User Details"
generate_password = "Auto Generate" generate_password = "Auto Generate"
password_mode_generated = "Auto Generate"
password_mode_manual = "Manual Entry"
password_result_title = "Reset Password"
reset_password_apply = "Apply Password"
toggle_password_visibility = "Toggle password visibility"
[ui.admin.users.detail.breadcrumb] [ui.admin.users.detail.breadcrumb]
section = "Users" section = "Users"

View File

@@ -685,6 +685,10 @@ not_found = "사용자를 찾을 수 없습니다."
update_error = "사용자 수정에 실패했습니다." update_error = "사용자 수정에 실패했습니다."
update_success = "사용자 정보가 수정되었습니다." update_success = "사용자 정보가 수정되었습니다."
password_generated = "안전한 비밀번호가 생성되었습니다." password_generated = "안전한 비밀번호가 생성되었습니다."
password_generated_help = "보안 기준에 맞는 임시 비밀번호를 자동 생성해 즉시 적용합니다."
password_manual_required = "비밀번호를 입력해 주세요."
reset_password_help = "사용자의 비밀번호를 강제로 재설정하고 자동 생성하거나 직접 입력한 비밀번호를 적용합니다."
self_password_reset_blocked = "본인 계정의 비밀번호는 사용자 포털(UserFront) 설정에서 변경해 주세요."
[msg.admin.users.list] [msg.admin.users.list]
delete_confirm = "사용자 \"{{name}}\"을(를) 정말 삭제하시겠습니까?" delete_confirm = "사용자 \"{{name}}\"을(를) 정말 삭제하시겠습니까?"
@@ -1145,6 +1149,11 @@ back = "목록으로 돌아가기"
edit_title = "정보 수정" edit_title = "정보 수정"
title = "사용자 상세" title = "사용자 상세"
generate_password = "자동 생성" generate_password = "자동 생성"
password_mode_generated = "자동 생성"
password_mode_manual = "수동 입력"
password_result_title = "Reset Password"
reset_password_apply = "비밀번호 적용"
toggle_password_visibility = "비밀번호 표시 전환"
[ui.admin.users.list] [ui.admin.users.list]
add = "사용자 추가" add = "사용자 추가"

View File

@@ -685,6 +685,10 @@ not_found = ""
update_error = "" update_error = ""
update_success = "" update_success = ""
password_generated = "" password_generated = ""
password_generated_help = ""
password_manual_required = ""
reset_password_help = ""
self_password_reset_blocked = ""
[msg.admin.users.list] [msg.admin.users.list]
delete_confirm = "" delete_confirm = ""
@@ -1145,6 +1149,11 @@ back = ""
edit_title = "" edit_title = ""
title = "" title = ""
generate_password = "" generate_password = ""
password_mode_generated = ""
password_mode_manual = ""
password_result_title = ""
reset_password_apply = ""
toggle_password_visibility = ""
[ui.admin.users.list] [ui.admin.users.list]
add = "" add = ""

View File

@@ -382,15 +382,11 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
return; return;
} }
if ((_passwordPolicy?['number'] ?? true) && !hasNumber) { if ((_passwordPolicy?['number'] ?? true) && !hasNumber) {
setState( setState(() => _passwordError = tr('msg.userfront.reset.error.number'));
() => _passwordError = tr('msg.userfront.reset.error.number'),
);
return; return;
} }
if ((_passwordPolicy?['nonAlphanumeric'] ?? true) && !hasSymbol) { if ((_passwordPolicy?['nonAlphanumeric'] ?? true) && !hasSymbol) {
setState( setState(() => _passwordError = tr('msg.userfront.reset.error.symbol'));
() => _passwordError = tr('msg.userfront.reset.error.symbol'),
);
return; return;
} }