Hide Remember Me session settings when Remember Me is disabled in realm settings edit page in UI

Closes #44973

Signed-off-by: Ruchika <ruchika.jha1@ibm.com>
Signed-off-by: Ruchika Jha <Ruchika.Jha1@ibm.com>
Signed-off-by: Alexander Schwartz <alexander.schwartz@ibm.com>
Co-authored-by: Alexander Schwartz <alexander.schwartz@ibm.com>
This commit is contained in:
Ruchika Jha 2026-01-15 16:46:50 +00:00 committed by GitHub
parent e4bb53a743
commit e2e11a3b8e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 98 additions and 79 deletions

View file

@ -18,10 +18,10 @@ image:images/sessions-tab.png[Sessions Tab]
|The maximum time before a user session expires.
|SSO Session Idle Remember Me
|This setting is similar to the standard SSO Session Idle configuration but specific to logins with *Remember Me* enabled. Users can specify longer session idle timeouts when they click *Remember Me* when logging in. This setting is an optional configuration and, if its value is not greater than zero, it uses the same idle timeout as the SSO Session Idle configuration.
|This setting is only available when *Remember me* is enabled and is similar to the standard SSO Session Idle configuration. Users can specify longer session idle timeouts when they click *Remember Me* when logging in. This setting is an optional configuration and, if its value is not greater than zero, it uses the same idle timeout as the SSO Session Idle configuration.
|SSO Session Max Remember Me
|This setting is similar to the standard SSO Session Max but specific to *Remember Me* logins. Users can specify longer sessions when they click *Remember Me* when logging in. This setting is an optional configuration and, if its value is not greater than zero, it uses the same session lifespan as the SSO Session Max configuration.
|This setting is only available when *Remember me* is enabled and is similar to the standard SSO Session Max. Users can specify longer sessions when they click *Remember Me* when logging in. This setting is an optional configuration and, if its value is not greater than zero, it uses the same session lifespan as the SSO Session Max configuration.
|Client Session Idle
|Idle timeout for the client session. If the user is inactive for longer than this timeout, the client session is invalidated and the refresh token requests bump the idle timeout. This setting never affects the general SSO user session, which is unique. Note the SSO user session is the parent of zero or more client sessions, one client session is created for every different client app the user logs in. This value should specify a shorter idle timeout than the *SSO Session Idle*. Users can override it for individual clients in the *Advanced Settings* client tab. This setting is an optional configuration and, when set to zero, uses the same idle timeout in the SSO Session Idle configuration.

View file

@ -94,56 +94,59 @@ export const RealmSettingsSessionsTab = ({
)}
/>
</FormGroup>
<FormGroup
label={t("SSOSessionIdleRememberMe")}
fieldId="SSOSessionIdleRememberMe"
labelIcon={
<HelpItem
helpText={t("ssoSessionIdleRememberMe")}
fieldLabelId="SSOSessionIdleRememberMe"
/>
}
>
<Controller
name="ssoSessionIdleTimeoutRememberMe"
control={control}
render={({ field }) => (
<TimeSelector
className="kc-sso-session-idle-remember-me"
data-testid="sso-session-idle-remember-me-input"
value={field.value!}
onChange={field.onChange}
units={["minute", "hour", "day"]}
{realm.rememberMe && (
<>
<FormGroup
label={t("SSOSessionIdleRememberMe")}
fieldId="SSOSessionIdleRememberMe"
labelIcon={
<HelpItem
helpText={t("ssoSessionIdleRememberMe")}
fieldLabelId="SSOSessionIdleRememberMe"
/>
}
>
<Controller
name="ssoSessionIdleTimeoutRememberMe"
control={control}
render={({ field }) => (
<TimeSelector
className="kc-sso-session-idle-remember-me"
data-testid="sso-session-idle-remember-me-input"
value={field.value!}
onChange={field.onChange}
units={["minute", "hour", "day"]}
/>
)}
/>
)}
/>
</FormGroup>
</FormGroup>
<FormGroup
label={t("SSOSessionMaxRememberMe")}
fieldId="SSOSessionMaxRememberMe"
labelIcon={
<HelpItem
helpText={t("ssoSessionMaxRememberMe")}
fieldLabelId="SSOSessionMaxRememberMe"
/>
}
>
<Controller
name="ssoSessionMaxLifespanRememberMe"
control={control}
render={({ field }) => (
<TimeSelector
className="kc-sso-session-max-remember-me"
data-testid="sso-session-max-remember-me-input"
value={field.value!}
onChange={field.onChange}
units={["minute", "hour", "day"]}
<FormGroup
label={t("SSOSessionMaxRememberMe")}
fieldId="SSOSessionMaxRememberMe"
labelIcon={
<HelpItem
helpText={t("ssoSessionMaxRememberMe")}
fieldLabelId="SSOSessionMaxRememberMe"
/>
}
>
<Controller
name="ssoSessionMaxLifespanRememberMe"
control={control}
render={({ field }) => (
<TimeSelector
className="kc-sso-session-max-remember-me"
data-testid="sso-session-max-remember-me-input"
value={field.value!}
onChange={field.onChange}
units={["minute", "hour", "day"]}
/>
)}
/>
)}
/>
</FormGroup>
</FormGroup>
</>
)}
</FormAccess>
</FormPanel>
<FormPanel

