added brute login user temporary lock indication (#259)
* added brute login user temporary lock indication * spelling
This commit is contained in:
parent
79e671062c
commit
0a5efbb781
4 changed files with 40 additions and 10 deletions
|
@ -22,7 +22,7 @@
|
||||||
"@patternfly/react-table": "4.19.24",
|
"@patternfly/react-table": "4.19.24",
|
||||||
"file-saver": "^2.0.2",
|
"file-saver": "^2.0.2",
|
||||||
"i18next": "^19.6.2",
|
"i18next": "^19.6.2",
|
||||||
"keycloak-admin": "1.14.2",
|
"keycloak-admin": "1.14.4",
|
||||||
"lodash": "^4.17.20",
|
"lodash": "^4.17.20",
|
||||||
"moment": "^2.29.1",
|
"moment": "^2.29.1",
|
||||||
"react": "^16.8.5",
|
"react": "^16.8.5",
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import React, { useState } from "react";
|
import React, { useContext, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import {
|
import {
|
||||||
AlertVariant,
|
AlertVariant,
|
||||||
|
@ -8,18 +8,25 @@ import {
|
||||||
PageSection,
|
PageSection,
|
||||||
ToolbarItem,
|
ToolbarItem,
|
||||||
} from "@patternfly/react-core";
|
} from "@patternfly/react-core";
|
||||||
import { InfoCircleIcon } from "@patternfly/react-icons";
|
import { InfoCircleIcon, WarningTriangleIcon } from "@patternfly/react-icons";
|
||||||
import UserRepresentation from "keycloak-admin/lib/defs/userRepresentation";
|
import UserRepresentation from "keycloak-admin/lib/defs/userRepresentation";
|
||||||
|
|
||||||
import { useAdminClient } from "../context/auth/AdminClient";
|
import { useAdminClient } from "../context/auth/AdminClient";
|
||||||
import { ViewHeader } from "../components/view-header/ViewHeader";
|
import { ViewHeader } from "../components/view-header/ViewHeader";
|
||||||
import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable";
|
import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable";
|
||||||
import { useAlerts } from "../components/alert/Alerts";
|
import { useAlerts } from "../components/alert/Alerts";
|
||||||
|
import { RealmContext } from "../context/realm-context/RealmContext";
|
||||||
|
|
||||||
|
type BruteUser = UserRepresentation & {
|
||||||
|
brute?: Record<string, object>;
|
||||||
|
};
|
||||||
|
|
||||||
export const UsersSection = () => {
|
export const UsersSection = () => {
|
||||||
const { t } = useTranslation("users");
|
const { t } = useTranslation("users");
|
||||||
const adminClient = useAdminClient();
|
const adminClient = useAdminClient();
|
||||||
const { addAlert } = useAlerts();
|
const { addAlert } = useAlerts();
|
||||||
|
const { realm: realmName } = useContext(RealmContext);
|
||||||
|
|
||||||
const [key, setKey] = useState("");
|
const [key, setKey] = useState("");
|
||||||
const refresh = () => setKey(`${new Date().getTime()}`);
|
const refresh = () => setKey(`${new Date().getTime()}`);
|
||||||
|
|
||||||
|
@ -31,7 +38,24 @@ export const UsersSection = () => {
|
||||||
if (search) {
|
if (search) {
|
||||||
params.search = search;
|
params.search = search;
|
||||||
}
|
}
|
||||||
return await adminClient.users.find({ ...params });
|
|
||||||
|
const users = await adminClient.users.find({ ...params });
|
||||||
|
const realm = await adminClient.realms.findOne({ realm: realmName });
|
||||||
|
if (realm?.bruteForceProtected) {
|
||||||
|
const brutes = await Promise.all(
|
||||||
|
users.map((user: BruteUser) =>
|
||||||
|
adminClient.attackDetection.findOne({
|
||||||
|
id: user.id!,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
for (let index = 0; index < users.length; index++) {
|
||||||
|
const user: BruteUser = users[index];
|
||||||
|
user.brute = brutes[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return users;
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteUser = async (user: UserRepresentation) => {
|
const deleteUser = async (user: UserRepresentation) => {
|
||||||
|
@ -44,14 +68,19 @@ export const UsersSection = () => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const StatusRow = (user: UserRepresentation) => {
|
const StatusRow = (user: BruteUser) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{!user.enabled && (
|
{!user.enabled && (
|
||||||
<Label color="red" icon={<InfoCircleIcon />}>
|
<Label key={user.id} color="red" icon={<InfoCircleIcon />}>
|
||||||
{t("disabled")}
|
{t("disabled")}
|
||||||
</Label>
|
</Label>
|
||||||
)}
|
)}
|
||||||
|
{user.brute?.disabled && (
|
||||||
|
<Label key={user.id} color="orange" icon={<WarningTriangleIcon />}>
|
||||||
|
{t("temporaryDisabled")}
|
||||||
|
</Label>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
"firstName": "First name",
|
"firstName": "First name",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"disabled": "Disabled",
|
"disabled": "Disabled",
|
||||||
|
"temporaryDisabled": "Temporarily disabled",
|
||||||
"addUser": "Add user",
|
"addUser": "Add user",
|
||||||
"deleteUser": "Delete user",
|
"deleteUser": "Delete user",
|
||||||
"userDeletedSuccess": "The user has been deleted",
|
"userDeletedSuccess": "The user has been deleted",
|
||||||
|
|
|
@ -13207,10 +13207,10 @@ junk@^3.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
|
resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
|
||||||
integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==
|
integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==
|
||||||
|
|
||||||
keycloak-admin@1.14.2:
|
keycloak-admin@1.14.4:
|
||||||
version "1.14.2"
|
version "1.14.4"
|
||||||
resolved "https://registry.yarnpkg.com/keycloak-admin/-/keycloak-admin-1.14.2.tgz#5b983a10bcc01573c79d4f3d6eefe74bd35c8d3f"
|
resolved "https://registry.yarnpkg.com/keycloak-admin/-/keycloak-admin-1.14.4.tgz#67f9a0991e88003f23a3c6a9d87c7a11294afd12"
|
||||||
integrity sha512-eO0jLEVQJ+yk2Xw6B73dDQWhHwR5CjGsdx3zu1csJTTehCy0ftLJVX/BFnlGmQnF1sVYKpXomoCbUtesYYXntQ==
|
integrity sha512-16/ctPH/Pz+XLL62tQp1d2XziMaPtxjthrfXcr+wfeJYMGH09QQTd1EDJjdFskuhZOhmYlifaAYPanQLwbUFEg==
|
||||||
dependencies:
|
dependencies:
|
||||||
axios "^0.21.0"
|
axios "^0.21.0"
|
||||||
camelize "^1.0.0"
|
camelize "^1.0.0"
|
||||||
|
|
Loading…
Reference in a new issue