From 1fc9a40273f23ecadfc3637044840c3d1f8bc586 Mon Sep 17 00:00:00 2001 From: Alex <33497058+bexsoft@users.noreply.github.com> Date: Tue, 7 Mar 2023 16:10:21 -0600 Subject: [PATCH] Changed IDP login support in console (#2695) - Allowed to use External IDP + Built-in IDP at the same time - Added IDP type to IDP listing - Added IDP name when no display name is configured - Changed STS login link into new menu - Cleanup of Operator login strategies Signed-off-by: Benjamin Perez --- models/redirect_rule.go | 3 + portal-ui/src/screens/LoginPage/LoginPage.tsx | 177 +----------------- .../src/screens/LoginPage/StrategyForm.tsx | 116 ++++++++---- portal-ui/src/screens/LoginPage/loginSlice.ts | 7 - .../src/screens/LoginPage/loginThunks.ts | 78 ++------ portal-ui/src/screens/LoginPage/types.ts | 5 + restapi/embedded_spec.go | 6 + restapi/user_login.go | 14 +- swagger.yml | 2 + 9 files changed, 129 insertions(+), 279 deletions(-) diff --git a/models/redirect_rule.go b/models/redirect_rule.go index 41fe02642..efcd553e8 100644 --- a/models/redirect_rule.go +++ b/models/redirect_rule.go @@ -39,6 +39,9 @@ type RedirectRule struct { // redirect Redirect string `json:"redirect,omitempty"` + + // service type + ServiceType string `json:"serviceType,omitempty"` } // Validate validates this redirect rule diff --git a/portal-ui/src/screens/LoginPage/LoginPage.tsx b/portal-ui/src/screens/LoginPage/LoginPage.tsx index ca59627d6..6dfe4e1b5 100644 --- a/portal-ui/src/screens/LoginPage/LoginPage.tsx +++ b/portal-ui/src/screens/LoginPage/LoginPage.tsx @@ -16,38 +16,18 @@ import React, { Fragment, useEffect } from "react"; import { useNavigate } from "react-router-dom"; -import { - InputAdornment, - LinearProgress, - MenuItem, - Select, -} from "@mui/material"; -import { - Button, - Loader, - LockIcon, - LoginWrapper, - LogoutIcon, - RefreshIcon, -} from "mds"; +import { Button, Loader, LoginWrapper, RefreshIcon } from "mds"; import { Theme } from "@mui/material/styles"; import createStyles from "@mui/styles/createStyles"; import makeStyles from "@mui/styles/makeStyles"; -import Grid from "@mui/material/Grid"; import { loginStrategyType, redirectRule } from "./types"; import MainError from "../Console/Common/MainError/MainError"; import { spacingUtils } from "../Console/Common/FormComponents/common/styleLibrary"; -import clsx from "clsx"; import { AppState, useAppDispatch } from "../../store"; import { useSelector } from "react-redux"; -import { - doLoginAsync, - getFetchConfigurationAsync, - getVersionAsync, -} from "./loginThunks"; -import { resetForm, setJwt } from "./loginSlice"; +import { getFetchConfigurationAsync, getVersionAsync } from "./loginThunks"; +import { resetForm } from "./loginSlice"; import StrategyForm from "./StrategyForm"; -import { LoginField } from "./LoginField"; import { redirectRules } from "../../utils/sortFunctions"; import { getLogoVar } from "../../config"; @@ -250,19 +230,12 @@ const useStyles = makeStyles((theme: Theme) => }) ); -export interface LoginStrategyRoutes { - [key: string]: string; -} - export interface LoginStrategyPayload { - [key: string]: any; + accessKey: string; + secretKey: string; + sts?: string; } -export const loginStrategyEndpoints: LoginStrategyRoutes = { - form: "/api/v1/login", - "service-account": "/api/v1/login/operator", -}; - export const getTargetPath = () => { let targetPath = "/"; if ( @@ -280,13 +253,9 @@ const Login = () => { const navigate = useNavigate(); const classes = useStyles(); - const jwt = useSelector((state: AppState) => state.login.jwt); const loginStrategy = useSelector( (state: AppState) => state.login.loginStrategy ); - const loginSending = useSelector( - (state: AppState) => state.login.loginSending - ); const loadingFetchConfiguration = useSelector( (state: AppState) => state.login.loadingFetchConfiguration ); @@ -295,13 +264,8 @@ const Login = () => { ); const navigateTo = useSelector((state: AppState) => state.login.navigateTo); - const isDirectPV = useSelector((state: AppState) => state.login.isDirectPV); const isK8S = useSelector((state: AppState) => state.login.isK8S); - const isOperator = - loginStrategy.loginStrategy === loginStrategyType.serviceAccount || - loginStrategy.loginStrategy === loginStrategyType.redirectServiceAccount; - useEffect(() => { if (navigateTo !== "") { dispatch(resetForm()); @@ -309,11 +273,6 @@ const Login = () => { } }, [navigateTo, dispatch, navigate]); - const formSubmit = (e: React.FormEvent) => { - e.preventDefault(); - dispatch(doLoginAsync()); - }; - useEffect(() => { if (loadingFetchConfiguration) { dispatch(getFetchConfigurationAsync()); @@ -329,12 +288,8 @@ const Login = () => { let loginComponent; switch (loginStrategy.loginStrategy) { - case loginStrategyType.form: { - loginComponent = ; - break; - } case loginStrategyType.redirect: - case loginStrategyType.redirectServiceAccount: { + case loginStrategyType.form: { let redirectItems: redirectRule[] = []; if ( @@ -344,111 +299,7 @@ const Login = () => { redirectItems = [...loginStrategy.redirectRules].sort(redirectRules); } - if ( - loginStrategy.redirectRules && - loginStrategy.redirectRules.length > 1 - ) { - loginComponent = ( - -
Login with SSO:
- -
- ); - } else if (redirectItems.length === 1) { - loginComponent = ( -
-
- ); - } else { - loginComponent = ( -
- Cannot retrieve redirect from login strategy -
- ); - } - break; - } - case loginStrategyType.serviceAccount: { - loginComponent = ( - -
- - - ) => - dispatch(setJwt(e.target.value)) - } - name="jwt" - autoComplete="off" - disabled={loginSending} - placeholder={"Enter JWT"} - variant={"outlined"} - InputProps={{ - startAdornment: ( - - - - ), - }} - /> - - - -