View file

@ -1,4 +1,4 @@
import { test } from "@playwright/test";
import { expect, test } from "@playwright/test";
import { v4 as uuid } from "uuid";
import adminClient from "../utils/AdminClient.ts";
import { login } from "../utils/login.ts";
@ -11,7 +11,8 @@ import {
assertSsoSessionMaxRememberMe,
clickSaveSessionsButton,
goToSessionsTab,
populateSessionsPage,
populateSessionsPageRememberMeDisabled,
populateSessionsPageRememberMeEnabled,
} from "./sessions.ts";
test.describe.serial("Sessions", () => {
@ -24,15 +25,36 @@ test.describe.serial("Sessions", () => {
await login(page);
await goToRealm(page, realmName);
await goToRealmSettings(page);
await goToSessionsTab(page);
});
test("Add session data", async ({ page }) => {
await populateSessionsPage(page);
test("Add session data when Remember Me is disabled", async ({ page }) => {
//Disable Remember Me and save realm
await page.getByTestId("rs-login-tab").click();
await page.getByLabel("Remember Me").uncheck();
await goToSessionsTab(page);
// verify remember me fields are not visible
await expect(
page.getByTestId("sso-session-idle-remember-me-input"),
).toHaveCount(0);
await expect(
page.getByTestId("sso-session-max-remember-me-input"),
).toHaveCount(0);
await populateSessionsPageRememberMeDisabled(page);
await clickSaveSessionsButton(page);
await assertNotificationMessage(page, "Realm successfully updated");
await assertSsoSessionIdleInput(page, "1");
await assertSsoSessionIdleInput(page, "5");
await assertSsoSessionMaxInput(page, "2");
});
test("Add session data when Remember Me is enabled", async ({ page }) => {
//Enable Remember Me and save realm
await page.getByTestId("rs-login-tab").click();
const rememberMeSwitch = page.locator('[for="kc-remember-me-switch"]');
await rememberMeSwitch.click();
await goToSessionsTab(page);
await populateSessionsPageRememberMeEnabled(page);
await clickSaveSessionsButton(page);
await assertNotificationMessage(page, "Realm successfully updated");
await assertSsoSessionIdleInput(page, "5");
await assertSsoSessionMaxInput(page, "2");
await assertSsoSessionIdleRememberMe(page, "3");
await assertSsoSessionMaxRememberMe(page, "4");

View file

@ -1,5 +1,5 @@
import { type Page, expect } from "@playwright/test";
import { changeTimeUnit, switchOn } from "../utils/form.ts";
import { expect, type Page } from "@playwright/test";
import { changeTimeUnit } from "../utils/form.ts";
export async function goToSessionsTab(page: Page) {
await page.getByTestId("rs-sessions-tab").click();
@ -21,41 +21,35 @@ function getSsoSessionMaxRememberMe(page: Page) {
return page.getByTestId("sso-session-max-remember-me-input");
}
export async function populateSessionsPage(page: Page) {
await getSsoSessionIdleInput(page).fill("1");
await changeTimeUnit(page, "Minutes", "#kc-sso-session-idle-select-menu");
export async function populateSessionsPageRememberMeDisabled(page: Page) {
await page.getByTestId("sso-session-idle-input").fill("5");
await changeTimeUnit(page, "Hours", "#kc-sso-session-idle-select-menu");
await getSsoSessionMaxInput(page).fill("2");
await page.getByTestId("sso-session-max-input").fill("2");
await changeTimeUnit(page, "Hours", "#kc-sso-session-max-select-menu");
await getSsoSessionIdleRememberMe(page).fill("3");
await page.getByTestId("client-session-idle-input").fill("4");
await changeTimeUnit(page, "Hours", "#kc-client-session-idle-select-menu");
await page.getByTestId("client-session-max-input").fill("1");
await changeTimeUnit(page, "Hours", "#kc-client-session-max-select-menu");
}
export async function populateSessionsPageRememberMeEnabled(page: Page) {
await populateSessionsPageRememberMeDisabled(page);
await page.getByTestId("sso-session-idle-remember-me-input").fill("3");
await changeTimeUnit(
page,
"Days",
"#kc-sso-session-idle-remember-me-select-menu",
);
await getSsoSessionMaxRememberMe(page).fill("4");
await page.getByTestId("sso-session-max-remember-me-input").fill("4");
await changeTimeUnit(
page,
"Minutes",
"#kc-sso-session-max-remember-me-select-menu",
);
await page.getByTestId("client-session-idle-input").fill("1");
await changeTimeUnit(page, "Minutes", "#kc-client-session-idle-select-menu");
await page.getByTestId("client-session-max-input").fill("2");
await changeTimeUnit(page, "Hours", "#kc-client-session-max-select-menu");
await page.getByTestId("offline-session-idle-input").fill("7");
await switchOn(page, "#kc-offline-session-max");
await page.getByTestId("login-timeout-input").fill("9");
await changeTimeUnit(page, "Minutes", "#kc-login-timeout-select-menu");
await page.getByTestId("login-action-timeout-input").fill("10");
await changeTimeUnit(page, "Days", "#kc-login-action-timeout-select-menu");
}
export async function clickSaveSessionsButton(page: Page) {