From 4a2cc019939a8ac57e80222e8656d6ec8a057320 Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Fri, 11 Oct 2024 18:04:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=93?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 33 ++ .mvn/wrapper/maven-wrapper.properties | 19 + lib/cas-client-core-3.1.12.jar | Bin 0 -> 86227 bytes lib/sso-client-java-7.0.8.jar | Bin 0 -> 71542 bytes mvnw | 259 +++++++++++ mvnw.cmd | 149 ++++++ pom.xml | 92 ++++ .../dev/flyfish/boot/cas/CasApplication.java | 13 + .../flyfish/boot/cas/filter/CASFilter.java | 426 ++++++++++++++++++ .../flyfish/boot/cas/filter/CASParameter.java | 77 ++++ .../cas/filter/SessionMappingStorage.java | 65 +++ src/main/resources/application.properties | 1 + .../flyfish/boot/cas/CasApplicationTests.java | 13 + 13 files changed, 1147 insertions(+) create mode 100644 .gitignore create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 lib/cas-client-core-3.1.12.jar create mode 100644 lib/sso-client-java-7.0.8.jar create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/dev/flyfish/boot/cas/CasApplication.java create mode 100644 src/main/java/dev/flyfish/boot/cas/filter/CASFilter.java create mode 100644 src/main/java/dev/flyfish/boot/cas/filter/CASParameter.java create mode 100644 src/main/java/dev/flyfish/boot/cas/filter/SessionMappingStorage.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/dev/flyfish/boot/cas/CasApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..d58dfb7 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/lib/cas-client-core-3.1.12.jar b/lib/cas-client-core-3.1.12.jar new file mode 100644 index 0000000000000000000000000000000000000000..ab0d4edc281eec99808cf4d067ee83980c072337 GIT binary patch literal 86227 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%0D7qc3!KwK*3de{TSm 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 ijrjeVW|kOr_g!A<5okqoH@)Nsn*q&VLmxZ&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5b0aae6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,92 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.4 + + + dev.flyfish.boot + cas + 0.0.1-SNAPSHOT + cas + cas + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter-webflux + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + io.projectreactor + reactor-test + test + + + org.jasig.cas + cas-client-core + 3.1.12 + system + ${project.basedir}/lib/cas-client-core-3.1.12.jar + + + edu.yale.its + cas-client-java + 7.0.8 + system + ${project.basedir}/lib/sso-client-java-7.0.8.jar + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/dev/flyfish/boot/cas/CasApplication.java b/src/main/java/dev/flyfish/boot/cas/CasApplication.java new file mode 100644 index 0000000..051f9c4 --- /dev/null +++ b/src/main/java/dev/flyfish/boot/cas/CasApplication.java @@ -0,0 +1,13 @@ +package dev.flyfish.boot.cas; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CasApplication { + + public static void main(String[] args) { + SpringApplication.run(CasApplication.class, args); + } + +} diff --git a/src/main/java/dev/flyfish/boot/cas/filter/CASFilter.java b/src/main/java/dev/flyfish/boot/cas/filter/CASFilter.java new file mode 100644 index 0000000..4583589 --- /dev/null +++ b/src/main/java/dev/flyfish/boot/cas/filter/CASFilter.java @@ -0,0 +1,426 @@ +package dev.flyfish.boot.cas.filter; + +import edu.yale.its.tp.cas.client.*; +import edu.yale.its.tp.cas.util.XmlUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.codec.HttpMessageReader; +import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.lang.NonNull; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import org.springframework.web.server.WebSession; +import reactor.core.publisher.Mono; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URLEncoder; +import java.util.List; +import java.util.Objects; + +/** + * cas filter的webflux实现 + * + * @author wangyu + * 实现相关核心逻辑,完成鉴权信息抽取 + */ +public class CASFilter implements WebFilter { + + private static final Log log = LogFactory.getLog(CASFilter.class); + + public static final String LOGIN_INIT_PARAM = "edu.yale.its.tp.cas.client.filter.loginUrl"; + public static final String VALIDATE_INIT_PARAM = "edu.yale.its.tp.cas.client.filter.validateUrl"; + public static final String SERVICE_INIT_PARAM = "edu.yale.its.tp.cas.client.filter.serviceUrl"; + public static final String SERVERNAME_INIT_PARAM = "edu.yale.its.tp.cas.client.filter.serverName"; + public static final String RENEW_INIT_PARAM = "edu.yale.its.tp.cas.client.filter.renew"; + public static final String AUTHORIZED_PROXY_INIT_PARAM = "edu.yale.its.tp.cas.client.filter.authorizedProxy"; + public static final String PROXY_CALLBACK_INIT_PARAM = "edu.yale.its.tp.cas.client.filter.proxyCallbackUrl"; + public static final String WRAP_REQUESTS_INIT_PARAM = "edu.yale.its.tp.cas.client.filter.wrapRequest"; + public static final String GATEWAY_INIT_PARAM = "edu.yale.its.tp.cas.client.filter.gateway"; + public static final String CAS_FILTER_USER = "edu.yale.its.tp.cas.client.filter.user"; + public static final String CAS_FILTER_RECEIPT = "edu.yale.its.tp.cas.client.filter.receipt"; + + static final String CAS_FILTER_GATEWAYED = "edu.yale.its.tp.cas.client.filter.didGateway"; + static final String CAS_FILTER_INITCONTEXTCLASS = "edu.yale.its.tp.cas.client.filter.initContextClass"; + static final String CAS_FILTER_USERLOGINMARK = "edu.yale.its.tp.cas.client.filter.userLoginMark"; + static final String CAS_FILTER_EXCLUSION = "edu.yale.its.tp.cas.client.filter.filterExclusion"; + + private final CASParameter parameter; + + private static SessionMappingStorage SESSION_MAPPING_STORAGE = new HashMapBackedSessionMappingStorage(); + + private List> messageReaders; + + public CASFilter(CASParameter parameter, ServerCodecConfigurer codecConfigurer) { + parameter.check(); + this.parameter = parameter; + this.messageReaders = codecConfigurer.getReaders(); + } + + private boolean isReceiptAcceptable(CASReceipt receipt) { + if (receipt == null) { + throw new IllegalArgumentException("Cannot evaluate a null receipt."); + } else if (parameter.casRenew && !receipt.isPrimaryAuthentication()) { + return false; + } else { + return !receipt.isProxied() || parameter.authorizedProxies.contains(receipt.getProxyingService()); + } + } + + private CASReceipt getAuthenticatedUser(ServerWebExchange exchange, String ticket) throws CASAuthenticationException { + log.trace("entering getAuthenticatedUser()"); + ProxyTicketValidator pv = new ProxyTicketValidator(); + pv.setCasValidateUrl(parameter.casValidate); + pv.setServiceTicket(ticket); + pv.setService(this.getService(exchange.getRequest())); + pv.setRenew(parameter.casRenew); + if (parameter.casProxyCallbackUrl != null) { + pv.setProxyCallbackUrl(parameter.casProxyCallbackUrl); + } + + if (log.isDebugEnabled()) { + log.debug("about to validate ProxyTicketValidator: [" + pv + "]"); + } + + return CASReceipt.getReceipt(pv); + } + + private String getService(ServerHttpRequest request) throws ServletException { + log.trace("entering getService()"); + if (this.casServerName == null && this.casServiceUrl == null) { + throw new ServletException("need one of the following configuration parameters: edu.yale.its.tp.cas.client.filter.serviceUrl or edu.yale.its.tp.cas.client.filter.serverName"); + } else { + String serviceString; + if (this.casServiceUrl != null) { + serviceString = URLEncoder.encode(this.casServiceUrl); + } else { + serviceString = Util.getService(request, this.casServerName); + } + + if (log.isTraceEnabled()) { + log.trace("returning from getService() with service [" + serviceString + "]"); + } + + return serviceString; + } + } + + private void redirectToCAS(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + if (log.isTraceEnabled()) { + log.trace("entering redirectToCAS()"); + } + + String casLoginString = this.casLogin + "?service=" + this.getService(request) + (this.casRenew ? "&renew=true" : "") + (this.casGateway ? "&gateway=true" : ""); + String sCookie; + if (request.getAttribute("sessionId") != null) { + sCookie = this.casServerName + request.getContextPath(); + casLoginString = casLoginString + "&appId=" + sCookie + "&sessionId=" + request.getAttribute("sessionId"); + } + + sCookie = request.getHeader("Cookie"); + String cookie = null; + if (sCookie != null) { + String[] sCookies = sCookie.split(";"); + + for (int i = 0; i < sCookies.length; ++i) { + if (sCookies[i].indexOf("JSESSIONID=") != -1) { + cookie = sCookies[i].split("JSESSIONID=")[1]; + } + } + } + + if (cookie != null && !cookie.equals("null") && !cookie.equals(request.getSession().getId())) { + casLoginString = casLoginString + "&timeOut=" + cookie; + if (log.isDebugEnabled()) { + log.debug("Session is timeout. The timeout session is " + cookie); + } + } + + if (log.isDebugEnabled()) { + log.debug("Redirecting browser to [" + casLoginString + ")"); + } + + response.sendRedirect(casLoginString); + if (log.isTraceEnabled()) { + log.trace("returning from redirectToCAS()"); + } + + } + + private void redirectToInitFailure(HttpServletRequest request, HttpServletResponse response, String cause) throws IOException, ServletException { + if (log.isTraceEnabled()) { + log.trace("entering redirectToInitFailure()"); + } + + String casLoginString = this.casLogin + "?action=initFailure"; + if (cause != null && cause.equals("Illegal user")) { + casLoginString = casLoginString + "&userIllegal=true"; + } + + String locale = request.getParameter("locale"); + if (locale != null) { + casLoginString = casLoginString + "&locale=" + locale; + } + + if (log.isDebugEnabled()) { + log.debug("Redirecting browser to [" + casLoginString + ")"); + } + + response.sendRedirect(casLoginString); + if (log.isTraceEnabled()) { + log.trace("returning from redirectToInitFailure()"); + } + + } + + public static SessionMappingStorage getSessionMappingStorage() { + return SESSION_MAPPING_STORAGE; + } + + private boolean isExclusion(ServerHttpRequest request) { + if (parameter.exclusions == null) { + return false; + } else { + String url = request.getPath().value(); + return parameter.exclusions.contains(url); + } + } + + private Mono translate(ServerWebExchange exchange, WebFilterChain chain, WebSession session) { + ServerHttpRequest request = exchange.getRequest(); + MultiValueMap params = request.getQueryParams(); + String userName; + String artifact; + + if (parameter.casProxyCallbackUrl != null && parameter.casProxyCallbackUrl.endsWith(request.getPath().value()) + && params.getFirst("pgtId") != null && params.getFirst("pgtIou") != null) { + log.trace("passing through what we hope is CAS's request for proxy ticket receptor."); + return chain.filter(exchange); + } else { + if (parameter.wrapRequest) { + log.trace("Wrapping request with CASFilterRequestWrapper."); + // todo 暂时啥也不干,看看有无问题 +// request = new CASFilterRequestWrapper((HttpServletRequest) request); + } + + // 使用了用户标记,快速跳过 + if (parameter.userLoginMark != null && session.getAttribute(parameter.userLoginMark) != null) { + return chain.filter(exchange); + } + + // 获取receipt + CASReceipt receipt = session.getAttribute(CAS_FILTER_RECEIPT); + if (receipt != null && this.isReceiptAcceptable(receipt)) { + log.trace("CAS_FILTER_RECEIPT attribute was present and acceptable - passing request through filter.."); + return chain.filter(exchange); + } + // 跳过请求 + if (this.isExclusion(request)) { + return chain.filter(exchange); + } + + return getParameter(exchange, "ticket") + .flatMap(ticket -> { + if (StringUtils.hasText(ticket)) { + try { + receipt = this.getAuthenticatedUser(exchange, ticket); + } catch (CASAuthenticationException var22) { + ((HttpServletRequest) request).setAttribute("sessionId", session.getId()); + this.redirectToCAS((HttpServletRequest) request, (HttpServletResponse) response); + return; + } + + if (!this.isReceiptAcceptable(receipt)) { + throw new ServletException("Authentication was technically successful but rejected as a matter of policy. [" + receipt + "]"); + } else { + if (pt != null && pt != "") { + session.setAttribute(pt, receipt); + } + + if (session != null) { + userName = receipt.getUserName(); + if (this.casInitContextClass != null && !"".equals(this.casInitContextClass)) { + try { + Class cls = Class.forName(this.casInitContextClass); + Object obj = cls.newInstance(); + if (obj instanceof IContextInit) { + Method translatorMethod = cls.getMethod("getTranslatorUser", String.class); + userName = (String) translatorMethod.invoke(obj, userName); + Method initContextMethod = cls.getMethod("initContext", ServletRequest.class, ServletResponse.class, FilterChain.class, String.class); + initContextMethod.invoke(obj, request, response, fc, userName); + } + } catch (ClassNotFoundException var15) { + ClassNotFoundException e = var15; + e.printStackTrace(); + } catch (InstantiationException var16) { + InstantiationException e = var16; + e.printStackTrace(); + } catch (IllegalAccessException var17) { + IllegalAccessException e = var17; + e.printStackTrace(); + } catch (IllegalArgumentException var18) { + IllegalArgumentException e = var18; + e.printStackTrace(); + } catch (InvocationTargetException var19) { + InvocationTargetException e = var19; + String cause = e.getCause().getMessage(); + session.setAttribute("initFailure", cause); + this.redirectToInitFailure((HttpServletRequest) request, (HttpServletResponse) response, cause); + e.printStackTrace(); + return; + } catch (SecurityException var20) { + SecurityException e = var20; + e.printStackTrace(); + } catch (NoSuchMethodException var21) { + NoSuchMethodException e = var21; + e.printStackTrace(); + } + } + + session.setAttribute("edu.yale.its.tp.cas.client.filter.user", userName); + session.setAttribute("edu.yale.its.tp.cas.client.filter.receipt", receipt); + session.removeAttribute("edu.yale.its.tp.cas.client.filter.didGateway"); + } + + if (log.isTraceEnabled()) { + log.trace("validated ticket to get authenticated receipt [" + receipt + "], now passing request along filter chain."); + } + + fc.doFilter((ServletRequest) request, response); + log.trace("returning from doFilter()"); + } + } else { + log.trace("CAS ticket was not present on request."); + boolean didGateway = Boolean.valueOf((String) session.getAttribute("edu.yale.its.tp.cas.client.filter.didGateway")); + if (this.casLogin == null) { + log.fatal("casLogin was not set, so filter cannot redirect request for authentication."); + throw new ServletException("When CASFilter protects pages that do not receive a 'ticket' parameter, it needs a edu.yale.its.tp.cas.client.filter.loginUrl filter parameter"); + } else if (!didGateway) { + log.trace("Did not previously gateway. Setting session attribute to true."); + ((HttpServletRequest) request).setAttribute("sessionId", session.getId()); + session.setAttribute("edu.yale.its.tp.cas.client.filter.didGateway", "true"); + this.redirectToCAS((HttpServletRequest) request, (HttpServletResponse) response); + } else { + log.trace("Previously gatewayed."); + if (!this.casGateway && session.getAttribute("edu.yale.its.tp.cas.client.filter.user") == null) { + if (session.getAttribute("initFailure") != null) { + String cause = (String) session.getAttribute("initFailure"); + this.redirectToInitFailure((HttpServletRequest) request, (HttpServletResponse) response, cause); + } else { + ((HttpServletRequest) request).setAttribute("sessionId", session.getId()); + session.setAttribute("edu.yale.its.tp.cas.client.filter.didGateway", "true"); + this.redirectToCAS((HttpServletRequest) request, (HttpServletResponse) response); + } + + } else { + log.trace("casGateway was true and CAS_FILTER_USER set: passing request along filter chain."); + fc.doFilter((ServletRequest) request, response); + } + } + } + }) + + } + } + + /** + * 二阶段处理,预处理特殊情况,提前中断请求 + * + * @param exchange 交换信息 + * @param chain 过滤器链 + * @param session 会话 + * @return 结果 + */ + private Mono handle(ServerWebExchange exchange, WebFilterChain chain, @NonNull WebSession session) { + // 下一步处理信号,提前生成 + Mono translate = this.translate(exchange, chain, session); + + // post请求需要特殊处理 + if (exchange.getRequest().getMethod() == HttpMethod.POST) { + // 此处可能要求安全的获取参数(单独针对退出请求) + return exchange.getFormData() + .flatMap(formData -> { + String payload = formData.getFirst("logoutRequest"); + if (StringUtils.hasText(payload)) { + if (log.isTraceEnabled()) { + log.trace("Logout request=[" + payload + "]"); + } + String sessionIdentifier = XmlUtils.getTextForElement(payload, "SessionIndex"); + if (StringUtils.hasText(sessionIdentifier)) { + // 命中该请求,中断执行 + return SESSION_MAPPING_STORAGE.removeSessionByMappingId(sessionIdentifier) + .filter(Objects::nonNull) + .flatMap(savedSession -> { + String sessionId = savedSession.getId(); + if (log.isDebugEnabled()) { + log.debug("Invalidating session [" + sessionId + "] for ST [" + sessionIdentifier + "]"); + } + try { + return savedSession.invalidate(); + } catch (IllegalStateException e) { + log.debug(e, e); + } + // 中断处理 + return Mono.empty(); + }); + } + } + return translate; + }); + } else { + String ticket = exchange.getRequest().getQueryParams().getFirst("ticket"); + if (log.isDebugEnabled()) { + log.debug("Storing session identifier for " + session.getId()); + } + + // 包括ticket,尝试重新替换session + if (StringUtils.hasText(ticket)) { + return SESSION_MAPPING_STORAGE.removeBySessionById(session.getId()) + .onErrorResume(e -> SESSION_MAPPING_STORAGE.addSessionById(ticket, session)) + .then(translate); + } + + return translate; + } + } + + private Mono getParameter(ServerWebExchange exchange, String key) { + ServerHttpRequest request = exchange.getRequest(); + String query = request.getQueryParams().getFirst(key); + if (StringUtils.hasText(query)) { + return Mono.just(query); + } + MediaType mediaType = request.getHeaders().getContentType(); + if (null != mediaType && mediaType.isCompatibleWith(MediaType.APPLICATION_FORM_URLENCODED)) { + return exchange.getFormData().mapNotNull(formData -> formData.getFirst(key)); + } + return Mono.empty(); + } + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + // 拦截器需要基于session判定,故提前使用 + return exchange.getSession() + .flatMap(session -> { + if (log.isTraceEnabled()) { + log.trace("entering doFilter()"); + } + // 执行中断策略 + String pt = exchange.getRequest().getQueryParams().getFirst("pt"); + if (StringUtils.hasText(pt)) { + if (session.getAttribute(pt) != null) { + return chain.filter(exchange); + } + } + return handle(exchange, chain, session); + }); + } + +} diff --git a/src/main/java/dev/flyfish/boot/cas/filter/CASParameter.java b/src/main/java/dev/flyfish/boot/cas/filter/CASParameter.java new file mode 100644 index 0000000..7fdef3c --- /dev/null +++ b/src/main/java/dev/flyfish/boot/cas/filter/CASParameter.java @@ -0,0 +1,77 @@ +package dev.flyfish.boot.cas.filter; + +import com.fasterxml.jackson.annotation.JsonAlias; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.StringTokenizer; + +@Data +public class CASParameter { + + // 排除的过滤地址 + @JsonAlias(CASFilter.CAS_FILTER_EXCLUSION) + Set exclusions; + + @JsonAlias(CASFilter.LOGIN_INIT_PARAM) + String casLogin; + + @JsonAlias(CASFilter.VALIDATE_INIT_PARAM) + String casValidate; + + @JsonAlias(CASFilter.SERVICE_INIT_PARAM) + String casServiceUrl; + + @JsonAlias(CASFilter.SERVERNAME_INIT_PARAM) + String casServerName; + + @JsonAlias(CASFilter.PROXY_CALLBACK_INIT_PARAM) + String casProxyCallbackUrl; + + @JsonAlias(CASFilter.CAS_FILTER_INITCONTEXTCLASS) + String casInitContextClass; + + @JsonAlias(CASFilter.RENEW_INIT_PARAM) + boolean casRenew; + + @JsonAlias(CASFilter.WRAP_REQUESTS_INIT_PARAM) + boolean wrapRequest; + + @JsonAlias(CASFilter.GATEWAY_INIT_PARAM) + boolean casGateway = false; + + @JsonAlias(CASFilter.CAS_FILTER_USERLOGINMARK) + String userLoginMark = null; + + // 已授权的代理地址列表 + @JsonAlias(CASFilter.AUTHORIZED_PROXY_INIT_PARAM) + List authorizedProxies = new ArrayList<>(); + + public void setAuthorizedProxies(String casAuthorizedProxy) { + if (casAuthorizedProxy != null) { + StringTokenizer casProxies = new StringTokenizer(casAuthorizedProxy); + + while (casProxies.hasMoreTokens()) { + String anAuthorizedProxy = casProxies.nextToken(); + this.authorizedProxies.add(anAuthorizedProxy); + } + } + } + + /** + * 检查配置参数是否有误 + */ + public void check() { + if (this.casGateway && this.casRenew) { + throw new IllegalArgumentException("gateway and renew cannot both be true in filter configuration"); + } else if (this.casServerName != null && this.casServiceUrl != null) { + throw new IllegalArgumentException("serverName and serviceUrl cannot both be set: choose one."); + } else if (this.casServerName == null && this.casServiceUrl == null) { + throw new IllegalArgumentException("one of serverName or serviceUrl must be set."); + } else if (this.casValidate == null) { + throw new IllegalArgumentException("validateUrl parameter must be set."); + } + } +} diff --git a/src/main/java/dev/flyfish/boot/cas/filter/SessionMappingStorage.java b/src/main/java/dev/flyfish/boot/cas/filter/SessionMappingStorage.java new file mode 100644 index 0000000..393cd89 --- /dev/null +++ b/src/main/java/dev/flyfish/boot/cas/filter/SessionMappingStorage.java @@ -0,0 +1,65 @@ +package dev.flyfish.boot.cas.filter; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.server.WebSession; +import reactor.core.publisher.Mono; + +import java.util.HashMap; +import java.util.Map; + +/** + * webflux的session mapping存储 + * + * @author wangyu + */ +public interface SessionMappingStorage { + + Mono removeSessionByMappingId(String mappingId); + + Mono removeBySessionById(String mappingId); + + Mono addSessionById(String mappingId, WebSession session); + + @Slf4j + class HashMapBackedSessionStorage implements SessionMappingStorage { + + private final Map MANAGED_SESSIONS = new HashMap<>(); + private final Map ID_TO_SESSION_KEY_MAPPING = new HashMap<>(); + + @Override + public Mono removeSessionByMappingId(String mappingId) { + WebSession session = this.MANAGED_SESSIONS.get(mappingId); + if (session != null) { + this.removeBySessionById(session.getId()); + } + return Mono.just(session); + } + + @Override + public Mono removeBySessionById(String sessionId) { + if (log.isDebugEnabled()) { + log.debug("Attempting to remove Session=[" + sessionId + "]"); + } + + String key = this.ID_TO_SESSION_KEY_MAPPING.get(sessionId); + if (log.isDebugEnabled()) { + if (key != null) { + log.debug("Found mapping for session. Session Removed."); + } else { + log.debug("No mapping for session found. Ignoring."); + } + } + + this.MANAGED_SESSIONS.remove(key); + this.ID_TO_SESSION_KEY_MAPPING.remove(sessionId); + return Mono.empty(); + } + + @Override + public Mono addSessionById(String mappingId, WebSession session) { + this.ID_TO_SESSION_KEY_MAPPING.put(session.getId(), mappingId); + this.MANAGED_SESSIONS.put(mappingId, session); + return Mono.empty(); + } + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..401009c --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=cas diff --git a/src/test/java/dev/flyfish/boot/cas/CasApplicationTests.java b/src/test/java/dev/flyfish/boot/cas/CasApplicationTests.java new file mode 100644 index 0000000..3daeb1c --- /dev/null +++ b/src/test/java/dev/flyfish/boot/cas/CasApplicationTests.java @@ -0,0 +1,13 @@ +package dev.flyfish.boot.cas; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CasApplicationTests { + + @Test + void contextLoads() { + } + +}