Commit 7d998aa6f40015ebb53e01a61ca7c374cf6ddfd3

Authored by 陶汉栋
2 parents 1532fcd9 64cbebcf

Merge branch 'master' of http://git.shunzhi.net/taohd/mycloud

# Conflicts:
#	cloud/haikang/src/main/java/com/sincere/haikang/CMSServer.java
Showing 200 changed files with 8000 additions and 4380 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 200 files displayed.

cloud/Capture/2019-08-06/2019-08-06_08-34-58.jpg

14.7 KB

cloud/Capture/2019-08-06/2019-08-06_08-35-26.jpg

14.1 KB

cloud/GateSnapPicture/1565064083617GateSnapPicture.jpg

13.7 KB

cloud/GateSnapPicture/1565064085046GateSnapPicture.jpg

13.6 KB

cloud/GateSnapPicture/1565064086448GateSnapPicture.jpg

14.3 KB

cloud/HCAapSDKCom/zlib1.dll
No preview for this file type
cloud/ailive/.gitignore
... ... @@ -1,31 +0,0 @@
1   -HELP.md
2   -target/
3   -!.mvn/wrapper/maven-wrapper.jar
4   -!**/src/main/**
5   -!**/src/test/**
6   -
7   -### STS ###
8   -.apt_generated
9   -.classpath
10   -.factorypath
11   -.project
12   -.settings
13   -.springBeans
14   -.sts4-cache
15   -
16   -### IntelliJ IDEA ###
17   -.idea
18   -*.iws
19   -*.iml
20   -*.ipr
21   -
22   -### NetBeans ###
23   -/nbproject/private/
24   -/nbbuild/
25   -/dist/
26   -/nbdist/
27   -/.nb-gradle/
28   -build/
29   -
30   -### VS Code ###
31   -.vscode/
cloud/ailive/.mvn/wrapper/MavenWrapperDownloader.java
... ... @@ -1,114 +0,0 @@
1   -/*
2   -Licensed to the Apache Software Foundation (ASF) under one
3   -or more contributor license agreements. See the NOTICE file
4   -distributed with this work for additional information
5   -regarding copyright ownership. The ASF licenses this file
6   -to you under the Apache License, Version 2.0 (the
7   -"License"); you may not use this file except in compliance
8   -with the License. You may obtain a copy of the License at
9   -
10   - https://www.apache.org/licenses/LICENSE-2.0
11   -
12   -Unless required by applicable law or agreed to in writing,
13   -software distributed under the License is distributed on an
14   -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   -KIND, either express or implied. See the License for the
16   -specific language governing permissions and limitations
17   -under the License.
18   -*/
19   -
20   -import java.io.File;
21   -import java.io.FileInputStream;
22   -import java.io.FileOutputStream;
23   -import java.io.IOException;
24   -import java.net.URL;
25   -import java.nio.channels.Channels;
26   -import java.nio.channels.ReadableByteChannel;
27   -import java.util.Properties;
28   -
29   -public class MavenWrapperDownloader {
30   -
31   - /**
32   - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
33   - */
34   - private static final String DEFAULT_DOWNLOAD_URL =
35   - "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
36   -
37   - /**
38   - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
39   - * use instead of the default one.
40   - */
41   - private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
42   - ".mvn/wrapper/maven-wrapper.properties";
43   -
44   - /**
45   - * Path where the maven-wrapper.jar will be saved to.
46   - */
47   - private static final String MAVEN_WRAPPER_JAR_PATH =
48   - ".mvn/wrapper/maven-wrapper.jar";
49   -
50   - /**
51   - * Name of the property which should be used to override the default download url for the wrapper.
52   - */
53   - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
54   -
55   - public static void main(String args[]) {
56   - System.out.println("- Downloader started");
57   - File baseDirectory = new File(args[0]);
58   - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
59   -
60   - // If the maven-wrapper.properties exists, read it and check if it contains a custom
61   - // wrapperUrl parameter.
62   - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
63   - String url = DEFAULT_DOWNLOAD_URL;
64   - if (mavenWrapperPropertyFile.exists()) {
65   - FileInputStream mavenWrapperPropertyFileInputStream = null;
66   - try {
67   - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
68   - Properties mavenWrapperProperties = new Properties();
69   - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
70   - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
71   - } catch (IOException e) {
72   - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
73   - } finally {
74   - try {
75   - if (mavenWrapperPropertyFileInputStream != null) {
76   - mavenWrapperPropertyFileInputStream.close();
77   - }
78   - } catch (IOException e) {
79   - // Ignore ...
80   - }
81   - }
82   - }
83   - System.out.println("- Downloading from: : " + url);
84   -
85   - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
86   - if (!outputFile.getParentFile().exists()) {
87   - if (!outputFile.getParentFile().mkdirs()) {
88   - System.out.println(
89   - "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
90   - }
91   - }
92   - System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
93   - try {
94   - downloadFileFromURL(url, outputFile);
95   - System.out.println("Done");
96   - System.exit(0);
97   - } catch (Throwable e) {
98   - System.out.println("- Error downloading");
99   - e.printStackTrace();
100   - System.exit(1);
101   - }
102   - }
103   -
104   - private static void downloadFileFromURL(String urlString, File destination) throws Exception {
105   - URL website = new URL(urlString);
106   - ReadableByteChannel rbc;
107   - rbc = Channels.newChannel(website.openStream());
108   - FileOutputStream fos = new FileOutputStream(destination);
109   - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
110   - fos.close();
111   - rbc.close();
112   - }
113   -
114   -}
cloud/ailive/.mvn/wrapper/maven-wrapper.jar
No preview for this file type
cloud/ailive/.mvn/wrapper/maven-wrapper.properties
... ... @@ -1 +0,0 @@
1   -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
cloud/ailive/mvnw
... ... @@ -1,286 +0,0 @@
1   -#!/bin/sh
2   -# ----------------------------------------------------------------------------
3   -# Licensed to the Apache Software Foundation (ASF) under one
4   -# or more contributor license agreements. See the NOTICE file
5   -# distributed with this work for additional information
6   -# regarding copyright ownership. The ASF licenses this file
7   -# to you under the Apache License, Version 2.0 (the
8   -# "License"); you may not use this file except in compliance
9   -# with the License. You may obtain a copy of the License at
10   -#
11   -# https://www.apache.org/licenses/LICENSE-2.0
12   -#
13   -# Unless required by applicable law or agreed to in writing,
14   -# software distributed under the License is distributed on an
15   -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   -# KIND, either express or implied. See the License for the
17   -# specific language governing permissions and limitations
18   -# under the License.
19   -# ----------------------------------------------------------------------------
20   -
21   -# ----------------------------------------------------------------------------
22   -# Maven2 Start Up Batch script
23   -#
24   -# Required ENV vars:
25   -# ------------------
26   -# JAVA_HOME - location of a JDK home dir
27   -#
28   -# Optional ENV vars
29   -# -----------------
30   -# M2_HOME - location of maven2's installed home dir
31   -# MAVEN_OPTS - parameters passed to the Java VM when running Maven
32   -# e.g. to debug Maven itself, use
33   -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
34   -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
35   -# ----------------------------------------------------------------------------
36   -
37   -if [ -z "$MAVEN_SKIP_RC" ] ; then
38   -
39   - if [ -f /etc/mavenrc ] ; then
40   - . /etc/mavenrc
41   - fi
42   -
43   - if [ -f "$HOME/.mavenrc" ] ; then
44   - . "$HOME/.mavenrc"
45   - fi
46   -
47   -fi
48   -
49   -# OS specific support. $var _must_ be set to either true or false.
50   -cygwin=false;
51   -darwin=false;
52   -mingw=false
53   -case "`uname`" in
54   - CYGWIN*) cygwin=true ;;
55   - MINGW*) mingw=true;;
56   - Darwin*) darwin=true
57   - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
58   - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
59   - if [ -z "$JAVA_HOME" ]; then
60   - if [ -x "/usr/libexec/java_home" ]; then
61   - export JAVA_HOME="`/usr/libexec/java_home`"
62   - else
63   - export JAVA_HOME="/Library/Java/Home"
64   - fi
65   - fi
66   - ;;
67   -esac
68   -
69   -if [ -z "$JAVA_HOME" ] ; then
70   - if [ -r /etc/gentoo-release ] ; then
71   - JAVA_HOME=`java-config --jre-home`
72   - fi
73   -fi
74   -
75   -if [ -z "$M2_HOME" ] ; then
76   - ## resolve links - $0 may be a link to maven's home
77   - PRG="$0"
78   -
79   - # need this for relative symlinks
80   - while [ -h "$PRG" ] ; do
81   - ls=`ls -ld "$PRG"`
82   - link=`expr "$ls" : '.*-> \(.*\)$'`
83   - if expr "$link" : '/.*' > /dev/null; then
84   - PRG="$link"
85   - else
86   - PRG="`dirname "$PRG"`/$link"
87   - fi
88   - done
89   -
90   - saveddir=`pwd`
91   -
92   - M2_HOME=`dirname "$PRG"`/..
93   -
94   - # make it fully qualified
95   - M2_HOME=`cd "$M2_HOME" && pwd`
96   -
97   - cd "$saveddir"
98   - # echo Using m2 at $M2_HOME
99   -fi
100   -
101   -# For Cygwin, ensure paths are in UNIX format before anything is touched
102   -if $cygwin ; then
103   - [ -n "$M2_HOME" ] &&
104   - M2_HOME=`cygpath --unix "$M2_HOME"`
105   - [ -n "$JAVA_HOME" ] &&
106   - JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
107   - [ -n "$CLASSPATH" ] &&
108   - CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
109   -fi
110   -
111   -# For Mingw, ensure paths are in UNIX format before anything is touched
112   -if $mingw ; then
113   - [ -n "$M2_HOME" ] &&
114   - M2_HOME="`(cd "$M2_HOME"; pwd)`"
115   - [ -n "$JAVA_HOME" ] &&
116   - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
117   - # TODO classpath?
118   -fi
119   -
120   -if [ -z "$JAVA_HOME" ]; then
121   - javaExecutable="`which javac`"
122   - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
123   - # readlink(1) is not available as standard on Solaris 10.
124   - readLink=`which readlink`
125   - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
126   - if $darwin ; then
127   - javaHome="`dirname \"$javaExecutable\"`"
128   - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
129   - else
130   - javaExecutable="`readlink -f \"$javaExecutable\"`"
131   - fi
132   - javaHome="`dirname \"$javaExecutable\"`"
133   - javaHome=`expr "$javaHome" : '\(.*\)/bin'`
134   - JAVA_HOME="$javaHome"
135   - export JAVA_HOME
136   - fi
137   - fi
138   -fi
139   -
140   -if [ -z "$JAVACMD" ] ; then
141   - if [ -n "$JAVA_HOME" ] ; then
142   - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
143   - # IBM's JDK on AIX uses strange locations for the executables
144   - JAVACMD="$JAVA_HOME/jre/sh/java"
145   - else
146   - JAVACMD="$JAVA_HOME/bin/java"
147   - fi
148   - else
149   - JAVACMD="`which java`"
150   - fi
151   -fi
152   -
153   -if [ ! -x "$JAVACMD" ] ; then
154   - echo "Error: JAVA_HOME is not defined correctly." >&2
155   - echo " We cannot execute $JAVACMD" >&2
156   - exit 1
157   -fi
158   -
159   -if [ -z "$JAVA_HOME" ] ; then
160   - echo "Warning: JAVA_HOME environment variable is not set."
161   -fi
162   -
163   -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
164   -
165   -# traverses directory structure from process work directory to filesystem root
166   -# first directory with .mvn subdirectory is considered project base directory
167   -find_maven_basedir() {
168   -
169   - if [ -z "$1" ]
170   - then
171   - echo "Path not specified to find_maven_basedir"
172   - return 1
173   - fi
174   -
175   - basedir="$1"
176   - wdir="$1"
177   - while [ "$wdir" != '/' ] ; do
178   - if [ -d "$wdir"/.mvn ] ; then
179   - basedir=$wdir
180   - break
181   - fi
182   - # workaround for JBEAP-8937 (on Solaris 10/Sparc)
183   - if [ -d "${wdir}" ]; then
184   - wdir=`cd "$wdir/.."; pwd`
185   - fi
186   - # end of workaround
187   - done
188   - echo "${basedir}"
189   -}
190   -
191   -# concatenates all lines of a file
192   -concat_lines() {
193   - if [ -f "$1" ]; then
194   - echo "$(tr -s '\n' ' ' < "$1")"
195   - fi
196   -}
197   -
198   -BASE_DIR=`find_maven_basedir "$(pwd)"`
199   -if [ -z "$BASE_DIR" ]; then
200   - exit 1;
201   -fi
202   -
203   -##########################################################################################
204   -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
205   -# This allows using the maven wrapper in projects that prohibit checking in binary data.
206   -##########################################################################################
207   -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
208   - if [ "$MVNW_VERBOSE" = true ]; then
209   - echo "Found .mvn/wrapper/maven-wrapper.jar"
210   - fi
211   -else
212   - if [ "$MVNW_VERBOSE" = true ]; then
213   - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
214   - fi
215   - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
216   - while IFS="=" read key value; do
217   - case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
218   - esac
219   - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
220   - if [ "$MVNW_VERBOSE" = true ]; then
221   - echo "Downloading from: $jarUrl"
222   - fi
223   - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
224   -
225   - if command -v wget > /dev/null; then
226   - if [ "$MVNW_VERBOSE" = true ]; then
227   - echo "Found wget ... using wget"
228   - fi
229   - wget "$jarUrl" -O "$wrapperJarPath"
230   - elif command -v curl > /dev/null; then
231   - if [ "$MVNW_VERBOSE" = true ]; then
232   - echo "Found curl ... using curl"
233   - fi
234   - curl -o "$wrapperJarPath" "$jarUrl"
235   - else
236   - if [ "$MVNW_VERBOSE" = true ]; then
237   - echo "Falling back to using Java to download"
238   - fi
239   - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
240   - if [ -e "$javaClass" ]; then
241   - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
242   - if [ "$MVNW_VERBOSE" = true ]; then
243   - echo " - Compiling MavenWrapperDownloader.java ..."
244   - fi
245   - # Compiling the Java class
246   - ("$JAVA_HOME/bin/javac" "$javaClass")
247   - fi
248   - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
249   - # Running the downloader
250   - if [ "$MVNW_VERBOSE" = true ]; then
251   - echo " - Running MavenWrapperDownloader.java ..."
252   - fi
253   - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
254   - fi
255   - fi
256   - fi
257   -fi
258   -##########################################################################################
259   -# End of extension
260   -##########################################################################################
261   -
262   -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
263   -if [ "$MVNW_VERBOSE" = true ]; then
264   - echo $MAVEN_PROJECTBASEDIR
265   -fi
266   -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
267   -
268   -# For Cygwin, switch paths to Windows format before running java
269   -if $cygwin; then
270   - [ -n "$M2_HOME" ] &&
271   - M2_HOME=`cygpath --path --windows "$M2_HOME"`
272   - [ -n "$JAVA_HOME" ] &&
273   - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
274   - [ -n "$CLASSPATH" ] &&
275   - CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
276   - [ -n "$MAVEN_PROJECTBASEDIR" ] &&
277   - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
278   -fi
279   -
280   -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
281   -
282   -exec "$JAVACMD" \
283   - $MAVEN_OPTS \
284   - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
285   - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
286   - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
cloud/ailive/mvnw.cmd
... ... @@ -1,161 +0,0 @@
1   -@REM ----------------------------------------------------------------------------
2   -@REM Licensed to the Apache Software Foundation (ASF) under one
3   -@REM or more contributor license agreements. See the NOTICE file
4   -@REM distributed with this work for additional information
5   -@REM regarding copyright ownership. The ASF licenses this file
6   -@REM to you under the Apache License, Version 2.0 (the
7   -@REM "License"); you may not use this file except in compliance
8   -@REM with the License. You may obtain a copy of the License at
9   -@REM
10   -@REM https://www.apache.org/licenses/LICENSE-2.0
11   -@REM
12   -@REM Unless required by applicable law or agreed to in writing,
13   -@REM software distributed under the License is distributed on an
14   -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   -@REM KIND, either express or implied. See the License for the
16   -@REM specific language governing permissions and limitations
17   -@REM under the License.
18   -@REM ----------------------------------------------------------------------------
19   -
20   -@REM ----------------------------------------------------------------------------
21   -@REM Maven2 Start Up Batch script
22   -@REM
23   -@REM Required ENV vars:
24   -@REM JAVA_HOME - location of a JDK home dir
25   -@REM
26   -@REM Optional ENV vars
27   -@REM M2_HOME - location of maven2's installed home dir
28   -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29   -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
30   -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31   -@REM e.g. to debug Maven itself, use
32   -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33   -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34   -@REM ----------------------------------------------------------------------------
35   -
36   -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37   -@echo off
38   -@REM set title of command window
39   -title %0
40   -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
41   -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
42   -
43   -@REM set %HOME% to equivalent of $HOME
44   -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
45   -
46   -@REM Execute a user defined script before this one
47   -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
48   -@REM check for pre script, once with legacy .bat ending and once with .cmd ending
49   -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
50   -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
51   -:skipRcPre
52   -
53   -@setlocal
54   -
55   -set ERROR_CODE=0
56   -
57   -@REM To isolate internal variables from possible post scripts, we use another setlocal
58   -@setlocal
59   -
60   -@REM ==== START VALIDATION ====
61   -if not "%JAVA_HOME%" == "" goto OkJHome
62   -
63   -echo.
64   -echo Error: JAVA_HOME not found in your environment. >&2
65   -echo Please set the JAVA_HOME variable in your environment to match the >&2
66   -echo location of your Java installation. >&2
67   -echo.
68   -goto error
69   -
70   -:OkJHome
71   -if exist "%JAVA_HOME%\bin\java.exe" goto init
72   -
73   -echo.
74   -echo Error: JAVA_HOME is set to an invalid directory. >&2
75   -echo JAVA_HOME = "%JAVA_HOME%" >&2
76   -echo Please set the JAVA_HOME variable in your environment to match the >&2
77   -echo location of your Java installation. >&2
78   -echo.
79   -goto error
80   -
81   -@REM ==== END VALIDATION ====
82   -
83   -:init
84   -
85   -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86   -@REM Fallback to current working directory if not found.
87   -
88   -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89   -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90   -
91   -set EXEC_DIR=%CD%
92   -set WDIR=%EXEC_DIR%
93   -:findBaseDir
94   -IF EXIST "%WDIR%"\.mvn goto baseDirFound
95   -cd ..
96   -IF "%WDIR%"=="%CD%" goto baseDirNotFound
97   -set WDIR=%CD%
98   -goto findBaseDir
99   -
100   -:baseDirFound
101   -set MAVEN_PROJECTBASEDIR=%WDIR%
102   -cd "%EXEC_DIR%"
103   -goto endDetectBaseDir
104   -
105   -:baseDirNotFound
106   -set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107   -cd "%EXEC_DIR%"
108   -
109   -:endDetectBaseDir
110   -
111   -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112   -
113   -@setlocal EnableExtensions EnableDelayedExpansion
114   -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115   -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116   -
117   -:endReadAdditionalConfig
118   -
119   -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120   -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
121   -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
122   -
123   -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
124   -FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
125   - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
126   -)
127   -
128   -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
129   -@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
130   -if exist %WRAPPER_JAR% (
131   - echo Found %WRAPPER_JAR%
132   -) else (
133   - echo Couldn't find %WRAPPER_JAR%, downloading it ...
134   - echo Downloading from: %DOWNLOAD_URL%
135   - powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
136   - echo Finished downloading %WRAPPER_JAR%
137   -)
138   -@REM End of extension
139   -
140   -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
141   -if ERRORLEVEL 1 goto error
142   -goto end
143   -
144   -:error
145   -set ERROR_CODE=1
146   -
147   -:end
148   -@endlocal & set ERROR_CODE=%ERROR_CODE%
149   -
150   -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
151   -@REM check for post script, once with legacy .bat ending and once with .cmd ending
152   -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
153   -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
154   -:skipRcPost
155   -
156   -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
157   -if "%MAVEN_BATCH_PAUSE%" == "on" pause
158   -
159   -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
160   -
161   -exit /B %ERROR_CODE%
cloud/ailive/pom.xml
... ... @@ -1,53 +0,0 @@
1   -<?xml version="1.0" encoding="UTF-8"?>
2   -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3   - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4   - <modelVersion>4.0.0</modelVersion>
5   - <parent>
6   - <groupId>org.springframework.boot</groupId>
7   - <artifactId>spring-boot-starter-parent</artifactId>
8   - <version>2.1.6.RELEASE</version>
9   - <relativePath/> <!-- lookup parent from repository -->
10   - </parent>
11   - <groupId>com.ali.live</groupId>
12   - <artifactId>alilive</artifactId>
13   - <version>0.0.1-SNAPSHOT</version>
14   - <name>alilive</name>
15   - <description>Demo project for Spring Boot</description>
16   -
17   - <properties>
18   - <java.version>1.8</java.version>
19   - </properties>
20   -
21   - <dependencies>
22   - <dependency>
23   - <groupId>org.springframework.boot</groupId>
24   - <artifactId>spring-boot-starter-quartz</artifactId>
25   - </dependency>
26   - <dependency>
27   - <groupId>org.springframework.boot</groupId>
28   - <artifactId>spring-boot-starter-web</artifactId>
29   - </dependency>
30   -
31   - <dependency>
32   - <groupId>org.springframework.boot</groupId>
33   - <artifactId>spring-boot-starter-test</artifactId>
34   - <scope>test</scope>
35   - </dependency>
36   -
37   - <dependency>
38   - <groupId>com.aliyun</groupId>
39   - <artifactId>aliyun-java-sdk-live</artifactId>
40   - <version>3.7.5</version>
41   - </dependency>
42   - </dependencies>
43   -
44   - <build>
45   - <plugins>
46   - <plugin>
47   - <groupId>org.springframework.boot</groupId>
48   - <artifactId>spring-boot-maven-plugin</artifactId>
49   - </plugin>
50   - </plugins>
51   - </build>
52   -
53   -</project>
cloud/ailive/src/main/java/com/ali/live/alilive/AliliveApplication.java
... ... @@ -1,13 +0,0 @@
1   -package com.ali.live.alilive;
2   -
3   -import org.springframework.boot.SpringApplication;
4   -import org.springframework.boot.autoconfigure.SpringBootApplication;
5   -
6   -@SpringBootApplication
7   -public class AliliveApplication {
8   -
9   - public static void main(String[] args) {
10   - SpringApplication.run(AliliveApplication.class, args);
11   - }
12   -
13   -}
cloud/ailive/src/main/resources/application.properties
No preview for this file type
cloud/ailive/src/test/java/com/ali/live/alilive/AliliveApplicationTests.java
... ... @@ -1,16 +0,0 @@
1   -package com.ali.live.alilive;
2   -
3   -import org.junit.Test;
4   -import org.junit.runner.RunWith;
5   -import org.springframework.boot.test.context.SpringBootTest;
6   -import org.springframework.test.context.junit4.SpringRunner;
7   -
8   -@RunWith(SpringRunner.class)
9   -@SpringBootTest
10   -public class AliliveApplicationTests {
11   -
12   - @Test
13   - public void contextLoads() {
14   - }
15   -
16   -}
cloud/autho/.gitignore 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +HELP.md
  2 +target/
  3 +!.mvn/wrapper/maven-wrapper.jar
  4 +!**/src/main/**
  5 +!**/src/test/**
  6 +
  7 +### STS ###
  8 +.apt_generated
  9 +.classpath
  10 +.factorypath
  11 +.project
  12 +.settings
  13 +.springBeans
  14 +.sts4-cache
  15 +
  16 +### IntelliJ IDEA ###
  17 +.idea
  18 +*.iws
  19 +*.iml
  20 +*.ipr
  21 +
  22 +### NetBeans ###
  23 +/nbproject/private/
  24 +/nbbuild/
  25 +/dist/
  26 +/nbdist/
  27 +/.nb-gradle/
  28 +build/
  29 +
  30 +### VS Code ###
  31 +.vscode/
... ...
cloud/autho/.mvn/wrapper/MavenWrapperDownloader.java 0 → 100644
... ... @@ -0,0 +1,114 @@
  1 +/*
  2 +Licensed to the Apache Software Foundation (ASF) under one
  3 +or more contributor license agreements. See the NOTICE file
  4 +distributed with this work for additional information
  5 +regarding copyright ownership. The ASF licenses this file
  6 +to you under the Apache License, Version 2.0 (the
  7 +"License"); you may not use this file except in compliance
  8 +with the License. You may obtain a copy of the License at
  9 +
  10 + https://www.apache.org/licenses/LICENSE-2.0
  11 +
  12 +Unless required by applicable law or agreed to in writing,
  13 +software distributed under the License is distributed on an
  14 +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15 +KIND, either express or implied. See the License for the
  16 +specific language governing permissions and limitations
  17 +under the License.
  18 +*/
  19 +
  20 +import java.io.File;
  21 +import java.io.FileInputStream;
  22 +import java.io.FileOutputStream;
  23 +import java.io.IOException;
  24 +import java.net.URL;
  25 +import java.nio.channels.Channels;
  26 +import java.nio.channels.ReadableByteChannel;
  27 +import java.util.Properties;
  28 +
  29 +public class MavenWrapperDownloader {
  30 +
  31 + /**
  32 + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
  33 + */
  34 + private static final String DEFAULT_DOWNLOAD_URL =
  35 + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
  36 +
  37 + /**
  38 + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
  39 + * use instead of the default one.
  40 + */
  41 + private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
  42 + ".mvn/wrapper/maven-wrapper.properties";
  43 +
  44 + /**
  45 + * Path where the maven-wrapper.jar will be saved to.
  46 + */
  47 + private static final String MAVEN_WRAPPER_JAR_PATH =
  48 + ".mvn/wrapper/maven-wrapper.jar";
  49 +
  50 + /**
  51 + * Name of the property which should be used to override the default download url for the wrapper.
  52 + */
  53 + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
  54 +
  55 + public static void main(String args[]) {
  56 + System.out.println("- Downloader started");
  57 + File baseDirectory = new File(args[0]);
  58 + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
  59 +
  60 + // If the maven-wrapper.properties exists, read it and check if it contains a custom
  61 + // wrapperUrl parameter.
  62 + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
  63 + String url = DEFAULT_DOWNLOAD_URL;
  64 + if (mavenWrapperPropertyFile.exists()) {
  65 + FileInputStream mavenWrapperPropertyFileInputStream = null;
  66 + try {
  67 + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
  68 + Properties mavenWrapperProperties = new Properties();
  69 + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
  70 + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
  71 + } catch (IOException e) {
  72 + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
  73 + } finally {
  74 + try {
  75 + if (mavenWrapperPropertyFileInputStream != null) {
  76 + mavenWrapperPropertyFileInputStream.close();
  77 + }
  78 + } catch (IOException e) {
  79 + // Ignore ...
  80 + }
  81 + }
  82 + }
  83 + System.out.println("- Downloading from: : " + url);
  84 +
  85 + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
  86 + if (!outputFile.getParentFile().exists()) {
  87 + if (!outputFile.getParentFile().mkdirs()) {
  88 + System.out.println(
  89 + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
  90 + }
  91 + }
  92 + System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
  93 + try {
  94 + downloadFileFromURL(url, outputFile);
  95 + System.out.println("Done");
  96 + System.exit(0);
  97 + } catch (Throwable e) {
  98 + System.out.println("- Error downloading");
  99 + e.printStackTrace();
  100 + System.exit(1);
  101 + }
  102 + }
  103 +
  104 + private static void downloadFileFromURL(String urlString, File destination) throws Exception {
  105 + URL website = new URL(urlString);
  106 + ReadableByteChannel rbc;
  107 + rbc = Channels.newChannel(website.openStream());
  108 + FileOutputStream fos = new FileOutputStream(destination);
  109 + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
  110 + fos.close();
  111 + rbc.close();
  112 + }
  113 +
  114 +}
... ...
cloud/autho/.mvn/wrapper/maven-wrapper.jar 0 → 100644
No preview for this file type
cloud/autho/.mvn/wrapper/maven-wrapper.properties 0 → 100644
... ... @@ -0,0 +1 @@
  1 +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
... ...
cloud/autho/mvnw 0 → 100644
... ... @@ -0,0 +1,286 @@
  1 +#!/bin/sh
  2 +# ----------------------------------------------------------------------------
  3 +# Licensed to the Apache Software Foundation (ASF) under one
  4 +# or more contributor license agreements. See the NOTICE file
  5 +# distributed with this work for additional information
  6 +# regarding copyright ownership. The ASF licenses this file
  7 +# to you under the Apache License, Version 2.0 (the
  8 +# "License"); you may not use this file except in compliance
  9 +# with the License. You may obtain a copy of the License at
  10 +#
  11 +# https://www.apache.org/licenses/LICENSE-2.0
  12 +#
  13 +# Unless required by applicable law or agreed to in writing,
  14 +# software distributed under the License is distributed on an
  15 +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  16 +# KIND, either express or implied. See the License for the
  17 +# specific language governing permissions and limitations
  18 +# under the License.
  19 +# ----------------------------------------------------------------------------
  20 +
  21 +# ----------------------------------------------------------------------------
  22 +# Maven2 Start Up Batch script
  23 +#
  24 +# Required ENV vars:
  25 +# ------------------
  26 +# JAVA_HOME - location of a JDK home dir
  27 +#
  28 +# Optional ENV vars
  29 +# -----------------
  30 +# M2_HOME - location of maven2's installed home dir
  31 +# MAVEN_OPTS - parameters passed to the Java VM when running Maven
  32 +# e.g. to debug Maven itself, use
  33 +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
  34 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
  35 +# ----------------------------------------------------------------------------
  36 +
  37 +if [ -z "$MAVEN_SKIP_RC" ] ; then
  38 +
  39 + if [ -f /etc/mavenrc ] ; then
  40 + . /etc/mavenrc
  41 + fi
  42 +
  43 + if [ -f "$HOME/.mavenrc" ] ; then
  44 + . "$HOME/.mavenrc"
  45 + fi
  46 +
  47 +fi
  48 +
  49 +# OS specific support. $var _must_ be set to either true or false.
  50 +cygwin=false;
  51 +darwin=false;
  52 +mingw=false
  53 +case "`uname`" in
  54 + CYGWIN*) cygwin=true ;;
  55 + MINGW*) mingw=true;;
  56 + Darwin*) darwin=true
  57 + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
  58 + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
  59 + if [ -z "$JAVA_HOME" ]; then
  60 + if [ -x "/usr/libexec/java_home" ]; then
  61 + export JAVA_HOME="`/usr/libexec/java_home`"
  62 + else
  63 + export JAVA_HOME="/Library/Java/Home"
  64 + fi
  65 + fi
  66 + ;;
  67 +esac
  68 +
  69 +if [ -z "$JAVA_HOME" ] ; then
  70 + if [ -r /etc/gentoo-release ] ; then
  71 + JAVA_HOME=`java-config --jre-home`
  72 + fi
  73 +fi
  74 +
  75 +if [ -z "$M2_HOME" ] ; then
  76 + ## resolve links - $0 may be a link to maven's home
  77 + PRG="$0"
  78 +
  79 + # need this for relative symlinks
  80 + while [ -h "$PRG" ] ; do
  81 + ls=`ls -ld "$PRG"`
  82 + link=`expr "$ls" : '.*-> \(.*\)$'`
  83 + if expr "$link" : '/.*' > /dev/null; then
  84 + PRG="$link"
  85 + else
  86 + PRG="`dirname "$PRG"`/$link"
  87 + fi
  88 + done
  89 +
  90 + saveddir=`pwd`
  91 +
  92 + M2_HOME=`dirname "$PRG"`/..
  93 +
  94 + # make it fully qualified
  95 + M2_HOME=`cd "$M2_HOME" && pwd`
  96 +
  97 + cd "$saveddir"
  98 + # echo Using m2 at $M2_HOME
  99 +fi
  100 +
  101 +# For Cygwin, ensure paths are in UNIX format before anything is touched
  102 +if $cygwin ; then
  103 + [ -n "$M2_HOME" ] &&
  104 + M2_HOME=`cygpath --unix "$M2_HOME"`
  105 + [ -n "$JAVA_HOME" ] &&
  106 + JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  107 + [ -n "$CLASSPATH" ] &&
  108 + CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
  109 +fi
  110 +
  111 +# For Mingw, ensure paths are in UNIX format before anything is touched
  112 +if $mingw ; then
  113 + [ -n "$M2_HOME" ] &&
  114 + M2_HOME="`(cd "$M2_HOME"; pwd)`"
  115 + [ -n "$JAVA_HOME" ] &&
  116 + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
  117 + # TODO classpath?
  118 +fi
  119 +
  120 +if [ -z "$JAVA_HOME" ]; then
  121 + javaExecutable="`which javac`"
  122 + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
  123 + # readlink(1) is not available as standard on Solaris 10.
  124 + readLink=`which readlink`
  125 + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
  126 + if $darwin ; then
  127 + javaHome="`dirname \"$javaExecutable\"`"
  128 + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
  129 + else
  130 + javaExecutable="`readlink -f \"$javaExecutable\"`"
  131 + fi
  132 + javaHome="`dirname \"$javaExecutable\"`"
  133 + javaHome=`expr "$javaHome" : '\(.*\)/bin'`
  134 + JAVA_HOME="$javaHome"
  135 + export JAVA_HOME
  136 + fi
  137 + fi
  138 +fi
  139 +
  140 +if [ -z "$JAVACMD" ] ; then
  141 + if [ -n "$JAVA_HOME" ] ; then
  142 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  143 + # IBM's JDK on AIX uses strange locations for the executables
  144 + JAVACMD="$JAVA_HOME/jre/sh/java"
  145 + else
  146 + JAVACMD="$JAVA_HOME/bin/java"
  147 + fi
  148 + else
  149 + JAVACMD="`which java`"
  150 + fi
  151 +fi
  152 +
  153 +if [ ! -x "$JAVACMD" ] ; then
  154 + echo "Error: JAVA_HOME is not defined correctly." >&2
  155 + echo " We cannot execute $JAVACMD" >&2
  156 + exit 1
  157 +fi
  158 +
  159 +if [ -z "$JAVA_HOME" ] ; then
  160 + echo "Warning: JAVA_HOME environment variable is not set."
  161 +fi
  162 +
  163 +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
  164 +
  165 +# traverses directory structure from process work directory to filesystem root
  166 +# first directory with .mvn subdirectory is considered project base directory
  167 +find_maven_basedir() {
  168 +
  169 + if [ -z "$1" ]
  170 + then
  171 + echo "Path not specified to find_maven_basedir"
  172 + return 1
  173 + fi
  174 +
  175 + basedir="$1"
  176 + wdir="$1"
  177 + while [ "$wdir" != '/' ] ; do
  178 + if [ -d "$wdir"/.mvn ] ; then
  179 + basedir=$wdir
  180 + break
  181 + fi
  182 + # workaround for JBEAP-8937 (on Solaris 10/Sparc)
  183 + if [ -d "${wdir}" ]; then
  184 + wdir=`cd "$wdir/.."; pwd`
  185 + fi
  186 + # end of workaround
  187 + done
  188 + echo "${basedir}"
  189 +}
  190 +
  191 +# concatenates all lines of a file
  192 +concat_lines() {
  193 + if [ -f "$1" ]; then
  194 + echo "$(tr -s '\n' ' ' < "$1")"
  195 + fi
  196 +}
  197 +
  198 +BASE_DIR=`find_maven_basedir "$(pwd)"`
  199 +if [ -z "$BASE_DIR" ]; then
  200 + exit 1;
  201 +fi
  202 +
  203 +##########################################################################################
  204 +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
  205 +# This allows using the maven wrapper in projects that prohibit checking in binary data.
  206 +##########################################################################################
  207 +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
  208 + if [ "$MVNW_VERBOSE" = true ]; then
  209 + echo "Found .mvn/wrapper/maven-wrapper.jar"
  210 + fi
  211 +else
  212 + if [ "$MVNW_VERBOSE" = true ]; then
  213 + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
  214 + fi
  215 + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
  216 + while IFS="=" read key value; do
  217 + case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
  218 + esac
  219 + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
  220 + if [ "$MVNW_VERBOSE" = true ]; then
  221 + echo "Downloading from: $jarUrl"
  222 + fi
  223 + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
  224 +
  225 + if command -v wget > /dev/null; then
  226 + if [ "$MVNW_VERBOSE" = true ]; then
  227 + echo "Found wget ... using wget"
  228 + fi
  229 + wget "$jarUrl" -O "$wrapperJarPath"
  230 + elif command -v curl > /dev/null; then
  231 + if [ "$MVNW_VERBOSE" = true ]; then
  232 + echo "Found curl ... using curl"
  233 + fi
  234 + curl -o "$wrapperJarPath" "$jarUrl"
  235 + else
  236 + if [ "$MVNW_VERBOSE" = true ]; then
  237 + echo "Falling back to using Java to download"
  238 + fi
  239 + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
  240 + if [ -e "$javaClass" ]; then
  241 + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
  242 + if [ "$MVNW_VERBOSE" = true ]; then
  243 + echo " - Compiling MavenWrapperDownloader.java ..."
  244 + fi
  245 + # Compiling the Java class
  246 + ("$JAVA_HOME/bin/javac" "$javaClass")
  247 + fi
  248 + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
  249 + # Running the downloader
  250 + if [ "$MVNW_VERBOSE" = true ]; then
  251 + echo " - Running MavenWrapperDownloader.java ..."
  252 + fi
  253 + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
  254 + fi
  255 + fi
  256 + fi
  257 +fi
  258 +##########################################################################################
  259 +# End of extension
  260 +##########################################################################################
  261 +
  262 +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
  263 +if [ "$MVNW_VERBOSE" = true ]; then
  264 + echo $MAVEN_PROJECTBASEDIR
  265 +fi
  266 +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
  267 +
  268 +# For Cygwin, switch paths to Windows format before running java
  269 +if $cygwin; then
  270 + [ -n "$M2_HOME" ] &&
  271 + M2_HOME=`cygpath --path --windows "$M2_HOME"`
  272 + [ -n "$JAVA_HOME" ] &&
  273 + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
  274 + [ -n "$CLASSPATH" ] &&
  275 + CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
  276 + [ -n "$MAVEN_PROJECTBASEDIR" ] &&
  277 + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
  278 +fi
  279 +
  280 +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
  281 +
  282 +exec "$JAVACMD" \
  283 + $MAVEN_OPTS \
  284 + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
  285 + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  286 + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
... ...
cloud/autho/mvnw.cmd 0 → 100644
... ... @@ -0,0 +1,161 @@
  1 +@REM ----------------------------------------------------------------------------
  2 +@REM Licensed to the Apache Software Foundation (ASF) under one
  3 +@REM or more contributor license agreements. See the NOTICE file
  4 +@REM distributed with this work for additional information
  5 +@REM regarding copyright ownership. The ASF licenses this file
  6 +@REM to you under the Apache License, Version 2.0 (the
  7 +@REM "License"); you may not use this file except in compliance
  8 +@REM with the License. You may obtain a copy of the License at
  9 +@REM
  10 +@REM https://www.apache.org/licenses/LICENSE-2.0
  11 +@REM
  12 +@REM Unless required by applicable law or agreed to in writing,
  13 +@REM software distributed under the License is distributed on an
  14 +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15 +@REM KIND, either express or implied. See the License for the
  16 +@REM specific language governing permissions and limitations
  17 +@REM under the License.
  18 +@REM ----------------------------------------------------------------------------
  19 +
  20 +@REM ----------------------------------------------------------------------------
  21 +@REM Maven2 Start Up Batch script
  22 +@REM
  23 +@REM Required ENV vars:
  24 +@REM JAVA_HOME - location of a JDK home dir
  25 +@REM
  26 +@REM Optional ENV vars
  27 +@REM M2_HOME - location of maven2's installed home dir
  28 +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
  29 +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
  30 +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
  31 +@REM e.g. to debug Maven itself, use
  32 +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
  33 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
  34 +@REM ----------------------------------------------------------------------------
  35 +
  36 +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
  37 +@echo off
  38 +@REM set title of command window
  39 +title %0
  40 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
  41 +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
  42 +
  43 +@REM set %HOME% to equivalent of $HOME
  44 +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
  45 +
  46 +@REM Execute a user defined script before this one
  47 +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
  48 +@REM check for pre script, once with legacy .bat ending and once with .cmd ending
  49 +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
  50 +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
  51 +:skipRcPre
  52 +
  53 +@setlocal
  54 +
  55 +set ERROR_CODE=0
  56 +
  57 +@REM To isolate internal variables from possible post scripts, we use another setlocal
  58 +@setlocal
  59 +
  60 +@REM ==== START VALIDATION ====
  61 +if not "%JAVA_HOME%" == "" goto OkJHome
  62 +
  63 +echo.
  64 +echo Error: JAVA_HOME not found in your environment. >&2
  65 +echo Please set the JAVA_HOME variable in your environment to match the >&2
  66 +echo location of your Java installation. >&2
  67 +echo.
  68 +goto error
  69 +
  70 +:OkJHome
  71 +if exist "%JAVA_HOME%\bin\java.exe" goto init
  72 +
  73 +echo.
  74 +echo Error: JAVA_HOME is set to an invalid directory. >&2
  75 +echo JAVA_HOME = "%JAVA_HOME%" >&2
  76 +echo Please set the JAVA_HOME variable in your environment to match the >&2
  77 +echo location of your Java installation. >&2
  78 +echo.
  79 +goto error
  80 +
  81 +@REM ==== END VALIDATION ====
  82 +
  83 +:init
  84 +
  85 +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
  86 +@REM Fallback to current working directory if not found.
  87 +
  88 +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
  89 +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
  90 +
  91 +set EXEC_DIR=%CD%
  92 +set WDIR=%EXEC_DIR%
  93 +:findBaseDir
  94 +IF EXIST "%WDIR%"\.mvn goto baseDirFound
  95 +cd ..
  96 +IF "%WDIR%"=="%CD%" goto baseDirNotFound
  97 +set WDIR=%CD%
  98 +goto findBaseDir
  99 +
  100 +:baseDirFound
  101 +set MAVEN_PROJECTBASEDIR=%WDIR%
  102 +cd "%EXEC_DIR%"
  103 +goto endDetectBaseDir
  104 +
  105 +:baseDirNotFound
  106 +set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
  107 +cd "%EXEC_DIR%"
  108 +
  109 +:endDetectBaseDir
  110 +
  111 +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
  112 +
  113 +@setlocal EnableExtensions EnableDelayedExpansion
  114 +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
  115 +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
  116 +
  117 +:endReadAdditionalConfig
  118 +
  119 +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
  120 +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
  121 +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
  122 +
  123 +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
  124 +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
  125 + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
  126 +)
  127 +
  128 +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
  129 +@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
  130 +if exist %WRAPPER_JAR% (
  131 + echo Found %WRAPPER_JAR%
  132 +) else (
  133 + echo Couldn't find %WRAPPER_JAR%, downloading it ...
  134 + echo Downloading from: %DOWNLOAD_URL%
  135 + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
  136 + echo Finished downloading %WRAPPER_JAR%
  137 +)
  138 +@REM End of extension
  139 +
  140 +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
  141 +if ERRORLEVEL 1 goto error
  142 +goto end
  143 +
  144 +:error
  145 +set ERROR_CODE=1
  146 +
  147 +:end
  148 +@endlocal & set ERROR_CODE=%ERROR_CODE%
  149 +
  150 +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
  151 +@REM check for post script, once with legacy .bat ending and once with .cmd ending
  152 +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
  153 +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
  154 +:skipRcPost
  155 +
  156 +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
  157 +if "%MAVEN_BATCH_PAUSE%" == "on" pause
  158 +
  159 +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
  160 +
  161 +exit /B %ERROR_CODE%
... ...
cloud/autho/pom.xml 0 → 100644
... ... @@ -0,0 +1,106 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4 + <modelVersion>4.0.0</modelVersion>
  5 + <parent>
  6 + <groupId>org.springframework.boot</groupId>
  7 + <artifactId>spring-boot-starter-parent</artifactId>
  8 + <version>2.1.7.RELEASE</version>
  9 + <relativePath/> <!-- lookup parent from repository -->
  10 + </parent>
  11 + <groupId>com.sincere</groupId>
  12 + <artifactId>autho</artifactId>
  13 + <version>0.0.1</version>
  14 + <name>autho</name>
  15 + <description>Demo project for Spring Boot</description>
  16 +
  17 + <properties>
  18 + <java.version>1.8</java.version>
  19 + <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
  20 + </properties>
  21 +
  22 + <dependencies>
  23 + <dependency>
  24 + <groupId>com.sincere</groupId>
  25 + <artifactId>common</artifactId>
  26 + <version>0.0.1-SNAPSHOT</version>
  27 + </dependency>
  28 + <dependency>
  29 + <groupId>org.springframework.cloud</groupId>
  30 + <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  31 + </dependency>
  32 + <dependency>
  33 + <groupId>org.springframework.cloud</groupId>
  34 + <artifactId>spring-cloud-starter-oauth2</artifactId>
  35 + </dependency>
  36 +
  37 + <dependency>
  38 + <groupId>org.springframework.cloud</groupId>
  39 + <artifactId>spring-cloud-starter-security</artifactId>
  40 + <version>2.1.3.RELEASE</version>
  41 + </dependency>
  42 +
  43 + <dependency>
  44 + <groupId>org.springframework.boot</groupId>
  45 + <artifactId>spring-boot-starter-test</artifactId>
  46 + <scope>test</scope>
  47 + </dependency>
  48 +
  49 + <dependency>
  50 + <groupId>org.springframework.cloud</groupId>
  51 + <artifactId>spring-cloud-starter-openfeign</artifactId>
  52 + </dependency>
  53 +
  54 + <dependency>
  55 + <groupId>org.springframework.boot</groupId>
  56 + <artifactId>spring-boot-starter-data-redis</artifactId>
  57 + </dependency>
  58 + <dependency>
  59 + <groupId>com.alibaba</groupId>
  60 + <artifactId>fastjson</artifactId>
  61 + <version>1.2.58</version>
  62 + <scope>compile</scope>
  63 + </dependency>
  64 +
  65 + <dependency>
  66 + <groupId>io.grpc</groupId>
  67 + <artifactId>grpc-core</artifactId>
  68 + <version>1.18.0</version>
  69 + </dependency>
  70 +
  71 + <dependency>
  72 + <groupId>io.springfox</groupId>
  73 + <artifactId>springfox-swagger2</artifactId>
  74 + <version>2.9.2</version>
  75 + </dependency>
  76 +
  77 + <dependency>
  78 + <groupId>io.springfox</groupId>
  79 + <artifactId>springfox-swagger-ui</artifactId>
  80 + <version>2.9.2</version>
  81 + </dependency>
  82 +
  83 + </dependencies>
  84 +
  85 + <dependencyManagement>
  86 + <dependencies>
  87 + <dependency>
  88 + <groupId>org.springframework.cloud</groupId>
  89 + <artifactId>spring-cloud-dependencies</artifactId>
  90 + <version>${spring-cloud.version}</version>
  91 + <type>pom</type>
  92 + <scope>import</scope>
  93 + </dependency>
  94 + </dependencies>
  95 + </dependencyManagement>
  96 +
  97 + <build>
  98 + <plugins>
  99 + <plugin>
  100 + <groupId>org.springframework.boot</groupId>
  101 + <artifactId>spring-boot-maven-plugin</artifactId>
  102 + </plugin>
  103 + </plugins>
  104 + </build>
  105 +
  106 +</project>
... ...
cloud/autho/src/main/java/com/sincere/autho/AuthoApplication.java 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +package com.sincere.autho;
  2 +
  3 +import org.springframework.boot.SpringApplication;
  4 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  5 +import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  6 +
  7 +@EnableDiscoveryClient
  8 +@SpringBootApplication
  9 +public class AuthoApplication {
  10 +
  11 + public static void main(String[] args) {
  12 + SpringApplication.run(AuthoApplication.class, args);
  13 + }
  14 +
  15 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/annotation/EnableLogging.java 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +package com.sincere.autho.annotation;
  2 +
  3 +import com.sincere.autho.autoconfigure.LoggingConfigurationSelector;
  4 +import org.springframework.context.annotation.Import;
  5 +
  6 +import java.lang.annotation.*;
  7 +
  8 +
  9 +/**
  10 + * 启动日志框架支持
  11 + * @author owen
  12 + * @create 2017年7月2日
  13 + */
  14 +
  15 +@Target(ElementType.TYPE)
  16 +@Retention(RetentionPolicy.RUNTIME)
  17 +@Documented
  18 +//自动装配starter
  19 +@Import(LoggingConfigurationSelector.class)
  20 +public @interface EnableLogging{
  21 +// String name() ;
  22 +}
0 23 \ No newline at end of file
... ...
cloud/autho/src/main/java/com/sincere/autho/annotation/datasource/DataSource.java 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +package com.sincere.autho.annotation.datasource;
  2 +
  3 +import java.lang.annotation.*;
  4 +
  5 +
  6 +/**
  7 + * 数据源选择
  8 + * @author owen
  9 + * @create 2017年7月2日
  10 + */
  11 +@Target({ElementType.METHOD, ElementType.TYPE})
  12 +@Retention(RetentionPolicy.RUNTIME)
  13 +@Documented
  14 +public @interface DataSource {
  15 + String name();
  16 +}
0 17 \ No newline at end of file
... ...
cloud/autho/src/main/java/com/sincere/autho/annotation/log/LogAnnotation.java 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +package com.sincere.autho.annotation.log;
  2 +
  3 +import java.lang.annotation.*;
  4 +
  5 +/**
  6 + * 日志注解
  7 + * @author owen
  8 + * @create 2017年7月2日
  9 + */
  10 +@Target({ElementType.METHOD, ElementType.TYPE})
  11 +@Retention(RetentionPolicy.RUNTIME)
  12 +@Documented
  13 +public @interface LogAnnotation {
  14 +
  15 + /**
  16 + * 模块
  17 + * @return
  18 + */
  19 + String module();
  20 +
  21 + /**
  22 + * 记录执行参数
  23 + * @return
  24 + */
  25 + boolean recordRequestParam() default true;
  26 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/autoconfigure/LoggingConfigurationSelector.java 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +package com.sincere.autho.autoconfigure;
  2 +
  3 +import org.springframework.context.annotation.ImportSelector;
  4 +import org.springframework.core.type.AnnotationMetadata;
  5 +
  6 +/**
  7 + * @author owen
  8 + * @create 2017年7月2日
  9 + * 装配bean
  10 + */
  11 +public class LoggingConfigurationSelector implements ImportSelector {
  12 +
  13 + @Override
  14 + public String[] selectImports(AnnotationMetadata importingClassMetadata) {
  15 + // TODO Auto-generated method stub
  16 +// importingClassMetadata.getAllAnnotationAttributes(EnableEcho.class.getName());
  17 + return new String[] {
  18 + "com.sincere.autho.autoconfigure.datasource.DataSourceAspect",
  19 + "com.sincere.autho.autoconfigure.log.LogAnnotationAspect"
  20 + };
  21 + }
  22 +
  23 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/autoconfigure/datasource/DataSourceAspect.java 0 → 100644
... ... @@ -0,0 +1,42 @@
  1 +package com.sincere.autho.autoconfigure.datasource;
  2 +
  3 +import com.sincere.autho.annotation.datasource.DataSource;
  4 +import com.sincere.common.config.DataSourceHolder;
  5 +import com.sincere.common.config.DataSourceKey;
  6 +import org.aspectj.lang.JoinPoint;
  7 +import org.aspectj.lang.annotation.After;
  8 +import org.aspectj.lang.annotation.Aspect;
  9 +import org.aspectj.lang.annotation.Before;
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +import org.springframework.core.annotation.Order;
  13 +
  14 +/**
  15 + * 切换数据源Advice
  16 + */
  17 +@Aspect
  18 +@Order(-1) // 保证该AOP在@Transactional之前执行
  19 +public class DataSourceAspect {
  20 +
  21 + private static final Logger logger = LoggerFactory.getLogger(DataSourceAspect.class);
  22 +
  23 + @Before("@annotation(ds)")
  24 + public void changeDataSource(JoinPoint point, DataSource ds) throws Throwable {
  25 + String dsId = ds.name();
  26 + try {
  27 + DataSourceKey dataSourceKey = DataSourceKey.valueOf(dsId);
  28 + DataSourceHolder.setDataSourceKey(dataSourceKey);
  29 + } catch (Exception e) {
  30 + logger.error("数据源[{}]不存在,使用默认数据源 > {}", ds.name(), point.getSignature());
  31 + }
  32 +
  33 +
  34 + }
  35 +
  36 + @After("@annotation(ds)")
  37 + public void restoreDataSource(JoinPoint point, DataSource ds) {
  38 + logger.debug("Revert DataSource : {transIdo} > {}", ds.name(), point.getSignature());
  39 + DataSourceHolder.clearDataSourceKey();
  40 + }
  41 +
  42 +}
0 43 \ No newline at end of file
... ...
cloud/autho/src/main/java/com/sincere/autho/autoconfigure/log/LogAnnotationAspect.java 0 → 100644
... ... @@ -0,0 +1,133 @@
  1 +package com.sincere.autho.autoconfigure.log;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.JSONObject;
  5 +import com.sincere.autho.annotation.log.LogAnnotation;
  6 +import com.sincere.autho.log.service.LogService;
  7 +import com.sincere.autho.log.service.impl.LogServiceImpl;
  8 +import com.sincere.autho.utils.SysUserUtil;
  9 +import com.sincere.common.model.log.SysLog;
  10 +import com.sincere.common.model.system.LoginAppUser;
  11 +import com.sincere.common.util.SpringUtils;
  12 +import org.aspectj.lang.ProceedingJoinPoint;
  13 +import org.aspectj.lang.annotation.Around;
  14 +import org.aspectj.lang.annotation.Aspect;
  15 +import org.aspectj.lang.reflect.MethodSignature;
  16 +import org.slf4j.Logger;
  17 +import org.slf4j.LoggerFactory;
  18 +import org.springframework.core.annotation.Order;
  19 +
  20 +import javax.servlet.http.HttpServletRequest;
  21 +import javax.servlet.http.HttpServletResponse;
  22 +import java.util.ArrayList;
  23 +import java.util.Date;
  24 +import java.util.List;
  25 +import java.util.concurrent.CompletableFuture;
  26 +import java.util.concurrent.ThreadLocalRandom;
  27 +
  28 +/**
  29 + * 保存日志
  30 + *
  31 + * @author owen
  32 + * @create 2017年7月2日
  33 + */
  34 +@Aspect
  35 +@Order(-1) // 保证该AOP在@Transactional之前执行
  36 +public class LogAnnotationAspect {
  37 +
  38 + private static final Logger logger = LoggerFactory.getLogger(LogAnnotationAspect.class);
  39 +
  40 + @Around("@annotation(ds)")
  41 + public Object logSave(ProceedingJoinPoint joinPoint, LogAnnotation ds) throws Throwable {
  42 +
  43 + // 请求流水号
  44 + String transid = getRandom();
  45 + // 记录开始时间
  46 + long start = System.currentTimeMillis();
  47 + // 获取方法参数
  48 + String url = null;
  49 + String httpMethod = null;
  50 + Object result = null;
  51 + List<Object> httpReqArgs = new ArrayList<Object>();
  52 + SysLog log = new SysLog();
  53 + log.setCreateTime(new Date());
  54 + LoginAppUser loginAppUser = SysUserUtil.getLoginAppUser();
  55 + if (loginAppUser != null) {
  56 + log.setUsername(loginAppUser.getUsername());
  57 + }
  58 +
  59 + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
  60 +
  61 + LogAnnotation logAnnotation = methodSignature.getMethod().getDeclaredAnnotation(LogAnnotation.class);
  62 + log.setModule(logAnnotation.module() + ":" + methodSignature.getDeclaringTypeName() + "/"
  63 + + methodSignature.getName());
  64 +
  65 + Object[] args = joinPoint.getArgs();// 参数值
  66 + url = methodSignature.getDeclaringTypeName() + "/"+ methodSignature.getName();
  67 + for (Object object : args) {
  68 + if (object instanceof HttpServletRequest) {
  69 + HttpServletRequest request = (HttpServletRequest) object;
  70 + url = request.getRequestURI();
  71 + httpMethod = request.getMethod();
  72 + } else if (object instanceof HttpServletResponse) {
  73 + } else {
  74 +
  75 + httpReqArgs.add(object);
  76 + }
  77 + }
  78 +
  79 + try {
  80 + String params = JSONObject.toJSONString(httpReqArgs);
  81 + log.setParams(params);
  82 + // 打印请求参数参数
  83 + logger.info("开始请求,transid={}, url={} , httpMethod={}, reqData={} ", transid, url, httpMethod, params);
  84 + } catch (Exception e) {
  85 + logger.error("记录参数失败:{}", e.getMessage());
  86 + }
  87 +
  88 + try {
  89 + // 调用原来的方法
  90 + result = joinPoint.proceed();
  91 + log.setFlag(Boolean.TRUE);
  92 + } catch (Exception e) {
  93 + log.setFlag(Boolean.FALSE);
  94 + log.setRemark(e.getMessage());
  95 +
  96 + throw e;
  97 + } finally {
  98 +
  99 + CompletableFuture.runAsync(() -> {
  100 + try {
  101 + if (logAnnotation.recordRequestParam()) {
  102 + LogService logService = SpringUtils.getBean(LogServiceImpl.class);
  103 + logService.save(log);
  104 + }
  105 + } catch (Exception e) {
  106 + logger.error("记录参数失败:{}", e.getMessage());
  107 + }
  108 +
  109 + });
  110 + // 获取回执报文及耗时
  111 + logger.info("请求完成, transid={}, 耗时={}, resp={}:", transid, (System.currentTimeMillis() - start),
  112 + result == null ? null : JSON.toJSONString(result));
  113 +
  114 + }
  115 + return result;
  116 + }
  117 +
  118 + /**
  119 + * 生成日志随机数
  120 + *
  121 + * @return
  122 + */
  123 + public String getRandom() {
  124 + int i = 0;
  125 + StringBuilder st = new StringBuilder();
  126 + while (i < 5) {
  127 + i++;
  128 + st.append(ThreadLocalRandom.current().nextInt(10));
  129 + }
  130 + return st.toString() + System.currentTimeMillis();
  131 + }
  132 +
  133 +}
0 134 \ No newline at end of file
... ...
cloud/autho/src/main/java/com/sincere/autho/config/OAuth2ServerConfig.java 0 → 100644
... ... @@ -0,0 +1,260 @@
  1 +
  2 +package com.sincere.autho.config;
  3 +
  4 +import com.sincere.autho.service.RedisAuthorizationCodeServices;
  5 +import com.sincere.autho.service.RedisClientDetailsService;
  6 +import com.sincere.autho.token.RedisTemplateTokenStore;
  7 +import com.sincere.common.props.PermitUrlProperties;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.boot.autoconfigure.AutoConfigureAfter;
  10 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  11 +import org.springframework.context.annotation.Bean;
  12 +import org.springframework.context.annotation.Configuration;
  13 +import org.springframework.data.redis.core.RedisTemplate;
  14 +import org.springframework.security.authentication.AuthenticationManager;
  15 +import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  16 +import org.springframework.security.config.annotation.web.builders.WebSecurity;
  17 +import org.springframework.security.core.userdetails.UserDetailsService;
  18 +import org.springframework.security.oauth2.common.OAuth2AccessToken;
  19 +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
  20 +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
  21 +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
  22 +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
  23 +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
  24 +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
  25 +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
  26 +import org.springframework.security.oauth2.provider.code.RandomValueAuthorizationCodeServices;
  27 +import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator;
  28 +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
  29 +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
  30 +import org.springframework.security.web.util.matcher.RequestMatcher;
  31 +import org.springframework.stereotype.Component;
  32 +import org.springframework.util.AntPathMatcher;
  33 +
  34 +import javax.annotation.Resource;
  35 +import javax.servlet.http.HttpServletRequest;
  36 +import javax.sql.DataSource;
  37 +
  38 +/**
  39 + * @author owen 624191343@qq.com
  40 + * @version 创建时间:2017年11月12日 上午22:57:51
  41 + */
  42 +@Configuration
  43 +public class OAuth2ServerConfig {
  44 +
  45 + @Resource
  46 + private DataSource dataSource;
  47 + @Resource
  48 + private RedisTemplate<String, Object> redisTemplate;
  49 +
  50 + /**
  51 + * 声明 ClientDetails实现
  52 + */
  53 + @Bean
  54 + public RedisClientDetailsService redisClientDetailsService() {
  55 + RedisClientDetailsService clientDetailsService = new RedisClientDetailsService(dataSource);
  56 + clientDetailsService.setRedisTemplate(redisTemplate);
  57 + return clientDetailsService;
  58 + }
  59 +
  60 +
  61 + @Bean
  62 + public RandomValueAuthorizationCodeServices authorizationCodeServices() {
  63 + RedisAuthorizationCodeServices redisAuthorizationCodeServices = new RedisAuthorizationCodeServices();
  64 + redisAuthorizationCodeServices.setRedisTemplate(redisTemplate);
  65 + return redisAuthorizationCodeServices;
  66 + }
  67 +
  68 + /**
  69 + * @author owen 624191343@qq.com
  70 + * @version 创建时间:2017年11月12日 上午22:57:51 默认token存储在内存中
  71 + * DefaultTokenServices默认处理
  72 + */
  73 + @Component
  74 + @Configuration
  75 + @EnableAuthorizationServer
  76 + @AutoConfigureAfter(AuthorizationServerEndpointsConfigurer.class)
  77 + public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
  78 + /**
  79 + * 注入authenticationManager 来支持 password grant type
  80 + */
  81 + @Autowired
  82 + private AuthenticationManager authenticationManager;
  83 +
  84 + @Autowired
  85 + private UserDetailsService userDetailsService;
  86 +
  87 + @Autowired(required = false)
  88 + private RedisTemplateTokenStore redisTokenStore;
  89 +
  90 + @Autowired(required = false)
  91 + private JwtTokenStore jwtTokenStore;
  92 + @Autowired(required = false)
  93 + private JwtAccessTokenConverter jwtAccessTokenConverter;
  94 +
  95 + @Autowired
  96 + private WebResponseExceptionTranslator webResponseExceptionTranslator;
  97 +
  98 + @Autowired
  99 + private RedisClientDetailsService redisClientDetailsService;
  100 +
  101 + @Autowired(required = false)
  102 + private RandomValueAuthorizationCodeServices authorizationCodeServices;
  103 +
  104 + /**
  105 + * 配置身份认证器,配置认证方式,TokenStore,TokenGranter,OAuth2RequestFactory
  106 + */
  107 + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
  108 +
  109 + if (jwtTokenStore != null) {
  110 + endpoints.tokenStore(jwtTokenStore).authenticationManager(authenticationManager)
  111 + // 支持
  112 + .userDetailsService(userDetailsService);
  113 + // password
  114 + // grant
  115 + // type;
  116 + } else if (redisTokenStore != null) {
  117 + endpoints.tokenStore(redisTokenStore).authenticationManager(authenticationManager)
  118 + // 支持
  119 + .userDetailsService(userDetailsService);
  120 + // password
  121 + // grant
  122 + // type;
  123 + }
  124 +
  125 + if (jwtAccessTokenConverter != null) {
  126 + endpoints.accessTokenConverter(jwtAccessTokenConverter);
  127 + }
  128 +
  129 + endpoints.authorizationCodeServices(authorizationCodeServices);
  130 +
  131 + endpoints.exceptionTranslator(webResponseExceptionTranslator);
  132 +
  133 + }
  134 +
  135 + /**
  136 + * 配置应用名称 应用id
  137 + * 配置OAuth2的客户端相关信息
  138 + */
  139 + @Override
  140 + public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
  141 +
  142 + // if(clientDetailsService!=null){
  143 + // clients.withClientDetails(clientDetailsService);
  144 + // }else{
  145 + // clients.inMemory().withClient("neusoft1").secret("neusoft1")
  146 + // .authorizedGrantTypes("authorization_code", "password",
  147 + // "refresh_token").scopes("all")
  148 + // .resourceIds(SERVER_RESOURCE_ID).accessTokenValiditySeconds(1200)
  149 + // .refreshTokenValiditySeconds(50000)
  150 + // .and().withClient("neusoft2").secret("neusoft2")
  151 + // .authorizedGrantTypes("authorization_code", "password",
  152 + // "refresh_token").scopes("all")
  153 + // .resourceIds(SERVER_RESOURCE_ID).accessTokenValiditySeconds(1200)
  154 + // .refreshTokenValiditySeconds(50000)
  155 + // ;
  156 + // }
  157 + clients.withClientDetails(redisClientDetailsService);
  158 + redisClientDetailsService.loadAllClientToCache();
  159 + }
  160 +
  161 + /**
  162 + * 对应于配置AuthorizationServer安全认证的相关信息,创建ClientCredentialsTokenEndpointFilter核心过滤器
  163 + */
  164 + @Override
  165 + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
  166 + // url:/oauth/token_key,exposes
  167 + security.tokenKeyAccess("permitAll()")
  168 + /// public key for token
  169 + /// verification if using
  170 + /// JWT tokens
  171 + // url:/oauth/check_token
  172 + .checkTokenAccess("isAuthenticated()")
  173 + // allow check token
  174 + .allowFormAuthenticationForClients();
  175 +
  176 + // security.allowFormAuthenticationForClients();
  177 + //// security.tokenKeyAccess("permitAll()");
  178 + // security.tokenKeyAccess("isAuthenticated()");
  179 + }
  180 +
  181 + }
  182 +
  183 + /**
  184 + * 资源服务
  185 + */
  186 + @Configuration
  187 + @EnableResourceServer
  188 + @EnableConfigurationProperties(PermitUrlProperties.class)
  189 + public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
  190 +
  191 + @Autowired
  192 + private PermitUrlProperties permitUrlProperties;
  193 +
  194 + public void configure(WebSecurity web) throws Exception {
  195 + web.ignoring().antMatchers("/health");
  196 + web.ignoring().antMatchers("/oauth/user/token");
  197 + web.ignoring().antMatchers("/oauth/client/token");
  198 + }
  199 +
  200 + @Override
  201 + public void configure(HttpSecurity http) throws Exception {
  202 + http.requestMatcher(
  203 + /**
  204 + * 判断来源请求是否包含oauth2授权信息
  205 + */
  206 + new RequestMatcher() {
  207 + private AntPathMatcher antPathMatcher = new AntPathMatcher();
  208 +
  209 + @Override
  210 + public boolean matches(HttpServletRequest request) {
  211 + // 请求参数中包含access_token参数
  212 + if (request.getParameter(OAuth2AccessToken.ACCESS_TOKEN) != null) {
  213 + return true;
  214 + }
  215 +
  216 + // 头部的Authorization值以Bearer开头
  217 + String auth = request.getHeader("Authorization");
  218 + if (auth != null) {
  219 + if (auth.startsWith(OAuth2AccessToken.BEARER_TYPE)) {
  220 + return true;
  221 + }
  222 + }
  223 + if (antPathMatcher.match(request.getRequestURI(), "/oauth/userinfo")) {
  224 + return true;
  225 + }
  226 + if (antPathMatcher.match(request.getRequestURI(), "/oauth/remove/token")) {
  227 + return true;
  228 + }
  229 + if (antPathMatcher.match(request.getRequestURI(), "/oauth/get/token")) {
  230 + return true;
  231 + }
  232 + if (antPathMatcher.match(request.getRequestURI(), "/oauth/refresh/token")) {
  233 + return true;
  234 + }
  235 +
  236 + if (antPathMatcher.match(request.getRequestURI(), "/oauth/token/list")) {
  237 + return true;
  238 + }
  239 +
  240 + if (antPathMatcher.match("/clients/**", request.getRequestURI())) {
  241 + return true;
  242 + }
  243 +
  244 + if (antPathMatcher.match("/services/**", request.getRequestURI())) {
  245 + return true;
  246 + }
  247 + if (antPathMatcher.match("/redis/**", request.getRequestURI())) {
  248 + return true;
  249 + }
  250 + return false;
  251 + }
  252 + }
  253 +
  254 + ).authorizeRequests().antMatchers(permitUrlProperties.getIgnored()).permitAll().anyRequest()
  255 + .authenticated();
  256 + }
  257 +
  258 + }
  259 +
  260 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/config/SecurityConfig.java 0 → 100644
... ... @@ -0,0 +1,129 @@
  1 +package com.sincere.autho.config;
  2 +
  3 +import com.sincere.autho.handler.OauthLogoutHandler;
  4 +import com.sincere.common.props.PermitUrlProperties;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  7 +import org.springframework.context.annotation.Bean;
  8 +import org.springframework.context.annotation.Configuration;
  9 +import org.springframework.security.authentication.AuthenticationManager;
  10 +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  11 +import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  12 +import org.springframework.security.config.annotation.web.builders.WebSecurity;
  13 +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  14 +import org.springframework.security.config.http.SessionCreationPolicy;
  15 +import org.springframework.security.core.userdetails.UserDetailsService;
  16 +import org.springframework.security.crypto.password.PasswordEncoder;
  17 +import org.springframework.security.web.AuthenticationEntryPoint;
  18 +import org.springframework.security.web.authentication.AuthenticationFailureHandler;
  19 +import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
  20 +import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler;
  21 +
  22 +/**
  23 + * spring security配置
  24 + * 在WebSecurityConfigurerAdapter不拦截oauth要开放的资源
  25 + */
  26 +@Configuration
  27 +//@EnableWebSecurity
  28 +//@EnableGlobalMethodSecurity(prePostEnabled = true)
  29 +@EnableConfigurationProperties(PermitUrlProperties.class)
  30 +public class SecurityConfig extends WebSecurityConfigurerAdapter {
  31 +
  32 + @Autowired
  33 + private AuthenticationSuccessHandler authenticationSuccessHandler;
  34 + @Autowired
  35 + private AuthenticationFailureHandler authenticationFailureHandler;
  36 + // @Autowired
  37 + // private LogoutSuccessHandler logoutSuccessHandler;
  38 + @Autowired(required = false)
  39 + private AuthenticationEntryPoint authenticationEntryPoint;
  40 + @Autowired
  41 + private UserDetailsService userDetailsService;
  42 +
  43 + @Autowired
  44 + private PasswordEncoder passwordEncoder;
  45 +
  46 + @Autowired
  47 + private OauthLogoutHandler oauthLogoutHandler;
  48 + @Autowired
  49 + private PermitUrlProperties permitUrlProperties ;
  50 +
  51 + @Autowired
  52 + private ValidateCodeSecurityConfig validateCodeSecurityConfig ;
  53 +
  54 + @Override
  55 + public void configure(WebSecurity web) throws Exception {
  56 + web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security",
  57 + "/swagger-ui.html", "/webjars/**", "/doc.html", "/login.html");
  58 + web.ignoring().antMatchers("/js/**");
  59 + web.ignoring().antMatchers("/css/**");
  60 + web.ignoring().antMatchers("/health");
  61 + // 忽略登录界面
  62 + web.ignoring().antMatchers("/login.html");
  63 + web.ignoring().antMatchers("/index.html");
  64 + web.ignoring().antMatchers("/oauth/user/token");
  65 + web.ignoring().antMatchers("/oauth/client/token");
  66 + web.ignoring().antMatchers("/validata/code/**");
  67 + web.ignoring().antMatchers(permitUrlProperties.getIgnored());
  68 +
  69 + }
  70 + /**
  71 + * 认证管理
  72 + *
  73 + * @return 认证管理对象
  74 + * @throws Exception
  75 + * 认证异常信息
  76 + */
  77 + @Override
  78 + @Bean
  79 + public AuthenticationManager authenticationManagerBean() throws Exception {
  80 + return super.authenticationManagerBean();
  81 + }
  82 +
  83 + @Override
  84 + protected void configure(HttpSecurity http) throws Exception {
  85 + http.csrf().disable();
  86 +
  87 + http.authorizeRequests()
  88 + .anyRequest().authenticated();
  89 + http.formLogin().loginPage("/login.html").loginProcessingUrl("/user/login")
  90 + .successHandler(authenticationSuccessHandler).failureHandler(authenticationFailureHandler);
  91 +
  92 + // 基于密码 等模式可以无session,不支持授权码模式
  93 + if (authenticationEntryPoint != null) {
  94 + http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
  95 + http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  96 +
  97 + } else {
  98 + // 授权码模式单独处理,需要session的支持,此模式可以支持所有oauth2的认证
  99 + http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
  100 + }
  101 +
  102 + http.logout().logoutSuccessUrl("/login.html")
  103 + .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler())
  104 + .addLogoutHandler(oauthLogoutHandler).clearAuthentication(true);
  105 +
  106 + //增加验证码处理
  107 + http.apply(validateCodeSecurityConfig) ;
  108 + // http.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
  109 + // 解决不允许显示在iframe的问题
  110 + http.headers().frameOptions().disable();
  111 + http.headers().cacheControl();
  112 +
  113 + }
  114 +
  115 + /**
  116 + * 全局用户信息
  117 + *
  118 + * @param auth
  119 + * 认证管理
  120 + * @throws Exception
  121 + * 用户认证异常信息
  122 + */
  123 + @Autowired
  124 + public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
  125 + auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
  126 + }
  127 +
  128 +
  129 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/config/ValidateCodeSecurityConfig.java 0 → 100644
... ... @@ -0,0 +1,29 @@
  1 +/**
  2 + *
  3 + */
  4 +package com.sincere.autho.config;
  5 +
  6 +import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
  7 +import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  8 +import org.springframework.security.web.DefaultSecurityFilterChain;
  9 +import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import javax.annotation.Resource;
  13 +import javax.servlet.Filter;
  14 +
  15 +/**
  16 + * 校验码相关安全配置
  17 + *
  18 + * @author zlt
  19 + */
  20 +@Component("validateCodeSecurityConfig")
  21 +public class ValidateCodeSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
  22 + @Resource
  23 + private Filter validateCodeFilter;
  24 +
  25 + @Override
  26 + public void configure(HttpSecurity http) {
  27 + http.addFilterBefore(validateCodeFilter, AbstractPreAuthenticatedProcessingFilter.class);
  28 + }
  29 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/control/OAuth2Controller.java 0 → 100644
... ... @@ -0,0 +1,482 @@
  1 +package com.sincere.autho.control;
  2 +
  3 +import com.fasterxml.jackson.core.JsonProcessingException;
  4 +import com.fasterxml.jackson.databind.ObjectMapper;
  5 +import com.sincere.autho.annotation.log.LogAnnotation;
  6 +import com.sincere.autho.service.RedisClientDetailsService;
  7 +import com.sincere.autho.utils.SpringUtil;
  8 +import com.sincere.common.commons.PageResult;
  9 +import com.sincere.common.model.system.LoginAppUser;
  10 +import com.sincere.common.model.system.SysPermission;
  11 +import io.swagger.annotations.Api;
  12 +import io.swagger.annotations.ApiOperation;
  13 +import io.swagger.annotations.ApiParam;
  14 +import org.apache.commons.collections.MapUtils;
  15 +import org.slf4j.Logger;
  16 +import org.slf4j.LoggerFactory;
  17 +import org.springframework.beans.factory.annotation.Autowired;
  18 +import org.springframework.dao.DataAccessException;
  19 +import org.springframework.data.redis.connection.RedisConnection;
  20 +import org.springframework.data.redis.core.Cursor;
  21 +import org.springframework.data.redis.core.RedisCallback;
  22 +import org.springframework.data.redis.core.RedisTemplate;
  23 +import org.springframework.data.redis.core.ScanOptions;
  24 +import org.springframework.http.HttpStatus;
  25 +import org.springframework.security.authentication.AuthenticationManager;
  26 +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  27 +import org.springframework.security.core.Authentication;
  28 +import org.springframework.security.core.context.SecurityContextHolder;
  29 +import org.springframework.security.crypto.password.PasswordEncoder;
  30 +import org.springframework.security.oauth2.common.OAuth2AccessToken;
  31 +import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;
  32 +import org.springframework.security.oauth2.provider.*;
  33 +import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;
  34 +import org.springframework.security.oauth2.provider.client.ClientCredentialsTokenGranter;
  35 +import org.springframework.security.oauth2.provider.refresh.RefreshTokenGranter;
  36 +import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestFactory;
  37 +import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
  38 +import org.springframework.security.oauth2.provider.token.TokenStore;
  39 +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
  40 +import org.springframework.web.bind.annotation.PostMapping;
  41 +import org.springframework.web.bind.annotation.RequestMapping;
  42 +import org.springframework.web.bind.annotation.RequestParam;
  43 +import org.springframework.web.bind.annotation.RestController;
  44 +
  45 +import javax.annotation.Resource;
  46 +import javax.servlet.http.HttpServletRequest;
  47 +import javax.servlet.http.HttpServletResponse;
  48 +import java.io.IOException;
  49 +import java.util.*;
  50 +
  51 +/**
  52 + * @author 作者 owen E-mail: 624191343@qq.com
  53 + * @version 创建时间:2018年4月28日 下午2:18:54 类说明
  54 + */
  55 +
  56 +@Api(tags = "OAuth2相关操作")
  57 +@RestController
  58 +public class OAuth2Controller {
  59 +
  60 + private static final Logger logger = LoggerFactory.getLogger(OAuth2Controller.class);
  61 + @Resource
  62 + private ObjectMapper objectMapper; // springmvc启动时自动装配json处理类
  63 + @Autowired
  64 + private PasswordEncoder passwordEncoder;
  65 +
  66 + @Autowired
  67 + private TokenStore tokenStore;
  68 +
  69 + @Autowired
  70 + private RedisTemplate<String, Object> redisTemplate;
  71 +
  72 + @ApiOperation(value = "用户名密码获取token")
  73 + @PostMapping("/oauth/user/token")
  74 + public void getUserTokenInfo(
  75 + @ApiParam(required = true, name = "username", value = "账号") @RequestParam(value = "username") String username,
  76 + @ApiParam(required = true, name = "password", value = "密码") @RequestParam(value = "password") String password,
  77 + HttpServletRequest request, HttpServletResponse response) {
  78 + String clientId = request.getHeader("client_id");
  79 + String clientSecret = request.getHeader("client_secret");
  80 +
  81 + try {
  82 +
  83 + if (clientId == null || "".equals(clientId)) {
  84 + throw new UnapprovedClientAuthenticationException("请求头中无client_id信息");
  85 + }
  86 +
  87 + if (clientSecret == null || "".equals(clientSecret)) {
  88 + throw new UnapprovedClientAuthenticationException("请求头中无client_secret信息");
  89 + }
  90 +
  91 + RedisClientDetailsService clientDetailsService = SpringUtil.getBean(RedisClientDetailsService.class);
  92 +
  93 + ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);
  94 +
  95 + if (clientDetails == null) {
  96 + throw new UnapprovedClientAuthenticationException("clientId对应的信息不存在");
  97 + } else if (!passwordEncoder.matches(clientSecret, clientDetails.getClientSecret())) {
  98 + throw new UnapprovedClientAuthenticationException("clientSecret不匹配");
  99 + }
  100 +
  101 + TokenRequest tokenRequest = new TokenRequest(MapUtils.EMPTY_MAP, clientId, clientDetails.getScope(),
  102 + "customer");
  103 +
  104 + OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails);
  105 +
  106 + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
  107 +
  108 + AuthenticationManager authenticationManager = SpringUtil.getBean(AuthenticationManager.class);
  109 +
  110 + Authentication authentication = authenticationManager.authenticate(token);
  111 + SecurityContextHolder.getContext().setAuthentication(authentication);
  112 +
  113 + OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication);
  114 +
  115 + AuthorizationServerTokenServices authorizationServerTokenServices = SpringUtil
  116 + .getBean("defaultAuthorizationServerTokenServices", AuthorizationServerTokenServices.class);
  117 +
  118 + OAuth2AccessToken oAuth2AccessToken = authorizationServerTokenServices
  119 + .createAccessToken(oAuth2Authentication);
  120 +
  121 + oAuth2Authentication.setAuthenticated(true);
  122 +
  123 + response.setContentType("application/json;charset=UTF-8");
  124 + response.getWriter().write(objectMapper.writeValueAsString(oAuth2AccessToken));
  125 + response.getWriter().flush();
  126 + response.getWriter().close();
  127 +
  128 + } catch (Exception e) {
  129 +
  130 + response.setStatus(HttpStatus.UNAUTHORIZED.value());
  131 +
  132 + response.setContentType("application/json;charset=UTF-8");
  133 +
  134 + Map<String, String> rsp = new HashMap<>();
  135 + rsp.put("resp_code", HttpStatus.UNAUTHORIZED.value() + "");
  136 + rsp.put("rsp_msg", e.getMessage());
  137 +
  138 + try {
  139 + response.getWriter().write(objectMapper.writeValueAsString(rsp));
  140 + response.getWriter().flush();
  141 + response.getWriter().close();
  142 + } catch (JsonProcessingException e1) {
  143 + // TODO Auto-generated catch block
  144 + e1.printStackTrace();
  145 + } catch (IOException e1) {
  146 + // TODO Auto-generated catch block
  147 + e1.printStackTrace();
  148 + }
  149 +
  150 + }
  151 + }
  152 +
  153 +
  154 + @ApiOperation(value = "clientId获取token")
  155 + @PostMapping("/oauth/client/token")
  156 + @LogAnnotation(module = "autho", recordRequestParam = false)
  157 + public void getClientTokenInfo(HttpServletRequest request, HttpServletResponse response) {
  158 +
  159 + String clientId = request.getHeader("client_id");
  160 + String clientSecret = request.getHeader("client_secret");
  161 + try {
  162 +
  163 + if (clientId == null || "".equals(clientId)) {
  164 + throw new UnapprovedClientAuthenticationException("请求参数中无clientId信息");
  165 + }
  166 +
  167 + if (clientSecret == null || "".equals(clientSecret)) {
  168 + throw new UnapprovedClientAuthenticationException("请求参数中无clientSecret信息");
  169 + }
  170 +
  171 + RedisClientDetailsService clientDetailsService = SpringUtil.getBean(RedisClientDetailsService.class);
  172 +
  173 + ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);
  174 +
  175 + if (clientDetails == null) {
  176 + throw new UnapprovedClientAuthenticationException("clientId对应的信息不存在");
  177 + } else if (!passwordEncoder.matches(clientSecret, clientDetails.getClientSecret())) {
  178 + throw new UnapprovedClientAuthenticationException("clientSecret不匹配");
  179 + }
  180 +
  181 + Map<String, String> map = new HashMap<>();
  182 + map.put("client_secret", clientSecret);
  183 + map.put("client_id", clientId);
  184 + map.put("grant_type", "client_credentials");
  185 + TokenRequest tokenRequest = new TokenRequest(map, clientId, clientDetails.getScope(), "client_credentials");
  186 +
  187 + OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails);
  188 +
  189 + AuthorizationServerTokenServices authorizationServerTokenServices = SpringUtil
  190 + .getBean("defaultAuthorizationServerTokenServices", AuthorizationServerTokenServices.class);
  191 + OAuth2RequestFactory requestFactory = new DefaultOAuth2RequestFactory(clientDetailsService);
  192 + ClientCredentialsTokenGranter clientCredentialsTokenGranter = new ClientCredentialsTokenGranter(
  193 + authorizationServerTokenServices, clientDetailsService, requestFactory);
  194 +
  195 + clientCredentialsTokenGranter.setAllowRefresh(true);
  196 + OAuth2AccessToken oAuth2AccessToken = clientCredentialsTokenGranter.grant("client_credentials",
  197 + tokenRequest);
  198 +
  199 + response.setContentType("application/json;charset=UTF-8");
  200 + response.getWriter().write(objectMapper.writeValueAsString(oAuth2AccessToken));
  201 + response.getWriter().flush();
  202 + response.getWriter().close();
  203 +
  204 + } catch (Exception e) {
  205 +
  206 + response.setStatus(HttpStatus.UNAUTHORIZED.value());
  207 + response.setContentType("application/json;charset=UTF-8");
  208 + Map<String, String> rsp = new HashMap<>();
  209 + rsp.put("resp_code", HttpStatus.UNAUTHORIZED.value() + "");
  210 + rsp.put("rsp_msg", e.getMessage());
  211 +
  212 + try {
  213 + response.getWriter().write(objectMapper.writeValueAsString(rsp));
  214 + response.getWriter().flush();
  215 + response.getWriter().close();
  216 + } catch (JsonProcessingException e1) {
  217 + // TODO Auto-generated catch block
  218 + e1.printStackTrace();
  219 + } catch (IOException e1) {
  220 + // TODO Auto-generated catch block
  221 + e1.printStackTrace();
  222 + }
  223 +
  224 + }
  225 + }
  226 +
  227 + @ApiOperation(value = "access_token刷新token")
  228 + @PostMapping(value = "/oauth/refresh/token", params = "access_token")
  229 + public void refreshTokenInfo(String access_token, HttpServletRequest request, HttpServletResponse response) {
  230 +
  231 + // 拿到当前用户信息
  232 + try {
  233 + Authentication user = SecurityContextHolder.getContext().getAuthentication();
  234 +
  235 + if (user != null) {
  236 + if (user instanceof OAuth2Authentication) {
  237 + Authentication athentication = (Authentication) user;
  238 + OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) athentication.getDetails();
  239 + }
  240 +
  241 + }
  242 + OAuth2AccessToken accessToken = tokenStore.readAccessToken(access_token);
  243 + OAuth2Authentication auth = (OAuth2Authentication) user;
  244 + RedisClientDetailsService clientDetailsService = SpringUtil.getBean(RedisClientDetailsService.class);
  245 +
  246 + ClientDetails clientDetails = clientDetailsService
  247 + .loadClientByClientId(auth.getOAuth2Request().getClientId());
  248 +
  249 + AuthorizationServerTokenServices authorizationServerTokenServices = SpringUtil
  250 + .getBean("defaultAuthorizationServerTokenServices", AuthorizationServerTokenServices.class);
  251 + OAuth2RequestFactory requestFactory = new DefaultOAuth2RequestFactory(clientDetailsService);
  252 +
  253 + RefreshTokenGranter refreshTokenGranter = new RefreshTokenGranter(authorizationServerTokenServices,
  254 + clientDetailsService, requestFactory);
  255 +
  256 + Map<String, String> map = new HashMap<>();
  257 + map.put("grant_type", "refresh_token");
  258 + map.put("refresh_token", accessToken.getRefreshToken().getValue());
  259 + TokenRequest tokenRequest = new TokenRequest(map, auth.getOAuth2Request().getClientId(),
  260 + auth.getOAuth2Request().getScope(), "refresh_token");
  261 +
  262 + OAuth2AccessToken oAuth2AccessToken = refreshTokenGranter.grant("refresh_token", tokenRequest);
  263 +
  264 + tokenStore.removeAccessToken(accessToken);
  265 +
  266 + response.setContentType("application/json;charset=UTF-8");
  267 + response.getWriter().write(objectMapper.writeValueAsString(oAuth2AccessToken));
  268 + response.getWriter().flush();
  269 + response.getWriter().close();
  270 + } catch (Exception e) {
  271 + response.setStatus(HttpStatus.UNAUTHORIZED.value());
  272 + response.setContentType("application/json;charset=UTF-8");
  273 + Map<String, String> rsp = new HashMap<>();
  274 + rsp.put("resp_code", HttpStatus.UNAUTHORIZED.value() + "");
  275 + rsp.put("rsp_msg", e.getMessage());
  276 +
  277 + try {
  278 + response.getWriter().write(objectMapper.writeValueAsString(rsp));
  279 + response.getWriter().flush();
  280 + response.getWriter().close();
  281 + } catch (JsonProcessingException e1) {
  282 + // TODO Auto-generated catch block
  283 + e1.printStackTrace();
  284 + } catch (IOException e1) {
  285 + // TODO Auto-generated catch block
  286 + e1.printStackTrace();
  287 + }
  288 + }
  289 +
  290 + }
  291 +
  292 + /**
  293 + * 移除access_token和refresh_token
  294 + *
  295 + * @param access_token
  296 + */
  297 + @ApiOperation(value = "移除token")
  298 + @PostMapping(value = "/oauth/remove/token", params = "access_token")
  299 + public void removeToken(String access_token) {
  300 +
  301 + // 拿到当前用户信息
  302 + Authentication user = SecurityContextHolder.getContext().getAuthentication();
  303 +
  304 + if (user != null) {
  305 + if (user instanceof OAuth2Authentication) {
  306 + Authentication athentication = (Authentication) user;
  307 + OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) athentication.getDetails();
  308 + }
  309 +
  310 + }
  311 + OAuth2AccessToken accessToken = tokenStore.readAccessToken(access_token);
  312 + if (accessToken != null) {
  313 + // 移除access_token
  314 + tokenStore.removeAccessToken(accessToken);
  315 +
  316 + // 移除refresh_token
  317 + if (accessToken.getRefreshToken() != null) {
  318 + tokenStore.removeRefreshToken(accessToken.getRefreshToken());
  319 + }
  320 +
  321 + }
  322 + }
  323 +
  324 + @ApiOperation(value = "获取token信息")
  325 + @PostMapping(value = "/oauth/get/token", params = "access_token")
  326 + public OAuth2AccessToken getTokenInfo(String access_token) {
  327 +
  328 + // 拿到当前用户信息
  329 + Authentication user = SecurityContextHolder.getContext().getAuthentication();
  330 +
  331 + if (user != null) {
  332 + if (user instanceof OAuth2Authentication) {
  333 + Authentication athentication = (Authentication) user;
  334 + OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) athentication.getDetails();
  335 + }
  336 +
  337 + }
  338 + OAuth2AccessToken accessToken = tokenStore.readAccessToken(access_token);
  339 +
  340 + return accessToken;
  341 +
  342 + }
  343 +
  344 + /**
  345 + * 当前登陆用户信息
  346 + * security获取当前登录用户的方法是SecurityContextHolder.getContext().getAuthentication()
  347 + * 这里的实现类是org.springframework.security.oauth2.provider.OAuth2Authentication
  348 + *
  349 + * @return
  350 + */
  351 + @ApiOperation(value = "当前登陆用户信息")
  352 + @RequestMapping(value = { "/oauth/userinfo" }, produces = "application/json") // 获取用户信息。/auth/user
  353 + public Map<String, Object> getCurrentUserDetail() {
  354 + Map<String, Object> userInfo = new HashMap<>();
  355 + userInfo.put("user", SecurityContextHolder.getContext().getAuthentication().getPrincipal());
  356 + logger.debug("认证详细信息:" + SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString());
  357 +
  358 + List<SysPermission> permissions = new ArrayList<>();
  359 +
  360 + new ArrayList(SecurityContextHolder.getContext().getAuthentication().getAuthorities()).forEach(o -> {
  361 + SysPermission sysPermission = new SysPermission();
  362 + sysPermission.setPermission(o.toString());
  363 + permissions.add(sysPermission);
  364 + });
  365 + // userInfo.put("authorities",
  366 + // AuthorityUtils.authorityListToSet(SecurityContextHolder.getContext().getAuthentication().getAuthorities())
  367 + // );
  368 + userInfo.put("permissions", permissions);
  369 +
  370 + userInfo.put("resp_code", "200");
  371 +
  372 + logger.info("返回信息:{}", userInfo);
  373 +
  374 + return userInfo;
  375 + }
  376 +
  377 + @ApiOperation(value = "token列表")
  378 + @PostMapping("/oauth/token/list")
  379 + public PageResult<HashMap<String, String>> getUserTokenInfo(@RequestParam Map<String, Object> params)
  380 + throws Exception {
  381 + List<HashMap<String, String>> list = new ArrayList<>();
  382 +
  383 + Set<String> keys = redisTemplate.keys("access:" + "*") ;
  384 +// Object key1 = keys.toArray()[0];
  385 +// Object token1 = redisTemplate.opsForValue().get(key1);
  386 + //根据分页参数获取对应数据
  387 + // List<String> pages = findKeysForPage("access:" + "*", MapUtils.getInteger(params, "page"),MapUtils.getInteger(params, "limit"));
  388 +
  389 + for (Object key: keys.toArray()) {
  390 +// String key = page;
  391 +// String accessToken = StringUtils.substringAfter(key, "access:");
  392 +// OAuth2AccessToken token = tokenStore.readAccessToken(accessToken);
  393 + OAuth2AccessToken token = (OAuth2AccessToken)redisTemplate.opsForValue().get(key);
  394 + HashMap<String, String> map = new HashMap<String, String>();
  395 +
  396 + try {
  397 + map.put("token_type", token.getTokenType());
  398 + map.put("token_value", token.getValue());
  399 + map.put("expires_in", token.getExpiresIn()+"");
  400 + } catch (Exception e) {
  401 +
  402 + }
  403 +
  404 +
  405 + OAuth2Authentication oAuth2Auth = tokenStore.readAuthentication(token);
  406 + Authentication authentication = oAuth2Auth.getUserAuthentication();
  407 +
  408 + map.put("client_id", oAuth2Auth.getOAuth2Request().getClientId());
  409 + map.put("grant_type", oAuth2Auth.getOAuth2Request().getGrantType());
  410 +
  411 + if (authentication instanceof UsernamePasswordAuthenticationToken) {
  412 + UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) authentication;
  413 +
  414 + if(authenticationToken.getPrincipal() instanceof LoginAppUser ){
  415 + LoginAppUser user = (LoginAppUser) authenticationToken.getPrincipal();
  416 + map.put("user_id", user.getId()+"");
  417 + map.put("user_name", user.getUsername()+"");
  418 + map.put("user_head_imgurl", user.getHeadImgUrl()+"");
  419 + }
  420 +
  421 +
  422 + }else if (authentication instanceof PreAuthenticatedAuthenticationToken){
  423 + //刷新token方式
  424 + PreAuthenticatedAuthenticationToken authenticationToken = (PreAuthenticatedAuthenticationToken) authentication;
  425 + if(authenticationToken.getPrincipal() instanceof LoginAppUser ){
  426 + LoginAppUser user = (LoginAppUser) authenticationToken.getPrincipal();
  427 + map.put("user_id", user.getId()+"");
  428 + map.put("user_name", user.getUsername()+"");
  429 + map.put("user_head_imgurl", user.getHeadImgUrl()+"");
  430 + }
  431 +
  432 + }
  433 + list.add(map);
  434 +
  435 + }
  436 +
  437 +
  438 +
  439 + return PageResult.<HashMap<String, String>>builder().data(list).code(0).count((long) keys.size()).build();
  440 +
  441 + }
  442 +
  443 + public List<String> findKeysForPage(String patternKey, int pageNum, int pageSize) {
  444 +
  445 + Set<String> execute = redisTemplate.execute(new RedisCallback<Set<String>>() {
  446 +
  447 + @Override
  448 + public Set<String> doInRedis(RedisConnection connection) throws DataAccessException {
  449 +
  450 + Set<String> binaryKeys = new HashSet<>();
  451 +
  452 + Cursor<byte[]> cursor = connection
  453 + .scan(new ScanOptions.ScanOptionsBuilder().match(patternKey).count(1000).build());
  454 + int tmpIndex = 0;
  455 + int startIndex = (pageNum - 1) * pageSize;
  456 + int end = pageNum * pageSize;
  457 + while (cursor.hasNext()) {
  458 + if (tmpIndex >= startIndex && tmpIndex < end) {
  459 + binaryKeys.add(new String(cursor.next()));
  460 + tmpIndex++;
  461 + continue;
  462 + }
  463 +
  464 + // 获取到满足条件的数据后,就可以退出了
  465 + if (tmpIndex >= end) {
  466 + break;
  467 + }
  468 +
  469 + tmpIndex++;
  470 + cursor.next();
  471 + }
  472 + connection.close();
  473 + return binaryKeys;
  474 + }
  475 + });
  476 +
  477 + List<String> result = new ArrayList<String>(pageSize);
  478 + result.addAll(execute);
  479 + return result;
  480 + }
  481 +
  482 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/control/UserController.java 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +package com.sincere.autho.control;
  2 +
  3 +import org.springframework.web.bind.annotation.GetMapping;
  4 +import org.springframework.web.bind.annotation.RestController;
  5 +
  6 +import java.security.Principal;
  7 +
  8 +@RestController
  9 +public class UserController {
  10 +
  11 + @GetMapping("/user")
  12 + public Principal user(Principal user){
  13 + return user;
  14 + }
  15 +
  16 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/handler/ExceptionHandlerAdvice.java 0 → 100644
... ... @@ -0,0 +1,63 @@
  1 +package com.sincere.autho.handler;
  2 +
  3 +import io.grpc.StatusRuntimeException;
  4 +import org.springframework.http.HttpStatus;
  5 +import org.springframework.security.access.AccessDeniedException;
  6 +import org.springframework.web.bind.annotation.ExceptionHandler;
  7 +import org.springframework.web.bind.annotation.ResponseStatus;
  8 +import org.springframework.web.bind.annotation.RestControllerAdvice;
  9 +
  10 +import java.util.HashMap;
  11 +import java.util.Map;
  12 +
  13 +
  14 +/**
  15 + * @author 作者 owen E-mail: 624191343@qq.com
  16 + * @version 创建时间:2017年11月12日 上午22:57:51
  17 + * 异常通用处理
  18 +*/
  19 +@RestControllerAdvice
  20 +public class ExceptionHandlerAdvice {
  21 +
  22 + /**
  23 + * IllegalArgumentException异常处理返回json
  24 + * 状态码:400
  25 + * @param exception
  26 + * @return
  27 + */
  28 + @ExceptionHandler({ IllegalArgumentException.class })
  29 + @ResponseStatus(HttpStatus.BAD_REQUEST)
  30 + public Map<String, Object> badRequestException(IllegalArgumentException exception) {
  31 + Map<String, Object> data = new HashMap<>();
  32 + data.put("resp_code", HttpStatus.BAD_REQUEST.value());
  33 + data.put("resp_msg", exception.getMessage());
  34 +
  35 + return data;
  36 + }
  37 + /**
  38 + * AccessDeniedException异常处理返回json
  39 + * 状态码:403
  40 + * @param exception
  41 + * @return
  42 + */
  43 + @ExceptionHandler({ AccessDeniedException.class })
  44 + @ResponseStatus(HttpStatus.FORBIDDEN)
  45 + public Map<String, Object> badMethodExpressException(AccessDeniedException exception) {
  46 + Map<String, Object> data = new HashMap<>();
  47 + data.put("resp_code", HttpStatus.FORBIDDEN.value());
  48 + data.put("resp_msg", exception.getMessage());
  49 +
  50 + return data;
  51 + }
  52 + @ExceptionHandler({ StatusRuntimeException.class })
  53 + @ResponseStatus(HttpStatus.BAD_REQUEST)
  54 + public Map<String, Object> badRequestException(StatusRuntimeException exception) {
  55 + Map<String, Object> data = new HashMap<>();
  56 + data.put("resp_code", HttpStatus.INTERNAL_SERVER_ERROR.value());
  57 + data.put("resp_msg", exception.getMessage());
  58 +
  59 + return data;
  60 + }
  61 +
  62 +
  63 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/handler/OauthLogoutHandler.java 0 → 100644
... ... @@ -0,0 +1,90 @@
  1 +package com.sincere.autho.handler;
  2 +
  3 +import org.slf4j.Logger;
  4 +import org.slf4j.LoggerFactory;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.security.core.Authentication;
  7 +import org.springframework.security.oauth2.common.OAuth2AccessToken;
  8 +import org.springframework.security.oauth2.common.OAuth2RefreshToken;
  9 +import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;
  10 +import org.springframework.security.oauth2.provider.token.TokenStore;
  11 +import org.springframework.security.web.authentication.logout.LogoutHandler;
  12 +import org.springframework.util.Assert;
  13 +
  14 +import javax.servlet.http.HttpServletRequest;
  15 +import javax.servlet.http.HttpServletResponse;
  16 +import java.util.Enumeration;
  17 +
  18 +/**
  19 + * @author keets
  20 + * @date 2017/10/17
  21 + */
  22 +public class OauthLogoutHandler implements LogoutHandler {
  23 +
  24 + private static final Logger logger = LoggerFactory.getLogger(OauthLogoutHandler.class);
  25 +
  26 + @Autowired
  27 + private TokenStore tokenStore;
  28 +
  29 + @Override
  30 + public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
  31 + Assert.notNull(tokenStore, "tokenStore must be set");
  32 + String token = extractToken(request);
  33 + if(token!=null || !"".equals(token)){
  34 + OAuth2AccessToken existingAccessToken = tokenStore.readAccessToken(token);
  35 + OAuth2RefreshToken refreshToken;
  36 + if (existingAccessToken != null) {
  37 + if (existingAccessToken.getRefreshToken() != null) {
  38 + logger.info("remove refreshToken!", existingAccessToken.getRefreshToken());
  39 + refreshToken = existingAccessToken.getRefreshToken();
  40 + tokenStore.removeRefreshToken(refreshToken);
  41 + }
  42 + logger.info("remove existingAccessToken!", existingAccessToken);
  43 + tokenStore.removeAccessToken(existingAccessToken);
  44 + }
  45 + return;
  46 + }
  47 +
  48 + }
  49 +
  50 + protected String extractToken(HttpServletRequest request) {
  51 + // first check the header...
  52 + String token = extractHeaderToken(request);
  53 +
  54 + // bearer type allows a request parameter as well
  55 + if (token == null) {
  56 + logger.debug("Token not found in headers. Trying request parameters.");
  57 + token = request.getParameter(OAuth2AccessToken.ACCESS_TOKEN);
  58 + if (token == null) {
  59 + logger.debug("Token not found in request parameters. Not an OAuth2 request.");
  60 + } else {
  61 + request.setAttribute(OAuth2AuthenticationDetails.ACCESS_TOKEN_TYPE, OAuth2AccessToken.BEARER_TYPE);
  62 + }
  63 + }
  64 +
  65 + return token;
  66 + }
  67 +
  68 + protected String extractHeaderToken(HttpServletRequest request) {
  69 + Enumeration<String> headers = request.getHeaders("Authorization");
  70 + while (headers.hasMoreElements()) { // typically there is only one (most
  71 + // servers enforce that)
  72 + String value = headers.nextElement();
  73 + if ((value.toLowerCase().startsWith(OAuth2AccessToken.BEARER_TYPE.toLowerCase()))) {
  74 + String authHeaderValue = value.substring(OAuth2AccessToken.BEARER_TYPE.length()).trim();
  75 + // Add this here for the auth details later. Would be better to
  76 + // change the signature of this method.
  77 + request.setAttribute(OAuth2AuthenticationDetails.ACCESS_TOKEN_TYPE,
  78 + value.substring(0, OAuth2AccessToken.BEARER_TYPE.length()).trim());
  79 + int commaIndex = authHeaderValue.indexOf(',');
  80 + if (commaIndex > 0) {
  81 + authHeaderValue = authHeaderValue.substring(0, commaIndex);
  82 + }
  83 + return authHeaderValue;
  84 + }
  85 + }
  86 +
  87 + return null;
  88 + }
  89 +
  90 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/log/dao/LogDao.java 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +package com.sincere.autho.log.dao;
  2 +
  3 +import com.sincere.common.model.log.SysLog;
  4 +import org.apache.ibatis.annotations.Insert;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +@Mapper
  8 +public interface LogDao {
  9 +
  10 + @Insert("insert into sys_log(username, module, params, remark, flag, createTime) values(#{username}, #{module}, #{params}, #{remark}, #{flag}, #{createTime})")
  11 + int save(SysLog log);
  12 +
  13 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/log/service/LogService.java 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +package com.sincere.autho.log.service;
  2 +
  3 +
  4 +import com.sincere.common.model.log.SysLog;
  5 +
  6 +public interface LogService {
  7 +
  8 + void save(SysLog log);
  9 +
  10 +
  11 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/log/service/impl/LogServiceImpl.java 0 → 100644
... ... @@ -0,0 +1,34 @@
  1 +package com.sincere.autho.log.service.impl;
  2 +
  3 +import com.sincere.autho.annotation.datasource.DataSource;
  4 +import com.sincere.autho.log.dao.LogDao;
  5 +import com.sincere.autho.log.service.LogService;
  6 +import com.sincere.common.model.log.SysLog;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.scheduling.annotation.Async;
  9 +import org.springframework.stereotype.Service;
  10 +
  11 +import java.util.Date;
  12 +
  13 +@Service
  14 +public class LogServiceImpl implements LogService {
  15 +
  16 + @Autowired
  17 + private LogDao logDao;
  18 +
  19 + @Async
  20 + @Override
  21 + @DataSource(name="log")
  22 + public void save(SysLog log) {
  23 + if (log.getCreateTime() == null) {
  24 + log.setCreateTime(new Date());
  25 + }
  26 + if (log.getFlag() == null) {
  27 + log.setFlag(Boolean.TRUE);
  28 + }
  29 +
  30 + logDao.save(log);
  31 + }
  32 +
  33 +
  34 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/service/RedisAuthorizationCodeServices.java 0 → 100644
... ... @@ -0,0 +1,58 @@
  1 +package com.sincere.autho.service;
  2 +
  3 +import org.springframework.data.redis.core.RedisTemplate;
  4 +import org.springframework.security.oauth2.provider.OAuth2Authentication;
  5 +import org.springframework.security.oauth2.provider.code.RandomValueAuthorizationCodeServices;
  6 +
  7 +import java.util.concurrent.TimeUnit;
  8 +
  9 +/**
  10 + * JdbcAuthorizationCodeServices替换
  11 + */
  12 +public class RedisAuthorizationCodeServices extends RandomValueAuthorizationCodeServices {
  13 +
  14 + private RedisTemplate<String,Object> redisTemplate ;
  15 +
  16 +
  17 + public RedisTemplate<String, Object> getRedisTemplate() {
  18 + return redisTemplate;
  19 + }
  20 +
  21 + public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
  22 + this.redisTemplate = redisTemplate;
  23 + }
  24 +
  25 + /**
  26 + * 替换JdbcAuthorizationCodeServices的存储策略
  27 + * 将存储code到redis,并设置过期时间,10分钟<br>
  28 + */
  29 + @Override
  30 + protected void store(String code, OAuth2Authentication authentication) {
  31 +
  32 + redisTemplate.opsForValue().set(redisKey(code), authentication, 10, TimeUnit.MINUTES);
  33 +
  34 +
  35 + }
  36 +
  37 + @Override
  38 + protected OAuth2Authentication remove(final String code) {
  39 +
  40 + String codeKey =redisKey(code) ;
  41 +
  42 + OAuth2Authentication token = (OAuth2Authentication) redisTemplate.opsForValue().get(codeKey) ;
  43 +
  44 + this.redisTemplate.delete(codeKey);
  45 +
  46 + return token;
  47 + }
  48 +
  49 + /**
  50 + * redis中 code key的前缀
  51 + *
  52 + * @param code
  53 + * @return
  54 + */
  55 + private String redisKey(String code) {
  56 + return "oauth:code:" + code;
  57 + }
  58 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/service/RedisClientDetailsService.java 0 → 100644
... ... @@ -0,0 +1,153 @@
  1 +package com.sincere.autho.service;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import org.apache.commons.lang.StringUtils;
  5 +import org.slf4j.Logger;
  6 +import org.slf4j.LoggerFactory;
  7 +import org.springframework.data.redis.core.RedisTemplate;
  8 +import org.springframework.security.oauth2.common.exceptions.InvalidClientException;
  9 +import org.springframework.security.oauth2.provider.ClientDetails;
  10 +import org.springframework.security.oauth2.provider.NoSuchClientException;
  11 +import org.springframework.security.oauth2.provider.client.BaseClientDetails;
  12 +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService;
  13 +import org.springframework.util.CollectionUtils;
  14 +
  15 +import javax.sql.DataSource;
  16 +import java.util.List;
  17 +
  18 +
  19 +/**
  20 + * @author owen 624191343@qq.com
  21 + * @version 创建时间:2017年11月12日 上午22:57:51
  22 + * 类说明
  23 + * 将oauth_client_details表数据缓存到redis,这里做个缓存优化
  24 + * layui模块中有对oauth_client_details的crud, 注意同步redis的数据
  25 + * 注意对oauth_client_details清楚redis db部分数据的清空
  26 + */
  27 +
  28 +public class RedisClientDetailsService extends JdbcClientDetailsService {
  29 +
  30 +
  31 + // 扩展 默认的 ClientDetailsService, 增加逻辑删除判断( status = 1)
  32 + private static final String SELECT_CLIENT_DETAILS_SQL = "select client_id, client_secret, resource_ids, scope, authorized_grant_types, " +
  33 + "web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, autoapprove " +
  34 + "from oauth_client_details where client_id = ? and `status` = 1 ";
  35 +
  36 +
  37 + private static final String SELECT_FIND_STATEMENT = "select client_id, client_secret,resource_ids, scope, "
  38 + + "authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, "
  39 + + "refresh_token_validity, additional_information, autoapprove from oauth_client_details where `status` = 1 order by client_id " ;
  40 +
  41 + /**
  42 + * 缓存client的redis key,这里是hash结构存储
  43 + */
  44 + private static final String CACHE_CLIENT_KEY = "oauth_client_details";
  45 +
  46 + private Logger logger = LoggerFactory.getLogger(RedisClientDetailsService.class) ;
  47 +
  48 + private RedisTemplate<String,Object> redisTemplate ;
  49 +
  50 + public RedisTemplate<String, Object> getRedisTemplate() {
  51 + return redisTemplate;
  52 + }
  53 +
  54 + public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
  55 + this.redisTemplate = redisTemplate;
  56 + }
  57 +
  58 + public RedisClientDetailsService(DataSource dataSource) {
  59 + super(dataSource);
  60 + setSelectClientDetailsSql(SELECT_CLIENT_DETAILS_SQL) ;
  61 + setFindClientDetailsSql(SELECT_FIND_STATEMENT) ;
  62 + }
  63 +
  64 +
  65 +
  66 + @Override
  67 + public ClientDetails loadClientByClientId(String clientId) throws InvalidClientException {
  68 + ClientDetails clientDetails = null;
  69 +
  70 + // 先从redis获取
  71 + String value = (String) redisTemplate.boundHashOps(CACHE_CLIENT_KEY).get(clientId);
  72 + if (StringUtils.isBlank(value)) {
  73 + clientDetails = cacheAndGetClient(clientId);
  74 + } else {
  75 + clientDetails = JSONObject.parseObject(value, BaseClientDetails.class);
  76 + }
  77 +
  78 + return clientDetails;
  79 + }
  80 +
  81 + /**
  82 + * 缓存client并返回client
  83 + *
  84 + * @param clientId
  85 + * @return
  86 + */
  87 + private ClientDetails cacheAndGetClient(String clientId) {
  88 + // 从数据库读取
  89 + ClientDetails clientDetails = null ;
  90 + try {
  91 + clientDetails = super.loadClientByClientId(clientId);
  92 + if (clientDetails != null) {
  93 + // 写入redis缓存
  94 + redisTemplate.boundHashOps(CACHE_CLIENT_KEY).put(clientId, JSONObject.toJSONString(clientDetails));
  95 + logger.info("缓存clientId:{},{}", clientId, clientDetails);
  96 + }
  97 + }catch (NoSuchClientException e){
  98 + logger.info("clientId:{},{}", clientId, clientId );
  99 + }catch (InvalidClientException e) {
  100 + // TODO Auto-generated catch block
  101 + e.printStackTrace();
  102 + }
  103 +
  104 + return clientDetails;
  105 + }
  106 +
  107 + @Override
  108 + public void updateClientDetails(ClientDetails clientDetails) throws NoSuchClientException {
  109 + super.updateClientDetails(clientDetails);
  110 + cacheAndGetClient(clientDetails.getClientId());
  111 + }
  112 +
  113 + @Override
  114 + public void updateClientSecret(String clientId, String secret) throws NoSuchClientException {
  115 + super.updateClientSecret(clientId, secret);
  116 + cacheAndGetClient(clientId);
  117 + }
  118 +
  119 + @Override
  120 + public void removeClientDetails(String clientId) throws NoSuchClientException {
  121 + super.removeClientDetails(clientId);
  122 + removeRedisCache(clientId);
  123 + }
  124 +
  125 + /**
  126 + * 删除redis缓存
  127 + *
  128 + * @param clientId
  129 + */
  130 + private void removeRedisCache(String clientId) {
  131 + redisTemplate.boundHashOps(CACHE_CLIENT_KEY).delete(clientId);
  132 + }
  133 +
  134 + /**
  135 + * 将oauth_client_details全表刷入redis
  136 + */
  137 + public void loadAllClientToCache() {
  138 + if (redisTemplate.hasKey(CACHE_CLIENT_KEY)) {
  139 + return;
  140 + }
  141 + logger.info("将oauth_client_details全表刷入redis");
  142 +
  143 + List<ClientDetails> list = super.listClientDetails();
  144 + if (CollectionUtils.isEmpty(list)) {
  145 + logger.error("oauth_client_details表数据为空,请检查");
  146 + return;
  147 + }
  148 +
  149 + list.parallelStream().forEach(client -> {
  150 + redisTemplate.boundHashOps(CACHE_CLIENT_KEY).put(client.getClientId(), JSONObject.toJSONString(client));
  151 + });
  152 + }
  153 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/token/RedisTemplateTokenStore.java 0 → 100644
... ... @@ -0,0 +1,331 @@
  1 +package com.sincere.autho.token;
  2 +
  3 +import com.sincere.common.model.system.LoginAppUser;
  4 +import org.springframework.data.redis.core.RedisTemplate;
  5 +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  6 +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
  7 +import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken;
  8 +import org.springframework.security.oauth2.common.OAuth2AccessToken;
  9 +import org.springframework.security.oauth2.common.OAuth2RefreshToken;
  10 +import org.springframework.security.oauth2.provider.OAuth2Authentication;
  11 +import org.springframework.security.oauth2.provider.token.AuthenticationKeyGenerator;
  12 +import org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator;
  13 +import org.springframework.security.oauth2.provider.token.TokenStore;
  14 +
  15 +import java.time.Instant;
  16 +import java.time.LocalDateTime;
  17 +import java.time.ZoneId;
  18 +import java.util.*;
  19 +import java.util.concurrent.TimeUnit;
  20 +
  21 +/**
  22 + * @version redis集群存储token
  23 + */
  24 +
  25 +public class RedisTemplateTokenStore implements TokenStore {
  26 +
  27 + private static final String ACCESS = "access:";
  28 + private static final String AUTH_TO_ACCESS = "auth_to_access:";
  29 + private static final String AUTH = "auth:";
  30 + private static final String REFRESH_AUTH = "refresh_auth:";
  31 + private static final String ACCESS_TO_REFRESH = "access_to_refresh:";
  32 + private static final String REFRESH = "refresh:";
  33 + private static final String REFRESH_TO_ACCESS = "refresh_to_access:";
  34 + private static final String CLIENT_ID_TO_ACCESS = "client_id_to_access:";
  35 + private static final String UNAME_TO_ACCESS = "uname_to_access:";
  36 + private static final String TOKEN = "token:";
  37 +
  38 + private RedisTemplate<String, Object> redisTemplate;
  39 +
  40 + public RedisTemplate<String, Object> getRedisTemplate() {
  41 + return redisTemplate;
  42 + }
  43 +
  44 + public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
  45 + this.redisTemplate = redisTemplate;
  46 + }
  47 +
  48 + private AuthenticationKeyGenerator authenticationKeyGenerator = new DefaultAuthenticationKeyGenerator();
  49 +
  50 + public void setAuthenticationKeyGenerator(AuthenticationKeyGenerator authenticationKeyGenerator) {
  51 + this.authenticationKeyGenerator = authenticationKeyGenerator;
  52 + }
  53 +
  54 + public OAuth2AccessToken getAccessToken(OAuth2Authentication authentication) {
  55 + String key = authenticationKeyGenerator.extractKey(authentication);
  56 + OAuth2AccessToken accessToken = (OAuth2AccessToken) redisTemplate.opsForValue().get(AUTH_TO_ACCESS + key);
  57 + if (accessToken != null
  58 + && !key.equals(authenticationKeyGenerator.extractKey(readAuthentication(accessToken.getValue())))) {
  59 + // Keep the stores consistent (maybe the same user is represented by
  60 + // this authentication but the details
  61 + // have changed)
  62 + storeAccessToken(accessToken, authentication);
  63 + }
  64 + return accessToken;
  65 + }
  66 +
  67 + public OAuth2Authentication readAuthentication(OAuth2AccessToken token) {
  68 + return readAuthentication(token.getValue());
  69 + }
  70 +
  71 + public OAuth2Authentication readAuthentication(String token) {
  72 + return (OAuth2Authentication) this.redisTemplate.opsForValue().get(AUTH + token);
  73 + }
  74 +
  75 + public OAuth2Authentication readAuthenticationForRefreshToken(OAuth2RefreshToken token) {
  76 + return readAuthenticationForRefreshToken(token.getValue());
  77 + }
  78 +
  79 + public OAuth2Authentication readAuthenticationForRefreshToken(String token) {
  80 + return (OAuth2Authentication) this.redisTemplate.opsForValue().get(REFRESH_AUTH + token);
  81 + }
  82 +
  83 + public void storeAccessToken(OAuth2AccessToken token, OAuth2Authentication authentication) {
  84 +
  85 + OAuth2AccessToken existingAccessToken = this.getAccessToken(authentication);
  86 +
  87 + this.redisTemplate.opsForValue().set(ACCESS + token.getValue(), token);
  88 + this.redisTemplate.opsForValue().set(AUTH + token.getValue(), authentication);
  89 + this.redisTemplate.opsForValue().set(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication),
  90 + token);
  91 +
  92 + Map<String, Object> params = new HashMap<>();
  93 +
  94 + params.put("clientId", authentication.getOAuth2Request().getClientId());
  95 +
  96 + if (authentication.getUserAuthentication() instanceof UsernamePasswordAuthenticationToken) {
  97 + UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) authentication
  98 + .getUserAuthentication();
  99 + LoginAppUser appUser = (LoginAppUser) authenticationToken.getPrincipal();
  100 + params.put("username", appUser.getUsername());
  101 + params.put("authorities", appUser.getAuthorities());
  102 + }
  103 +
  104 + if (!params.isEmpty()) {
  105 + this.redisTemplate.opsForValue().set(TOKEN + token.getValue(), params);
  106 + }
  107 +
  108 + if (!authentication.isClientOnly()) {
  109 + if (existingAccessToken != null) {
  110 + if (!existingAccessToken.isExpired()) {
  111 + int seconds = token.getExpiresIn();
  112 + redisTemplate.expire(UNAME_TO_ACCESS + authentication.getOAuth2Request().getClientId(), seconds,
  113 + TimeUnit.SECONDS);
  114 + } else {
  115 + redisTemplate.opsForList().rightPush(UNAME_TO_ACCESS + getApprovalKey(authentication), token);
  116 + }
  117 + } else {
  118 + redisTemplate.opsForList().rightPush(UNAME_TO_ACCESS + getApprovalKey(authentication), token);
  119 + }
  120 +
  121 + }
  122 +
  123 + if (existingAccessToken != null) {
  124 + if (!existingAccessToken.isExpired()) {
  125 + int seconds = token.getExpiresIn();
  126 + redisTemplate.expire(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(), seconds,
  127 + TimeUnit.SECONDS);
  128 +
  129 + } else {
  130 + redisTemplate.opsForList()
  131 + .rightPush(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(), token);
  132 + }
  133 + } else {
  134 + redisTemplate.opsForList().rightPush(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(),
  135 + token);
  136 + }
  137 +
  138 + if (token.getExpiration() != null) {
  139 +
  140 + int seconds = token.getExpiresIn();
  141 + redisTemplate.expire(ACCESS + token.getValue(), seconds, TimeUnit.SECONDS);
  142 + redisTemplate.expire(AUTH + token.getValue(), seconds, TimeUnit.SECONDS);
  143 + redisTemplate.expire(TOKEN + token.getValue(), seconds, TimeUnit.SECONDS);
  144 + redisTemplate.expire(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication), seconds,
  145 + TimeUnit.SECONDS);
  146 + redisTemplate.expire(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(), seconds,
  147 + TimeUnit.SECONDS);
  148 + redisTemplate.expire(UNAME_TO_ACCESS + getApprovalKey(authentication), seconds, TimeUnit.SECONDS);
  149 + }
  150 +
  151 + OAuth2RefreshToken refreshToken = token.getRefreshToken();
  152 +
  153 + if (token.getRefreshToken() != null && token.getRefreshToken().getValue() != null) {
  154 + this.redisTemplate.opsForValue().set(REFRESH_TO_ACCESS + token.getRefreshToken().getValue(),
  155 + token.getValue());
  156 + this.redisTemplate.opsForValue().set(ACCESS_TO_REFRESH + token.getValue(),
  157 + token.getRefreshToken().getValue());
  158 +
  159 + if (refreshToken instanceof ExpiringOAuth2RefreshToken) {
  160 + ExpiringOAuth2RefreshToken expiringRefreshToken = (ExpiringOAuth2RefreshToken) refreshToken;
  161 + Date expiration = expiringRefreshToken.getExpiration();
  162 + if (expiration != null) {
  163 + int seconds = Long.valueOf((expiration.getTime() - System.currentTimeMillis()) / 1000L).intValue();
  164 +
  165 + redisTemplate.expire(REFRESH_TO_ACCESS + token.getRefreshToken().getValue(), seconds,
  166 + TimeUnit.SECONDS);
  167 + redisTemplate.expire(ACCESS_TO_REFRESH + token.getValue(), seconds, TimeUnit.SECONDS);
  168 +
  169 + }
  170 + }
  171 +
  172 + }
  173 + }
  174 +
  175 + private String getApprovalKey(OAuth2Authentication authentication) {
  176 + String userName = authentication.getUserAuthentication() == null ? ""
  177 + : authentication.getUserAuthentication().getName();
  178 + return getApprovalKey(authentication.getOAuth2Request().getClientId(), userName);
  179 + }
  180 +
  181 + private String getApprovalKey(String clientId, String userName) {
  182 + return clientId + (userName == null ? "" : ":" + userName);
  183 + }
  184 +
  185 + public void removeAccessToken(OAuth2AccessToken accessToken) {
  186 + removeAccessToken(accessToken.getValue());
  187 + }
  188 +
  189 + public OAuth2AccessToken readAccessToken(String tokenValue) {
  190 +
  191 + OAuth2Authentication oauth2Authentication = (OAuth2Authentication) this.redisTemplate.opsForValue()
  192 + .get(AUTH + tokenValue);
  193 + OAuth2AccessToken oauth2AccessToken = (OAuth2AccessToken) this.redisTemplate.opsForValue()
  194 + .get(ACCESS + tokenValue);
  195 + if (oauth2Authentication != null) {
  196 + String auth_to_access = authenticationKeyGenerator.extractKey(oauth2Authentication);
  197 + if (oauth2AccessToken != null) {
  198 + if (oauth2AccessToken.getExpiresIn() < 180) {
  199 +
  200 + if (oauth2AccessToken instanceof DefaultOAuth2AccessToken) {
  201 + DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) oauth2AccessToken;
  202 +// Calendar cal = Calendar.getInstance();
  203 +// cal.add(Calendar.DATE, 30);
  204 +// Date date = cal.getTime();
  205 + /**
  206 + * 自动续费 30分钟
  207 + */
  208 + LocalDateTime t1 = LocalDateTime.now().plusMinutes(30);
  209 + ZoneId zone = ZoneId.systemDefault();
  210 + Instant instant = t1.atZone(zone).toInstant();
  211 + Date date = Date.from(instant);
  212 +
  213 + token.setExpiration(date);
  214 +
  215 + int seconds = token.getExpiresIn();
  216 +
  217 + this.redisTemplate.opsForValue().set(AUTH_TO_ACCESS + auth_to_access, token, seconds,
  218 + TimeUnit.SECONDS);
  219 + this.redisTemplate.opsForValue().set(ACCESS + token.getValue(), token, seconds,
  220 + TimeUnit.SECONDS);
  221 +
  222 + redisTemplate.expire(AUTH + token.getValue(), seconds, TimeUnit.SECONDS);
  223 + redisTemplate.expire(TOKEN + token.getValue(), seconds, TimeUnit.SECONDS);
  224 +
  225 + redisTemplate.expire(
  226 + CLIENT_ID_TO_ACCESS + oauth2Authentication.getOAuth2Request().getClientId(), seconds,
  227 + TimeUnit.SECONDS);
  228 + redisTemplate.expire(UNAME_TO_ACCESS + getApprovalKey(oauth2Authentication), seconds,
  229 + TimeUnit.SECONDS);
  230 +
  231 + }
  232 +
  233 + }
  234 + }
  235 + }
  236 +
  237 + return oauth2AccessToken;
  238 + }
  239 +
  240 + public void removeAccessToken(String tokenValue) {
  241 + OAuth2AccessToken removed = (OAuth2AccessToken) redisTemplate.opsForValue().get(ACCESS + tokenValue);
  242 + // Don't remove the refresh token - it's up to the caller to do that
  243 + OAuth2Authentication authentication = (OAuth2Authentication) this.redisTemplate.opsForValue()
  244 + .get(AUTH + tokenValue);
  245 +
  246 + this.redisTemplate.delete(AUTH + tokenValue);
  247 + redisTemplate.delete(ACCESS + tokenValue);
  248 + redisTemplate.delete(TOKEN + tokenValue);
  249 + this.redisTemplate.delete(ACCESS_TO_REFRESH + tokenValue);
  250 +
  251 + if (authentication != null) {
  252 + this.redisTemplate.delete(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication));
  253 +
  254 + String clientId = authentication.getOAuth2Request().getClientId();
  255 +
  256 + // redisTemplate.opsForList().rightPush("UNAME_TO_ACCESS:"+getApprovalKey(authentication),
  257 + // token) ;
  258 + redisTemplate.opsForList().leftPop(UNAME_TO_ACCESS + getApprovalKey(clientId, authentication.getName()));
  259 +
  260 + redisTemplate.opsForList().leftPop(CLIENT_ID_TO_ACCESS + clientId);
  261 +
  262 + this.redisTemplate.delete(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication));
  263 + }
  264 + }
  265 +
  266 + public void storeRefreshToken(OAuth2RefreshToken refreshToken, OAuth2Authentication authentication) {
  267 + this.redisTemplate.opsForValue().set(REFRESH + refreshToken.getValue(), refreshToken);
  268 + this.redisTemplate.opsForValue().set(REFRESH_AUTH + refreshToken.getValue(), authentication);
  269 + }
  270 +
  271 + public OAuth2RefreshToken readRefreshToken(String tokenValue) {
  272 + return (OAuth2RefreshToken) this.redisTemplate.opsForValue().get(REFRESH + tokenValue);
  273 + }
  274 +
  275 + public void removeRefreshToken(OAuth2RefreshToken refreshToken) {
  276 + removeRefreshToken(refreshToken.getValue());
  277 + }
  278 +
  279 + public void removeRefreshToken(String tokenValue) {
  280 + this.redisTemplate.delete(REFRESH + tokenValue);
  281 + this.redisTemplate.delete(REFRESH_AUTH + tokenValue);
  282 + this.redisTemplate.delete(REFRESH_TO_ACCESS + tokenValue);
  283 + }
  284 +
  285 + public void removeAccessTokenUsingRefreshToken(OAuth2RefreshToken refreshToken) {
  286 + removeAccessTokenUsingRefreshToken(refreshToken.getValue());
  287 + }
  288 +
  289 + private void removeAccessTokenUsingRefreshToken(String refreshToken) {
  290 +
  291 + String token = (String) this.redisTemplate.opsForValue().get(REFRESH_TO_ACCESS + refreshToken);
  292 +
  293 + if (token != null) {
  294 + redisTemplate.delete(REFRESH_TO_ACCESS + refreshToken);
  295 + }
  296 + }
  297 +
  298 + public Collection<OAuth2AccessToken> findTokensByClientIdAndUserName(String clientId, String userName) {
  299 + List<Object> result = redisTemplate.opsForList().range(UNAME_TO_ACCESS + getApprovalKey(clientId, userName), 0,
  300 + -1);
  301 +
  302 + if (result == null || result.size() == 0) {
  303 + return Collections.<OAuth2AccessToken>emptySet();
  304 + }
  305 + List<OAuth2AccessToken> accessTokens = new ArrayList<OAuth2AccessToken>(result.size());
  306 +
  307 + for (Iterator<Object> it = result.iterator(); it.hasNext();) {
  308 + OAuth2AccessToken accessToken = (OAuth2AccessToken) it.next();
  309 + accessTokens.add(accessToken);
  310 + }
  311 +
  312 + return Collections.<OAuth2AccessToken>unmodifiableCollection(accessTokens);
  313 + }
  314 +
  315 + public Collection<OAuth2AccessToken> findTokensByClientId(String clientId) {
  316 + List<Object> result = redisTemplate.opsForList().range((CLIENT_ID_TO_ACCESS + clientId), 0, -1);
  317 +
  318 + if (result == null || result.size() == 0) {
  319 + return Collections.<OAuth2AccessToken>emptySet();
  320 + }
  321 + List<OAuth2AccessToken> accessTokens = new ArrayList<OAuth2AccessToken>(result.size());
  322 +
  323 + for (Iterator<Object> it = result.iterator(); it.hasNext();) {
  324 + OAuth2AccessToken accessToken = (OAuth2AccessToken) it.next();
  325 + accessTokens.add(accessToken);
  326 + }
  327 +
  328 + return Collections.<OAuth2AccessToken>unmodifiableCollection(accessTokens);
  329 + }
  330 +
  331 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/utils/SpringUtil.java 0 → 100644
... ... @@ -0,0 +1,35 @@
  1 +package com.sincere.autho.utils;
  2 +
  3 +import org.springframework.beans.BeansException;
  4 +import org.springframework.context.ApplicationContext;
  5 +import org.springframework.context.ApplicationContextAware;
  6 +import org.springframework.core.env.Environment;
  7 +import org.springframework.stereotype.Component;
  8 +
  9 +/**
  10 + * spring获取bean工具类
  11 + *
  12 + *
  13 + */
  14 +@Component
  15 +public class SpringUtil implements ApplicationContextAware {
  16 +
  17 + private static ApplicationContext applicationContext = null;
  18 +
  19 + @Override
  20 + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  21 + SpringUtil.applicationContext = applicationContext;
  22 + }
  23 +
  24 + public static <T> T getBean(Class<T> cla) {
  25 + return applicationContext.getBean(cla);
  26 + }
  27 +
  28 + public static <T> T getBean(String name, Class<T> cal) {
  29 + return applicationContext.getBean(name, cal);
  30 + }
  31 +
  32 + public static String getProperty(String key) {
  33 + return applicationContext.getBean(Environment.class).getProperty(key);
  34 + }
  35 +}
... ...
cloud/autho/src/main/java/com/sincere/autho/utils/SysUserUtil.java 0 → 100644
... ... @@ -0,0 +1,41 @@
  1 +package com.sincere.autho.utils;
  2 +
  3 +import com.sincere.common.model.system.LoginAppUser;
  4 +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  5 +import org.springframework.security.core.Authentication;
  6 +import org.springframework.security.core.context.SecurityContextHolder;
  7 +import org.springframework.security.oauth2.provider.OAuth2Authentication;
  8 +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
  9 +
  10 +/**
  11 + * @author 作者 owen E-mail: 624191343@qq.com
  12 + * @version 创建时间:2017年11月12日 上午22:57:51 获取用户信息
  13 + */
  14 +public class SysUserUtil {
  15 +
  16 + /**
  17 + * 获取登陆的 LoginAppUser
  18 + *
  19 + * @return
  20 + */
  21 + @SuppressWarnings("rawtypes")
  22 + public static LoginAppUser getLoginAppUser() {
  23 + Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
  24 + if (authentication instanceof OAuth2Authentication) {
  25 + OAuth2Authentication oAuth2Auth = (OAuth2Authentication) authentication;
  26 + authentication = oAuth2Auth.getUserAuthentication();
  27 +
  28 + if (authentication instanceof UsernamePasswordAuthenticationToken) {
  29 + UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) authentication;
  30 + return (LoginAppUser) authenticationToken.getPrincipal();
  31 + } else if (authentication instanceof PreAuthenticatedAuthenticationToken) {
  32 + // 刷新token方式
  33 + PreAuthenticatedAuthenticationToken authenticationToken = (PreAuthenticatedAuthenticationToken) authentication;
  34 + return (LoginAppUser) authenticationToken.getPrincipal();
  35 +
  36 + }
  37 + }
  38 +
  39 + return null;
  40 + }
  41 +}
... ...
cloud/autho/src/main/resources/application.yaml 0 → 100644
... ... @@ -0,0 +1,96 @@
  1 +server:
  2 + port: 8763
  3 +
  4 +spring:
  5 + application:
  6 + name: auth-server
  7 +session:
  8 + store-type: redis
  9 + datasource:
  10 + dynamic:
  11 + enable: true
  12 + druid:
  13 + # JDBC 配置(驱动类自动从url的mysql识别,数据源类型自动识别)
  14 + core:
  15 + url: jdbc:mysql://localhost/oauth-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
  16 + username: root
  17 + password: root
  18 + driver-class-name: com.mysql.jdbc.Driver
  19 + log:
  20 + url: jdbc:mysql://59.110.164.254:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
  21 + username: root
  22 + password: root
  23 + driver-class-name: com.mysql.jdbc.Driver
  24 + #连接池配置(通常来说,只需要修改initialSize、minIdle、maxActive
  25 + initial-size: 1
  26 + max-active: 20
  27 + min-idle: 1
  28 + # 配置获取连接等待超时的时间
  29 + max-wait: 60000
  30 + #打开PSCache,并且指定每个连接上PSCache的大小
  31 + pool-prepared-statements: true
  32 + max-pool-prepared-statement-per-connection-size: 20
  33 + validation-query: SELECT 'x'
  34 + test-on-borrow: false
  35 + test-on-return: false
  36 + test-while-idle: true
  37 + #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  38 + time-between-eviction-runs-millis: 60000
  39 + #配置一个连接在池中最小生存的时间,单位是毫秒
  40 + min-evictable-idle-time-millis: 300000
  41 + filters: stat,wall
  42 + # WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
  43 + #是否启用StatFilter默认值true
  44 + web-stat-filter.enabled: true
  45 + web-stat-filter.url-pattern: /*
  46 + web-stat-filter.exclusions: "*.js , *.gif ,*.jpg ,*.png ,*.css ,*.ico , /druid/*"
  47 + web-stat-filter.session-stat-max-count: 1000
  48 + web-stat-filter.profile-enable: true
  49 + # StatViewServlet配置
  50 + #展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
  51 + #是否启用StatViewServlet默认值true
  52 + stat-view-servlet.enabled: true
  53 + #根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如:
  54 + #http://110.76.43.235:9000/druid/index.html
  55 + #http://110.76.43.235:8080/mini-web/druid/index.html
  56 + stat-view-servlet.url-pattern: /druid/*
  57 + #允许清空统计数据
  58 + stat-view-servlet.reset-enable: true
  59 + stat-view-servlet.login-username: admin
  60 + stat-view-servlet.login-password: admin
  61 + #StatViewSerlvet展示出来的监控信息比较敏感,是系统运行的内部情况,如果你需要做访问控制,可以配置allow和deny这两个参数
  62 + #deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝。如果allow没有配置或者为空,则允许所有访问
  63 + #配置的格式
  64 + #<IP>
  65 + #或者<IP>/<SUB_NET_MASK_size>其中128.242.127.1/24
  66 + #24表示,前面24位是子网掩码,比对的时候,前面24位相同就匹配,不支持IPV6。
  67 + #stat-view-servlet.allow=
  68 + #stat-view-servlet.deny=128.242.127.1/24,128.242.128.1
  69 + # Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
  70 + #aop-patterns= # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
  71 +################### mysq end ##########################
  72 +
  73 +
  74 +eureka:
  75 + instance:
  76 + hostname: localhost
  77 + lease-expiration-duration-in-seconds: 60
  78 + lease-renewal-interval-in-seconds: 10
  79 + client:
  80 + service-url:
  81 + defaultZone: http://121.40.109.21:8761/eureka/,http://121.40.109.21:8762/eureka/
  82 +
  83 +
  84 + redis:
  85 + ################### redis 单机版 start ##########################
  86 + host: localhost
  87 + port: 6379
  88 + timeout: 6000
  89 + database: 2
  90 + lettuce:
  91 + pool:
  92 + max-active: 10 # 连接池最大连接数(使用负值表示没有限制),如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
  93 + max-idle: 8 # 连接池中的最大空闲连接 ,默认值也是8
  94 + max-wait: 100 # # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
  95 + min-idle: 2 # 连接池中的最小空闲连接 ,默认值也是0
  96 + shutdown-timeout: 100ms
0 97 \ No newline at end of file
... ...
cloud/autho/src/test/java/com/sincere/autho/AuthoApplicationTests.java 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +package com.sincere.autho;
  2 +
  3 +import org.junit.Test;
  4 +import org.junit.runner.RunWith;
  5 +import org.springframework.boot.test.context.SpringBootTest;
  6 +import org.springframework.test.context.junit4.SpringRunner;
  7 +
  8 +@RunWith(SpringRunner.class)
  9 +@SpringBootTest
  10 +public class AuthoApplicationTests {
  11 +
  12 + @Test
  13 + public void contextLoads() {
  14 + }
  15 +
  16 +}
... ...
cloud/cloud-server/.gitignore
... ... @@ -1,31 +0,0 @@
1   -HELP.md
2   -target/
3   -!.mvn/wrapper/maven-wrapper.jar
4   -!**/src/main/**
5   -!**/src/test/**
6   -
7   -### STS ###
8   -.apt_generated
9   -.classpath
10   -.factorypath
11   -.project
12   -.settings
13   -.springBeans
14   -.sts4-cache
15   -
16   -### IntelliJ IDEA ###
17   -.idea
18   -*.iws
19   -*.iml
20   -*.ipr
21   -
22   -### NetBeans ###
23   -/nbproject/private/
24   -/nbbuild/
25   -/dist/
26   -/nbdist/
27   -/.nb-gradle/
28   -build/
29   -
30   -### VS Code ###
31   -.vscode/
cloud/cloud-server/.mvn/wrapper/MavenWrapperDownloader.java
... ... @@ -1,114 +0,0 @@
1   -/*
2   -Licensed to the Apache Software Foundation (ASF) under one
3   -or more contributor license agreements. See the NOTICE file
4   -distributed with this work for additional information
5   -regarding copyright ownership. The ASF licenses this file
6   -to you under the Apache License, Version 2.0 (the
7   -"License"); you may not use this file except in compliance
8   -with the License. You may obtain a copy of the License at
9   -
10   - https://www.apache.org/licenses/LICENSE-2.0
11   -
12   -Unless required by applicable law or agreed to in writing,
13   -software distributed under the License is distributed on an
14   -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   -KIND, either express or implied. See the License for the
16   -specific language governing permissions and limitations
17   -under the License.
18   -*/
19   -
20   -import java.io.File;
21   -import java.io.FileInputStream;
22   -import java.io.FileOutputStream;
23   -import java.io.IOException;
24   -import java.net.URL;
25   -import java.nio.channels.Channels;
26   -import java.nio.channels.ReadableByteChannel;
27   -import java.util.Properties;
28   -
29   -public class MavenWrapperDownloader {
30   -
31   - /**
32   - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
33   - */
34   - private static final String DEFAULT_DOWNLOAD_URL =
35   - "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
36   -
37   - /**
38   - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
39   - * use instead of the default one.
40   - */
41   - private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
42   - ".mvn/wrapper/maven-wrapper.properties";
43   -
44   - /**
45   - * Path where the maven-wrapper.jar will be saved to.
46   - */
47   - private static final String MAVEN_WRAPPER_JAR_PATH =
48   - ".mvn/wrapper/maven-wrapper.jar";
49   -
50   - /**
51   - * Name of the property which should be used to override the default download url for the wrapper.
52   - */
53   - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
54   -
55   - public static void main(String args[]) {
56   - System.out.println("- Downloader started");
57   - File baseDirectory = new File(args[0]);
58   - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
59   -
60   - // If the maven-wrapper.properties exists, read it and check if it contains a custom
61   - // wrapperUrl parameter.
62   - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
63   - String url = DEFAULT_DOWNLOAD_URL;
64   - if (mavenWrapperPropertyFile.exists()) {
65   - FileInputStream mavenWrapperPropertyFileInputStream = null;
66   - try {
67   - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
68   - Properties mavenWrapperProperties = new Properties();
69   - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
70   - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
71   - } catch (IOException e) {
72   - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
73   - } finally {
74   - try {
75   - if (mavenWrapperPropertyFileInputStream != null) {
76   - mavenWrapperPropertyFileInputStream.close();
77   - }
78   - } catch (IOException e) {
79   - // Ignore ...
80   - }
81   - }
82   - }
83   - System.out.println("- Downloading from: : " + url);
84   -
85   - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
86   - if (!outputFile.getParentFile().exists()) {
87   - if (!outputFile.getParentFile().mkdirs()) {
88   - System.out.println(
89   - "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
90   - }
91   - }
92   - System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
93   - try {
94   - downloadFileFromURL(url, outputFile);
95   - System.out.println("Done");
96   - System.exit(0);
97   - } catch (Throwable e) {
98   - System.out.println("- Error downloading");
99   - e.printStackTrace();
100   - System.exit(1);
101   - }
102   - }
103   -
104   - private static void downloadFileFromURL(String urlString, File destination) throws Exception {
105   - URL website = new URL(urlString);
106   - ReadableByteChannel rbc;
107   - rbc = Channels.newChannel(website.openStream());
108   - FileOutputStream fos = new FileOutputStream(destination);
109   - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
110   - fos.close();
111   - rbc.close();
112   - }
113   -
114   -}
cloud/cloud-server/.mvn/wrapper/maven-wrapper.jar
No preview for this file type
cloud/cloud-server/.mvn/wrapper/maven-wrapper.properties
... ... @@ -1 +0,0 @@
1   -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
cloud/cloud-server/mvnw
... ... @@ -1,286 +0,0 @@
1   -#!/bin/sh
2   -# ----------------------------------------------------------------------------
3   -# Licensed to the Apache Software Foundation (ASF) under one
4   -# or more contributor license agreements. See the NOTICE file
5   -# distributed with this work for additional information
6   -# regarding copyright ownership. The ASF licenses this file
7   -# to you under the Apache License, Version 2.0 (the
8   -# "License"); you may not use this file except in compliance
9   -# with the License. You may obtain a copy of the License at
10   -#
11   -# https://www.apache.org/licenses/LICENSE-2.0
12   -#
13   -# Unless required by applicable law or agreed to in writing,
14   -# software distributed under the License is distributed on an
15   -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   -# KIND, either express or implied. See the License for the
17   -# specific language governing permissions and limitations
18   -# under the License.
19   -# ----------------------------------------------------------------------------
20   -
21   -# ----------------------------------------------------------------------------
22   -# Maven2 Start Up Batch script
23   -#
24   -# Required ENV vars:
25   -# ------------------
26   -# JAVA_HOME - location of a JDK home dir
27   -#
28   -# Optional ENV vars
29   -# -----------------
30   -# M2_HOME - location of maven2's installed home dir
31   -# MAVEN_OPTS - parameters passed to the Java VM when running Maven
32   -# e.g. to debug Maven itself, use
33   -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
34   -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
35   -# ----------------------------------------------------------------------------
36   -
37   -if [ -z "$MAVEN_SKIP_RC" ] ; then
38   -
39   - if [ -f /etc/mavenrc ] ; then
40   - . /etc/mavenrc
41   - fi
42   -
43   - if [ -f "$HOME/.mavenrc" ] ; then
44   - . "$HOME/.mavenrc"
45   - fi
46   -
47   -fi
48   -
49   -# OS specific support. $var _must_ be set to either true or false.
50   -cygwin=false;
51   -darwin=false;
52   -mingw=false
53   -case "`uname`" in
54   - CYGWIN*) cygwin=true ;;
55   - MINGW*) mingw=true;;
56   - Darwin*) darwin=true
57   - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
58   - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
59   - if [ -z "$JAVA_HOME" ]; then
60   - if [ -x "/usr/libexec/java_home" ]; then
61   - export JAVA_HOME="`/usr/libexec/java_home`"
62   - else
63   - export JAVA_HOME="/Library/Java/Home"
64   - fi
65   - fi
66   - ;;
67   -esac
68   -
69   -if [ -z "$JAVA_HOME" ] ; then
70   - if [ -r /etc/gentoo-release ] ; then
71   - JAVA_HOME=`java-config --jre-home`
72   - fi
73   -fi
74   -
75   -if [ -z "$M2_HOME" ] ; then
76   - ## resolve links - $0 may be a link to maven's home
77   - PRG="$0"
78   -
79   - # need this for relative symlinks
80   - while [ -h "$PRG" ] ; do
81   - ls=`ls -ld "$PRG"`
82   - link=`expr "$ls" : '.*-> \(.*\)$'`
83   - if expr "$link" : '/.*' > /dev/null; then
84   - PRG="$link"
85   - else
86   - PRG="`dirname "$PRG"`/$link"
87   - fi
88   - done
89   -
90   - saveddir=`pwd`
91   -
92   - M2_HOME=`dirname "$PRG"`/..
93   -
94   - # make it fully qualified
95   - M2_HOME=`cd "$M2_HOME" && pwd`
96   -
97   - cd "$saveddir"
98   - # echo Using m2 at $M2_HOME
99   -fi
100   -
101   -# For Cygwin, ensure paths are in UNIX format before anything is touched
102   -if $cygwin ; then
103   - [ -n "$M2_HOME" ] &&
104   - M2_HOME=`cygpath --unix "$M2_HOME"`
105   - [ -n "$JAVA_HOME" ] &&
106   - JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
107   - [ -n "$CLASSPATH" ] &&
108   - CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
109   -fi
110   -
111   -# For Mingw, ensure paths are in UNIX format before anything is touched
112   -if $mingw ; then
113   - [ -n "$M2_HOME" ] &&
114   - M2_HOME="`(cd "$M2_HOME"; pwd)`"
115   - [ -n "$JAVA_HOME" ] &&
116   - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
117   - # TODO classpath?
118   -fi
119   -
120   -if [ -z "$JAVA_HOME" ]; then
121   - javaExecutable="`which javac`"
122   - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
123   - # readlink(1) is not available as standard on Solaris 10.
124   - readLink=`which readlink`
125   - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
126   - if $darwin ; then
127   - javaHome="`dirname \"$javaExecutable\"`"
128   - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
129   - else
130   - javaExecutable="`readlink -f \"$javaExecutable\"`"
131   - fi
132   - javaHome="`dirname \"$javaExecutable\"`"
133   - javaHome=`expr "$javaHome" : '\(.*\)/bin'`
134   - JAVA_HOME="$javaHome"
135   - export JAVA_HOME
136   - fi
137   - fi
138   -fi
139   -
140   -if [ -z "$JAVACMD" ] ; then
141   - if [ -n "$JAVA_HOME" ] ; then
142   - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
143   - # IBM's JDK on AIX uses strange locations for the executables
144   - JAVACMD="$JAVA_HOME/jre/sh/java"
145   - else
146   - JAVACMD="$JAVA_HOME/bin/java"
147   - fi
148   - else
149   - JAVACMD="`which java`"
150   - fi
151   -fi
152   -
153   -if [ ! -x "$JAVACMD" ] ; then
154   - echo "Error: JAVA_HOME is not defined correctly." >&2
155   - echo " We cannot execute $JAVACMD" >&2
156   - exit 1
157   -fi
158   -
159   -if [ -z "$JAVA_HOME" ] ; then
160   - echo "Warning: JAVA_HOME environment variable is not set."
161   -fi
162   -
163   -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
164   -
165   -# traverses directory structure from process work directory to filesystem root
166   -# first directory with .mvn subdirectory is considered project base directory
167   -find_maven_basedir() {
168   -
169   - if [ -z "$1" ]
170   - then
171   - echo "Path not specified to find_maven_basedir"
172   - return 1
173   - fi
174   -
175   - basedir="$1"
176   - wdir="$1"
177   - while [ "$wdir" != '/' ] ; do
178   - if [ -d "$wdir"/.mvn ] ; then
179   - basedir=$wdir
180   - break
181   - fi
182   - # workaround for JBEAP-8937 (on Solaris 10/Sparc)
183   - if [ -d "${wdir}" ]; then
184   - wdir=`cd "$wdir/.."; pwd`
185   - fi
186   - # end of workaround
187   - done
188   - echo "${basedir}"
189   -}
190   -
191   -# concatenates all lines of a file
192   -concat_lines() {
193   - if [ -f "$1" ]; then
194   - echo "$(tr -s '\n' ' ' < "$1")"
195   - fi
196   -}
197   -
198   -BASE_DIR=`find_maven_basedir "$(pwd)"`
199   -if [ -z "$BASE_DIR" ]; then
200   - exit 1;
201   -fi
202   -
203   -##########################################################################################
204   -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
205   -# This allows using the maven wrapper in projects that prohibit checking in binary data.
206   -##########################################################################################
207   -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
208   - if [ "$MVNW_VERBOSE" = true ]; then
209   - echo "Found .mvn/wrapper/maven-wrapper.jar"
210   - fi
211   -else
212   - if [ "$MVNW_VERBOSE" = true ]; then
213   - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
214   - fi
215   - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
216   - while IFS="=" read key value; do
217   - case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
218   - esac
219   - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
220   - if [ "$MVNW_VERBOSE" = true ]; then
221   - echo "Downloading from: $jarUrl"
222   - fi
223   - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
224   -
225   - if command -v wget > /dev/null; then
226   - if [ "$MVNW_VERBOSE" = true ]; then
227   - echo "Found wget ... using wget"
228   - fi
229   - wget "$jarUrl" -O "$wrapperJarPath"
230   - elif command -v curl > /dev/null; then
231   - if [ "$MVNW_VERBOSE" = true ]; then
232   - echo "Found curl ... using curl"
233   - fi
234   - curl -o "$wrapperJarPath" "$jarUrl"
235   - else
236   - if [ "$MVNW_VERBOSE" = true ]; then
237   - echo "Falling back to using Java to download"
238   - fi
239   - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
240   - if [ -e "$javaClass" ]; then
241   - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
242   - if [ "$MVNW_VERBOSE" = true ]; then
243   - echo " - Compiling MavenWrapperDownloader.java ..."
244   - fi
245   - # Compiling the Java class
246   - ("$JAVA_HOME/bin/javac" "$javaClass")
247   - fi
248   - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
249   - # Running the downloader
250   - if [ "$MVNW_VERBOSE" = true ]; then
251   - echo " - Running MavenWrapperDownloader.java ..."
252   - fi
253   - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
254   - fi
255   - fi
256   - fi
257   -fi
258   -##########################################################################################
259   -# End of extension
260   -##########################################################################################
261   -
262   -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
263   -if [ "$MVNW_VERBOSE" = true ]; then
264   - echo $MAVEN_PROJECTBASEDIR
265   -fi
266   -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
267   -
268   -# For Cygwin, switch paths to Windows format before running java
269   -if $cygwin; then
270   - [ -n "$M2_HOME" ] &&
271   - M2_HOME=`cygpath --path --windows "$M2_HOME"`
272   - [ -n "$JAVA_HOME" ] &&
273   - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
274   - [ -n "$CLASSPATH" ] &&
275   - CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
276   - [ -n "$MAVEN_PROJECTBASEDIR" ] &&
277   - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
278   -fi
279   -
280   -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
281   -
282   -exec "$JAVACMD" \
283   - $MAVEN_OPTS \
284   - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
285   - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
286   - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
cloud/cloud-server/mvnw.cmd
... ... @@ -1,161 +0,0 @@
1   -@REM ----------------------------------------------------------------------------
2   -@REM Licensed to the Apache Software Foundation (ASF) under one
3   -@REM or more contributor license agreements. See the NOTICE file
4   -@REM distributed with this work for additional information
5   -@REM regarding copyright ownership. The ASF licenses this file
6   -@REM to you under the Apache License, Version 2.0 (the
7   -@REM "License"); you may not use this file except in compliance
8   -@REM with the License. You may obtain a copy of the License at
9   -@REM
10   -@REM https://www.apache.org/licenses/LICENSE-2.0
11   -@REM
12   -@REM Unless required by applicable law or agreed to in writing,
13   -@REM software distributed under the License is distributed on an
14   -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   -@REM KIND, either express or implied. See the License for the
16   -@REM specific language governing permissions and limitations
17   -@REM under the License.
18   -@REM ----------------------------------------------------------------------------
19   -
20   -@REM ----------------------------------------------------------------------------
21   -@REM Maven2 Start Up Batch script
22   -@REM
23   -@REM Required ENV vars:
24   -@REM JAVA_HOME - location of a JDK home dir
25   -@REM
26   -@REM Optional ENV vars
27   -@REM M2_HOME - location of maven2's installed home dir
28   -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29   -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
30   -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31   -@REM e.g. to debug Maven itself, use
32   -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33   -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34   -@REM ----------------------------------------------------------------------------
35   -
36   -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37   -@echo off
38   -@REM set title of command window
39   -title %0
40   -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
41   -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
42   -
43   -@REM set %HOME% to equivalent of $HOME
44   -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
45   -
46   -@REM Execute a user defined script before this one
47   -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
48   -@REM check for pre script, once with legacy .bat ending and once with .cmd ending
49   -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
50   -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
51   -:skipRcPre
52   -
53   -@setlocal
54   -
55   -set ERROR_CODE=0
56   -
57   -@REM To isolate internal variables from possible post scripts, we use another setlocal
58   -@setlocal
59   -
60   -@REM ==== START VALIDATION ====
61   -if not "%JAVA_HOME%" == "" goto OkJHome
62   -
63   -echo.
64   -echo Error: JAVA_HOME not found in your environment. >&2
65   -echo Please set the JAVA_HOME variable in your environment to match the >&2
66   -echo location of your Java installation. >&2
67   -echo.
68   -goto error
69   -
70   -:OkJHome
71   -if exist "%JAVA_HOME%\bin\java.exe" goto init
72   -
73   -echo.
74   -echo Error: JAVA_HOME is set to an invalid directory. >&2
75   -echo JAVA_HOME = "%JAVA_HOME%" >&2
76   -echo Please set the JAVA_HOME variable in your environment to match the >&2
77   -echo location of your Java installation. >&2
78   -echo.
79   -goto error
80   -
81   -@REM ==== END VALIDATION ====
82   -
83   -:init
84   -
85   -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86   -@REM Fallback to current working directory if not found.
87   -
88   -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89   -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90   -
91   -set EXEC_DIR=%CD%
92   -set WDIR=%EXEC_DIR%
93   -:findBaseDir
94   -IF EXIST "%WDIR%"\.mvn goto baseDirFound
95   -cd ..
96   -IF "%WDIR%"=="%CD%" goto baseDirNotFound
97   -set WDIR=%CD%
98   -goto findBaseDir
99   -
100   -:baseDirFound
101   -set MAVEN_PROJECTBASEDIR=%WDIR%
102   -cd "%EXEC_DIR%"
103   -goto endDetectBaseDir
104   -
105   -:baseDirNotFound
106   -set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107   -cd "%EXEC_DIR%"
108   -
109   -:endDetectBaseDir
110   -
111   -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112   -
113   -@setlocal EnableExtensions EnableDelayedExpansion
114   -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115   -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116   -
117   -:endReadAdditionalConfig
118   -
119   -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120   -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
121   -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
122   -
123   -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
124   -FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
125   - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
126   -)
127   -
128   -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
129   -@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
130   -if exist %WRAPPER_JAR% (
131   - echo Found %WRAPPER_JAR%
132   -) else (
133   - echo Couldn't find %WRAPPER_JAR%, downloading it ...
134   - echo Downloading from: %DOWNLOAD_URL%
135   - powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
136   - echo Finished downloading %WRAPPER_JAR%
137   -)
138   -@REM End of extension
139   -
140   -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
141   -if ERRORLEVEL 1 goto error
142   -goto end
143   -
144   -:error
145   -set ERROR_CODE=1
146   -
147   -:end
148   -@endlocal & set ERROR_CODE=%ERROR_CODE%
149   -
150   -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
151   -@REM check for post script, once with legacy .bat ending and once with .cmd ending
152   -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
153   -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
154   -:skipRcPost
155   -
156   -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
157   -if "%MAVEN_BATCH_PAUSE%" == "on" pause
158   -
159   -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
160   -
161   -exit /B %ERROR_CODE%
cloud/cloud-server/pom.xml
... ... @@ -1,56 +0,0 @@
1   -<?xml version="1.0" encoding="UTF-8"?>
2   -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3   - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4   - <modelVersion>4.0.0</modelVersion>
5   - <parent>
6   - <groupId>org.springframework.boot</groupId>
7   - <artifactId>spring-boot-starter-parent</artifactId>
8   - <version>2.1.6.RELEASE</version>
9   - <relativePath/> <!-- lookup parent from repository -->
10   - </parent>
11   - <groupId>com.example</groupId>
12   - <artifactId>cloud-server</artifactId>
13   - <version>0.0.1-SNAPSHOT</version>
14   - <name>cloud-server</name>
15   - <description>Demo project for Spring Boot</description>
16   -
17   - <properties>
18   - <java.version>1.8</java.version>
19   - <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
20   - </properties>
21   -
22   - <dependencies>
23   - <dependency>
24   - <groupId>org.springframework.cloud</groupId>
25   - <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
26   - </dependency>
27   -
28   - <dependency>
29   - <groupId>org.springframework.boot</groupId>
30   - <artifactId>spring-boot-starter-test</artifactId>
31   - <scope>test</scope>
32   - </dependency>
33   - </dependencies>
34   -
35   - <dependencyManagement>
36   - <dependencies>
37   - <dependency>
38   - <groupId>org.springframework.cloud</groupId>
39   - <artifactId>spring-cloud-dependencies</artifactId>
40   - <version>${spring-cloud.version}</version>
41   - <type>pom</type>
42   - <scope>import</scope>
43   - </dependency>
44   - </dependencies>
45   - </dependencyManagement>
46   -
47   - <build>
48   - <plugins>
49   - <plugin>
50   - <groupId>org.springframework.boot</groupId>
51   - <artifactId>spring-boot-maven-plugin</artifactId>
52   - </plugin>
53   - </plugins>
54   - </build>
55   -
56   -</project>
cloud/cloud-server/src/main/java/com/example/cloudserver/CloudServerApplication.java
... ... @@ -1,15 +0,0 @@
1   -package com.example.cloudserver;
2   -
3   -import org.springframework.boot.SpringApplication;
4   -import org.springframework.boot.autoconfigure.SpringBootApplication;
5   -import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
6   -
7   -@EnableEurekaServer
8   -@SpringBootApplication
9   -public class CloudServerApplication {
10   -
11   - public static void main(String[] args) {
12   - SpringApplication.run(CloudServerApplication.class, args);
13   - }
14   -
15   -}
cloud/cloud-server/src/main/resources/application.yaml
... ... @@ -1,9 +0,0 @@
1   -server:
2   - port: 10087
3   -
4   -eureka:
5   - instance:
6   - hostname: localhost
7   - client:
8   - fetch-registry: false
9   - register-with-eureka: false
cloud/cloud-server/src/test/java/com/example/cloudserver/CloudServerApplicationTests.java
... ... @@ -1,16 +0,0 @@
1   -package com.example.cloudserver;
2   -
3   -import org.junit.Test;
4   -import org.junit.runner.RunWith;
5   -import org.springframework.boot.test.context.SpringBootTest;
6   -import org.springframework.test.context.junit4.SpringRunner;
7   -
8   -@RunWith(SpringRunner.class)
9   -@SpringBootTest
10   -public class CloudServerApplicationTests {
11   -
12   - @Test
13   - public void contextLoads() {
14   - }
15   -
16   -}
cloud/common/.gitignore 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +HELP.md
  2 +target/
  3 +!.mvn/wrapper/maven-wrapper.jar
  4 +!**/src/main/**
  5 +!**/src/test/**
  6 +
  7 +### STS ###
  8 +.apt_generated
  9 +.classpath
  10 +.factorypath
  11 +.project
  12 +.settings
  13 +.springBeans
  14 +.sts4-cache
  15 +
  16 +### IntelliJ IDEA ###
  17 +.idea
  18 +*.iws
  19 +*.iml
  20 +*.ipr
  21 +
  22 +### NetBeans ###
  23 +/nbproject/private/
  24 +/nbbuild/
  25 +/dist/
  26 +/nbdist/
  27 +/.nb-gradle/
  28 +build/
  29 +
  30 +### VS Code ###
  31 +.vscode/
... ...
cloud/common/.mvn/wrapper/MavenWrapperDownloader.java 0 → 100644
... ... @@ -0,0 +1,114 @@
  1 +/*
  2 +Licensed to the Apache Software Foundation (ASF) under one
  3 +or more contributor license agreements. See the NOTICE file
  4 +distributed with this work for additional information
  5 +regarding copyright ownership. The ASF licenses this file
  6 +to you under the Apache License, Version 2.0 (the
  7 +"License"); you may not use this file except in compliance
  8 +with the License. You may obtain a copy of the License at
  9 +
  10 + https://www.apache.org/licenses/LICENSE-2.0
  11 +
  12 +Unless required by applicable law or agreed to in writing,
  13 +software distributed under the License is distributed on an
  14 +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15 +KIND, either express or implied. See the License for the
  16 +specific language governing permissions and limitations
  17 +under the License.
  18 +*/
  19 +
  20 +import java.io.File;
  21 +import java.io.FileInputStream;
  22 +import java.io.FileOutputStream;
  23 +import java.io.IOException;
  24 +import java.net.URL;
  25 +import java.nio.channels.Channels;
  26 +import java.nio.channels.ReadableByteChannel;
  27 +import java.util.Properties;
  28 +
  29 +public class MavenWrapperDownloader {
  30 +
  31 + /**
  32 + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
  33 + */
  34 + private static final String DEFAULT_DOWNLOAD_URL =
  35 + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
  36 +
  37 + /**
  38 + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
  39 + * use instead of the default one.
  40 + */
  41 + private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
  42 + ".mvn/wrapper/maven-wrapper.properties";
  43 +
  44 + /**
  45 + * Path where the maven-wrapper.jar will be saved to.
  46 + */
  47 + private static final String MAVEN_WRAPPER_JAR_PATH =
  48 + ".mvn/wrapper/maven-wrapper.jar";
  49 +
  50 + /**
  51 + * Name of the property which should be used to override the default download url for the wrapper.
  52 + */
  53 + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
  54 +
  55 + public static void main(String args[]) {
  56 + System.out.println("- Downloader started");
  57 + File baseDirectory = new File(args[0]);
  58 + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
  59 +
  60 + // If the maven-wrapper.properties exists, read it and check if it contains a custom
  61 + // wrapperUrl parameter.
  62 + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
  63 + String url = DEFAULT_DOWNLOAD_URL;
  64 + if (mavenWrapperPropertyFile.exists()) {
  65 + FileInputStream mavenWrapperPropertyFileInputStream = null;
  66 + try {
  67 + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
  68 + Properties mavenWrapperProperties = new Properties();
  69 + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
  70 + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
  71 + } catch (IOException e) {
  72 + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
  73 + } finally {
  74 + try {
  75 + if (mavenWrapperPropertyFileInputStream != null) {
  76 + mavenWrapperPropertyFileInputStream.close();
  77 + }
  78 + } catch (IOException e) {
  79 + // Ignore ...
  80 + }
  81 + }
  82 + }
  83 + System.out.println("- Downloading from: : " + url);
  84 +
  85 + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
  86 + if (!outputFile.getParentFile().exists()) {
  87 + if (!outputFile.getParentFile().mkdirs()) {
  88 + System.out.println(
  89 + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
  90 + }
  91 + }
  92 + System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
  93 + try {
  94 + downloadFileFromURL(url, outputFile);
  95 + System.out.println("Done");
  96 + System.exit(0);
  97 + } catch (Throwable e) {
  98 + System.out.println("- Error downloading");
  99 + e.printStackTrace();
  100 + System.exit(1);
  101 + }
  102 + }
  103 +
  104 + private static void downloadFileFromURL(String urlString, File destination) throws Exception {
  105 + URL website = new URL(urlString);
  106 + ReadableByteChannel rbc;
  107 + rbc = Channels.newChannel(website.openStream());
  108 + FileOutputStream fos = new FileOutputStream(destination);
  109 + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
  110 + fos.close();
  111 + rbc.close();
  112 + }
  113 +
  114 +}
... ...
cloud/common/.mvn/wrapper/maven-wrapper.jar 0 → 100644
No preview for this file type
cloud/common/.mvn/wrapper/maven-wrapper.properties 0 → 100644
... ... @@ -0,0 +1 @@
  1 +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
... ...
cloud/common/mvnw 0 → 100644
... ... @@ -0,0 +1,286 @@
  1 +#!/bin/sh
  2 +# ----------------------------------------------------------------------------
  3 +# Licensed to the Apache Software Foundation (ASF) under one
  4 +# or more contributor license agreements. See the NOTICE file
  5 +# distributed with this work for additional information
  6 +# regarding copyright ownership. The ASF licenses this file
  7 +# to you under the Apache License, Version 2.0 (the
  8 +# "License"); you may not use this file except in compliance
  9 +# with the License. You may obtain a copy of the License at
  10 +#
  11 +# https://www.apache.org/licenses/LICENSE-2.0
  12 +#
  13 +# Unless required by applicable law or agreed to in writing,
  14 +# software distributed under the License is distributed on an
  15 +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  16 +# KIND, either express or implied. See the License for the
  17 +# specific language governing permissions and limitations
  18 +# under the License.
  19 +# ----------------------------------------------------------------------------
  20 +
  21 +# ----------------------------------------------------------------------------
  22 +# Maven2 Start Up Batch script
  23 +#
  24 +# Required ENV vars:
  25 +# ------------------
  26 +# JAVA_HOME - location of a JDK home dir
  27 +#
  28 +# Optional ENV vars
  29 +# -----------------
  30 +# M2_HOME - location of maven2's installed home dir
  31 +# MAVEN_OPTS - parameters passed to the Java VM when running Maven
  32 +# e.g. to debug Maven itself, use
  33 +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
  34 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
  35 +# ----------------------------------------------------------------------------
  36 +
  37 +if [ -z "$MAVEN_SKIP_RC" ] ; then
  38 +
  39 + if [ -f /etc/mavenrc ] ; then
  40 + . /etc/mavenrc
  41 + fi
  42 +
  43 + if [ -f "$HOME/.mavenrc" ] ; then
  44 + . "$HOME/.mavenrc"
  45 + fi
  46 +
  47 +fi
  48 +
  49 +# OS specific support. $var _must_ be set to either true or false.
  50 +cygwin=false;
  51 +darwin=false;
  52 +mingw=false
  53 +case "`uname`" in
  54 + CYGWIN*) cygwin=true ;;
  55 + MINGW*) mingw=true;;
  56 + Darwin*) darwin=true
  57 + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
  58 + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
  59 + if [ -z "$JAVA_HOME" ]; then
  60 + if [ -x "/usr/libexec/java_home" ]; then
  61 + export JAVA_HOME="`/usr/libexec/java_home`"
  62 + else
  63 + export JAVA_HOME="/Library/Java/Home"
  64 + fi
  65 + fi
  66 + ;;
  67 +esac
  68 +
  69 +if [ -z "$JAVA_HOME" ] ; then
  70 + if [ -r /etc/gentoo-release ] ; then
  71 + JAVA_HOME=`java-config --jre-home`
  72 + fi
  73 +fi
  74 +
  75 +if [ -z "$M2_HOME" ] ; then
  76 + ## resolve links - $0 may be a link to maven's home
  77 + PRG="$0"
  78 +
  79 + # need this for relative symlinks
  80 + while [ -h "$PRG" ] ; do
  81 + ls=`ls -ld "$PRG"`
  82 + link=`expr "$ls" : '.*-> \(.*\)$'`
  83 + if expr "$link" : '/.*' > /dev/null; then
  84 + PRG="$link"
  85 + else
  86 + PRG="`dirname "$PRG"`/$link"
  87 + fi
  88 + done
  89 +
  90 + saveddir=`pwd`
  91 +
  92 + M2_HOME=`dirname "$PRG"`/..
  93 +
  94 + # make it fully qualified
  95 + M2_HOME=`cd "$M2_HOME" && pwd`
  96 +
  97 + cd "$saveddir"
  98 + # echo Using m2 at $M2_HOME
  99 +fi
  100 +
  101 +# For Cygwin, ensure paths are in UNIX format before anything is touched
  102 +if $cygwin ; then
  103 + [ -n "$M2_HOME" ] &&
  104 + M2_HOME=`cygpath --unix "$M2_HOME"`
  105 + [ -n "$JAVA_HOME" ] &&
  106 + JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  107 + [ -n "$CLASSPATH" ] &&
  108 + CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
  109 +fi
  110 +
  111 +# For Mingw, ensure paths are in UNIX format before anything is touched
  112 +if $mingw ; then
  113 + [ -n "$M2_HOME" ] &&
  114 + M2_HOME="`(cd "$M2_HOME"; pwd)`"
  115 + [ -n "$JAVA_HOME" ] &&
  116 + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
  117 + # TODO classpath?
  118 +fi
  119 +
  120 +if [ -z "$JAVA_HOME" ]; then
  121 + javaExecutable="`which javac`"
  122 + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
  123 + # readlink(1) is not available as standard on Solaris 10.
  124 + readLink=`which readlink`
  125 + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
  126 + if $darwin ; then
  127 + javaHome="`dirname \"$javaExecutable\"`"
  128 + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
  129 + else
  130 + javaExecutable="`readlink -f \"$javaExecutable\"`"
  131 + fi
  132 + javaHome="`dirname \"$javaExecutable\"`"
  133 + javaHome=`expr "$javaHome" : '\(.*\)/bin'`
  134 + JAVA_HOME="$javaHome"
  135 + export JAVA_HOME
  136 + fi
  137 + fi
  138 +fi
  139 +
  140 +if [ -z "$JAVACMD" ] ; then
  141 + if [ -n "$JAVA_HOME" ] ; then
  142 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  143 + # IBM's JDK on AIX uses strange locations for the executables
  144 + JAVACMD="$JAVA_HOME/jre/sh/java"
  145 + else
  146 + JAVACMD="$JAVA_HOME/bin/java"
  147 + fi
  148 + else
  149 + JAVACMD="`which java`"
  150 + fi
  151 +fi
  152 +
  153 +if [ ! -x "$JAVACMD" ] ; then
  154 + echo "Error: JAVA_HOME is not defined correctly." >&2
  155 + echo " We cannot execute $JAVACMD" >&2
  156 + exit 1
  157 +fi
  158 +
  159 +if [ -z "$JAVA_HOME" ] ; then
  160 + echo "Warning: JAVA_HOME environment variable is not set."
  161 +fi
  162 +
  163 +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
  164 +
  165 +# traverses directory structure from process work directory to filesystem root
  166 +# first directory with .mvn subdirectory is considered project base directory
  167 +find_maven_basedir() {
  168 +
  169 + if [ -z "$1" ]
  170 + then
  171 + echo "Path not specified to find_maven_basedir"
  172 + return 1
  173 + fi
  174 +
  175 + basedir="$1"
  176 + wdir="$1"
  177 + while [ "$wdir" != '/' ] ; do
  178 + if [ -d "$wdir"/.mvn ] ; then
  179 + basedir=$wdir
  180 + break
  181 + fi
  182 + # workaround for JBEAP-8937 (on Solaris 10/Sparc)
  183 + if [ -d "${wdir}" ]; then
  184 + wdir=`cd "$wdir/.."; pwd`
  185 + fi
  186 + # end of workaround
  187 + done
  188 + echo "${basedir}"
  189 +}
  190 +
  191 +# concatenates all lines of a file
  192 +concat_lines() {
  193 + if [ -f "$1" ]; then
  194 + echo "$(tr -s '\n' ' ' < "$1")"
  195 + fi
  196 +}
  197 +
  198 +BASE_DIR=`find_maven_basedir "$(pwd)"`
  199 +if [ -z "$BASE_DIR" ]; then
  200 + exit 1;
  201 +fi
  202 +
  203 +##########################################################################################
  204 +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
  205 +# This allows using the maven wrapper in projects that prohibit checking in binary data.
  206 +##########################################################################################
  207 +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
  208 + if [ "$MVNW_VERBOSE" = true ]; then
  209 + echo "Found .mvn/wrapper/maven-wrapper.jar"
  210 + fi
  211 +else
  212 + if [ "$MVNW_VERBOSE" = true ]; then
  213 + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
  214 + fi
  215 + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
  216 + while IFS="=" read key value; do
  217 + case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
  218 + esac
  219 + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
  220 + if [ "$MVNW_VERBOSE" = true ]; then
  221 + echo "Downloading from: $jarUrl"
  222 + fi
  223 + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
  224 +
  225 + if command -v wget > /dev/null; then
  226 + if [ "$MVNW_VERBOSE" = true ]; then
  227 + echo "Found wget ... using wget"
  228 + fi
  229 + wget "$jarUrl" -O "$wrapperJarPath"
  230 + elif command -v curl > /dev/null; then
  231 + if [ "$MVNW_VERBOSE" = true ]; then
  232 + echo "Found curl ... using curl"
  233 + fi
  234 + curl -o "$wrapperJarPath" "$jarUrl"
  235 + else
  236 + if [ "$MVNW_VERBOSE" = true ]; then
  237 + echo "Falling back to using Java to download"
  238 + fi
  239 + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
  240 + if [ -e "$javaClass" ]; then
  241 + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
  242 + if [ "$MVNW_VERBOSE" = true ]; then
  243 + echo " - Compiling MavenWrapperDownloader.java ..."
  244 + fi
  245 + # Compiling the Java class
  246 + ("$JAVA_HOME/bin/javac" "$javaClass")
  247 + fi
  248 + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
  249 + # Running the downloader
  250 + if [ "$MVNW_VERBOSE" = true ]; then
  251 + echo " - Running MavenWrapperDownloader.java ..."
  252 + fi
  253 + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
  254 + fi
  255 + fi
  256 + fi
  257 +fi
  258 +##########################################################################################
  259 +# End of extension
  260 +##########################################################################################
  261 +
  262 +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
  263 +if [ "$MVNW_VERBOSE" = true ]; then
  264 + echo $MAVEN_PROJECTBASEDIR
  265 +fi
  266 +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
  267 +
  268 +# For Cygwin, switch paths to Windows format before running java
  269 +if $cygwin; then
  270 + [ -n "$M2_HOME" ] &&
  271 + M2_HOME=`cygpath --path --windows "$M2_HOME"`
  272 + [ -n "$JAVA_HOME" ] &&
  273 + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
  274 + [ -n "$CLASSPATH" ] &&
  275 + CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
  276 + [ -n "$MAVEN_PROJECTBASEDIR" ] &&
  277 + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
  278 +fi
  279 +
  280 +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
  281 +
  282 +exec "$JAVACMD" \
  283 + $MAVEN_OPTS \
  284 + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
  285 + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  286 + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
... ...
cloud/common/mvnw.cmd 0 → 100644
... ... @@ -0,0 +1,161 @@
  1 +@REM ----------------------------------------------------------------------------
  2 +@REM Licensed to the Apache Software Foundation (ASF) under one
  3 +@REM or more contributor license agreements. See the NOTICE file
  4 +@REM distributed with this work for additional information
  5 +@REM regarding copyright ownership. The ASF licenses this file
  6 +@REM to you under the Apache License, Version 2.0 (the
  7 +@REM "License"); you may not use this file except in compliance
  8 +@REM with the License. You may obtain a copy of the License at
  9 +@REM
  10 +@REM https://www.apache.org/licenses/LICENSE-2.0
  11 +@REM
  12 +@REM Unless required by applicable law or agreed to in writing,
  13 +@REM software distributed under the License is distributed on an
  14 +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15 +@REM KIND, either express or implied. See the License for the
  16 +@REM specific language governing permissions and limitations
  17 +@REM under the License.
  18 +@REM ----------------------------------------------------------------------------
  19 +
  20 +@REM ----------------------------------------------------------------------------
  21 +@REM Maven2 Start Up Batch script
  22 +@REM
  23 +@REM Required ENV vars:
  24 +@REM JAVA_HOME - location of a JDK home dir
  25 +@REM
  26 +@REM Optional ENV vars
  27 +@REM M2_HOME - location of maven2's installed home dir
  28 +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
  29 +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
  30 +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
  31 +@REM e.g. to debug Maven itself, use
  32 +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
  33 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
  34 +@REM ----------------------------------------------------------------------------
  35 +
  36 +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
  37 +@echo off
  38 +@REM set title of command window
  39 +title %0
  40 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
  41 +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
  42 +
  43 +@REM set %HOME% to equivalent of $HOME
  44 +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
  45 +
  46 +@REM Execute a user defined script before this one
  47 +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
  48 +@REM check for pre script, once with legacy .bat ending and once with .cmd ending
  49 +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
  50 +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
  51 +:skipRcPre
  52 +
  53 +@setlocal
  54 +
  55 +set ERROR_CODE=0
  56 +
  57 +@REM To isolate internal variables from possible post scripts, we use another setlocal
  58 +@setlocal
  59 +
  60 +@REM ==== START VALIDATION ====
  61 +if not "%JAVA_HOME%" == "" goto OkJHome
  62 +
  63 +echo.
  64 +echo Error: JAVA_HOME not found in your environment. >&2
  65 +echo Please set the JAVA_HOME variable in your environment to match the >&2
  66 +echo location of your Java installation. >&2
  67 +echo.
  68 +goto error
  69 +
  70 +:OkJHome
  71 +if exist "%JAVA_HOME%\bin\java.exe" goto init
  72 +
  73 +echo.
  74 +echo Error: JAVA_HOME is set to an invalid directory. >&2
  75 +echo JAVA_HOME = "%JAVA_HOME%" >&2
  76 +echo Please set the JAVA_HOME variable in your environment to match the >&2
  77 +echo location of your Java installation. >&2
  78 +echo.
  79 +goto error
  80 +
  81 +@REM ==== END VALIDATION ====
  82 +
  83 +:init
  84 +
  85 +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
  86 +@REM Fallback to current working directory if not found.
  87 +
  88 +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
  89 +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
  90 +
  91 +set EXEC_DIR=%CD%
  92 +set WDIR=%EXEC_DIR%
  93 +:findBaseDir
  94 +IF EXIST "%WDIR%"\.mvn goto baseDirFound
  95 +cd ..
  96 +IF "%WDIR%"=="%CD%" goto baseDirNotFound
  97 +set WDIR=%CD%
  98 +goto findBaseDir
  99 +
  100 +:baseDirFound
  101 +set MAVEN_PROJECTBASEDIR=%WDIR%
  102 +cd "%EXEC_DIR%"
  103 +goto endDetectBaseDir
  104 +
  105 +:baseDirNotFound
  106 +set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
  107 +cd "%EXEC_DIR%"
  108 +
  109 +:endDetectBaseDir
  110 +
  111 +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
  112 +
  113 +@setlocal EnableExtensions EnableDelayedExpansion
  114 +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
  115 +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
  116 +
  117 +:endReadAdditionalConfig
  118 +
  119 +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
  120 +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
  121 +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
  122 +
  123 +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
  124 +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
  125 + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
  126 +)
  127 +
  128 +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
  129 +@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
  130 +if exist %WRAPPER_JAR% (
  131 + echo Found %WRAPPER_JAR%
  132 +) else (
  133 + echo Couldn't find %WRAPPER_JAR%, downloading it ...
  134 + echo Downloading from: %DOWNLOAD_URL%
  135 + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
  136 + echo Finished downloading %WRAPPER_JAR%
  137 +)
  138 +@REM End of extension
  139 +
  140 +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
  141 +if ERRORLEVEL 1 goto error
  142 +goto end
  143 +
  144 +:error
  145 +set ERROR_CODE=1
  146 +
  147 +:end
  148 +@endlocal & set ERROR_CODE=%ERROR_CODE%
  149 +
  150 +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
  151 +@REM check for post script, once with legacy .bat ending and once with .cmd ending
  152 +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
  153 +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
  154 +:skipRcPost
  155 +
  156 +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
  157 +if "%MAVEN_BATCH_PAUSE%" == "on" pause
  158 +
  159 +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
  160 +
  161 +exit /B %ERROR_CODE%
... ...
cloud/common/pom.xml 0 → 100644
... ... @@ -0,0 +1,90 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4 + <modelVersion>4.0.0</modelVersion>
  5 + <parent>
  6 + <groupId>org.springframework.boot</groupId>
  7 + <artifactId>spring-boot-starter-parent</artifactId>
  8 + <version>2.1.7.RELEASE</version>
  9 + <relativePath/> <!-- lookup parent from repository -->
  10 + </parent>
  11 + <groupId>com.sincere</groupId>
  12 + <artifactId>common</artifactId>
  13 + <version>0.0.1-SNAPSHOT</version>
  14 + <name>common</name>
  15 + <description>Demo project for Spring Boot</description>
  16 +
  17 + <properties>
  18 + <java.version>1.8</java.version>
  19 + </properties>
  20 +
  21 + <dependencies>
  22 + <dependency>
  23 + <groupId>org.springframework.boot</groupId>
  24 + <artifactId>spring-boot-starter</artifactId>
  25 + </dependency>
  26 +
  27 + <dependency>
  28 + <groupId>org.springframework.boot</groupId>
  29 + <artifactId>spring-boot-starter-test</artifactId>
  30 + <scope>test</scope>
  31 + </dependency>
  32 +
  33 + <dependency>
  34 + <groupId>org.springframework.boot</groupId>
  35 + <artifactId>spring-boot</artifactId>
  36 + </dependency>
  37 + <dependency>
  38 + <groupId>com.baomidou</groupId>
  39 + <artifactId>mybatis-plus-core</artifactId>
  40 + <version>3.0.1</version>
  41 + <scope>compile</scope>
  42 + </dependency>
  43 +
  44 + <dependency>
  45 + <groupId>com.baomidou</groupId>
  46 + <artifactId>mybatis-plus-extension</artifactId>
  47 + <version>3.0.1</version>
  48 + <scope>compile</scope>
  49 + </dependency>
  50 +
  51 + <dependency>
  52 + <groupId>org.apache.tomcat.embed</groupId>
  53 + <artifactId>tomcat-embed-core</artifactId>
  54 + </dependency>
  55 +
  56 + <dependency>
  57 + <groupId>io.jsonwebtoken</groupId>
  58 + <artifactId>jjwt</artifactId>
  59 + <version>0.9.0</version>
  60 + </dependency>
  61 +
  62 + <dependency>
  63 + <groupId>org.springframework.security</groupId>
  64 + <artifactId>spring-security-core</artifactId>
  65 + </dependency>
  66 +
  67 + <dependency>
  68 + <groupId>org.projectlombok</groupId>
  69 + <artifactId>lombok</artifactId>
  70 + </dependency>
  71 +
  72 +
  73 + <dependency>
  74 + <groupId>commons-collections</groupId>
  75 + <artifactId>commons-collections</artifactId>
  76 + <version>3.2.2</version>
  77 + </dependency>
  78 +
  79 + </dependencies>
  80 +
  81 + <build>
  82 + <plugins>
  83 + <plugin>
  84 + <groupId>org.springframework.boot</groupId>
  85 + <artifactId>spring-boot-maven-plugin</artifactId>
  86 + </plugin>
  87 + </plugins>
  88 + </build>
  89 +
  90 +</project>
... ...
cloud/common/src/main/java/com/sincere/common/CommonApplication.java 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +package com.sincere.common;
  2 +
  3 +import org.springframework.boot.SpringApplication;
  4 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  5 +
  6 +@SpringBootApplication
  7 +public class CommonApplication {
  8 +
  9 + public static void main(String[] args) {
  10 + SpringApplication.run(CommonApplication.class, args);
  11 + }
  12 +
  13 +}
... ...
cloud/common/src/main/java/com/sincere/common/commons/CodeEnum.java 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +package com.sincere.common.commons;
  2 +
  3 +/**
  4 + * @Author: [gitgeek]
  5 + * @Date: [2018-08-02 08:50]
  6 + * @Description: [ ]
  7 + * @Version: [1.0.0]
  8 + * @Copy: [com.zzg]
  9 + */
  10 +public enum CodeEnum {
  11 + SUCCESS(0),
  12 + ERROR(1);
  13 +
  14 + private Integer code;
  15 + CodeEnum(Integer code){
  16 + this.code = code;
  17 + }
  18 +
  19 + public Integer getCode() {
  20 + return code;
  21 + }
  22 +
  23 + public void setCode(Integer code) {
  24 + this.code = code;
  25 + }
  26 +}
... ...
cloud/common/src/main/java/com/sincere/common/commons/PageResult.java 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +package com.sincere.common.commons;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Builder;
  5 +import lombok.Data;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +import java.io.Serializable;
  9 +import java.util.List;
  10 +
  11 +
  12 +/**
  13 + * @author 作者 owen E-mail: 624191343@qq.com
  14 + * @version 创建时间:2017年11月12日 上午22:57:51
  15 + * 分页实体类
  16 + * total 总数
  17 + * code 是否成功
  18 + * data 当前页结果集
  19 + */
  20 +@Data
  21 +@Builder
  22 +@NoArgsConstructor
  23 +@AllArgsConstructor
  24 +public class PageResult<T> implements Serializable {
  25 +
  26 + private static final long serialVersionUID = -275582248840137389L;
  27 + private Long count;
  28 + private int code;
  29 + private List<T> data;
  30 +}
... ...
cloud/common/src/main/java/com/sincere/common/commons/Result.java 0 → 100644
... ... @@ -0,0 +1,49 @@
  1 +package com.sincere.common.commons;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +import java.io.Serializable;
  8 +
  9 +/**
  10 + * @Author: [zhangzhiguang]
  11 + * @Date: [2018-08-01 23:39]
  12 + * @Description: [ ]
  13 + * @Version: [1.0.0]
  14 + * @Copy: [com.zzg]
  15 + */
  16 +@Data
  17 +@NoArgsConstructor
  18 +@AllArgsConstructor
  19 +public class Result<T> implements Serializable {
  20 +
  21 + private T datas;
  22 + private Integer resp_code;
  23 + private String resp_msg;
  24 +
  25 + public static <T> Result<T> succeed(String msg) {
  26 + return succeedWith(null, CodeEnum.SUCCESS.getCode(),msg);
  27 + }
  28 +
  29 + public static <T> Result<T> succeed(T model, String msg) {
  30 + return succeedWith(model, CodeEnum.SUCCESS.getCode(),msg);
  31 + }
  32 +
  33 + public static <T> Result<T> succeedWith(T datas, Integer code,String msg) {
  34 + return new Result<T>(datas, code, msg);
  35 + }
  36 +
  37 + public static <T> Result<T> failed(String msg) {
  38 + return failedWith(null, CodeEnum.ERROR.getCode(), msg);
  39 + }
  40 +
  41 + public static <T> Result<T> failed(T model,String msg) {
  42 + return failedWith(model, CodeEnum.ERROR.getCode(), msg);
  43 + }
  44 +
  45 + public static <T> Result<T> failedWith(T datas, Integer code, String msg) {
  46 + return new Result<T>( datas, code, msg);
  47 + }
  48 +
  49 +}
... ...
cloud/common/src/main/java/com/sincere/common/config/DataSourceHolder.java 0 → 100644
... ... @@ -0,0 +1,25 @@
  1 +package com.sincere.common.config;
  2 +
  3 +
  4 +/**
  5 + * 用于数据源切换
  6 + *
  7 + */
  8 +public class DataSourceHolder {
  9 +
  10 + private static final ThreadLocal<DataSourceKey> dataSourceKey = new ThreadLocal<>();
  11 +
  12 + public static DataSourceKey getDataSourceKey() {
  13 + return dataSourceKey.get();
  14 + }
  15 +
  16 + public static void setDataSourceKey(DataSourceKey type) {
  17 + dataSourceKey.set(type);
  18 + }
  19 +
  20 + public static void clearDataSourceKey() {
  21 + dataSourceKey.remove();
  22 + }
  23 +
  24 +
  25 +}
0 26 \ No newline at end of file
... ...
cloud/common/src/main/java/com/sincere/common/config/DataSourceKey.java 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +package com.sincere.common.config;
  2 +
  3 +/**
  4 + * 数据源定义
  5 + *
  6 + * @author owen
  7 + * @create 2017年7月2日
  8 + */
  9 +public enum DataSourceKey {
  10 + core, log ,sharding
  11 +}
0 12 \ No newline at end of file
... ...
cloud/common/src/main/java/com/sincere/common/constants/CommonConstants.java 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +package com.sincere.common.constants;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/17 15:18
  6 + * @description:
  7 + */
  8 +public interface CommonConstants {
  9 +
  10 + /**
  11 + * 树的根节点值
  12 + */
  13 + Integer TREE_ROOT = -1;
  14 +
  15 + String PANDA_REDIS_LIST_LEY = "panda_client_id_to_access:cloud";
  16 +
  17 + String DEFAULT_PARAMTER_KEY = "parameter";
  18 +
  19 +
  20 +
  21 +}
... ...
cloud/common/src/main/java/com/sincere/common/constants/MqQueueNameConstant.java 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +package com.sincere.common.constants;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/11/14 15:42
  6 + */
  7 +public interface MqQueueNameConstant {
  8 +
  9 + /**
  10 + * 系统日志队列
  11 + */
  12 + String SYS_LOG_QUEUE= "sys_log_queue";
  13 + /**
  14 + * 短信验证码队列
  15 + */
  16 + String MOBILE_CODE_QUEUE= "mobile_code_queue";
  17 + /**
  18 + * 邮件队列
  19 + */
  20 + String MAIL_CODE_QUEUE= "mail_code_queue";
  21 +}
... ...
cloud/common/src/main/java/com/sincere/common/constants/PandaServiceNameConstants.java 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +package com.sincere.common.constants;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/11/14 15:52
  6 + */
  7 +public interface PandaServiceNameConstants {
  8 +
  9 + String PANDA_AUTH = "PANDA_AUTH";
  10 + String PANDA_COMMON = "PANDA_COMMON";
  11 + String PANDA_CONFIG_SERVER = "PANDA_CONFIG_SERVER";
  12 + String PANDA_GATEWAY = "PANDA_GATEWAY";
  13 + String PANDA_SERVER = "PANDA_SERVER";
  14 + String PANDA_USER_SERVICE = "PANDA_USER_SERVICE";
  15 + String PANDA_GEN_SERVICE = "PANDA_GEN_SERVICE";
  16 +
  17 +}
... ...
cloud/common/src/main/java/com/sincere/common/constants/SecurityConstants.java 0 → 100644
... ... @@ -0,0 +1,61 @@
  1 +package com.sincere.common.constants;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/9 15:10
  6 + * @description: 安全配置常量
  7 + */
  8 +public interface SecurityConstants {
  9 +
  10 + /**
  11 + * token的header key
  12 + */
  13 + String TOKEN_HEADER = "Authorization";
  14 +
  15 + String CLOUD = "panda";
  16 +
  17 + String CLOUD_PREFIX = "panda_";
  18 +
  19 + /**
  20 + * jwt 加密key
  21 + */
  22 + String SIGN_KEY = "PANDA";
  23 +
  24 + /**
  25 + * sys_oauth_client_details 字段
  26 + */
  27 + String CLIENT_FIELDS = "client_id, client_secret, resources_ids, scope, authorized_grant_types,"
  28 + + "web_server_redirect_uri, authorities, access_token_validity,"
  29 + + "refresh_token_validity, addition_information, autoapprove";
  30 +
  31 + /**
  32 + * jdbcClientDetailsService查询sql
  33 + */
  34 + String BASE_FIND_STATEMENT = "select " + CLIENT_FIELDS + " from sys_oauth_client_details";
  35 +
  36 + /**
  37 + * 默认查询语句
  38 + */
  39 + String DEFAULT_FIND_STATEMENT = BASE_FIND_STATEMENT + " order by client_id";
  40 +
  41 + /**
  42 + * 根据client_id查询
  43 + */
  44 + String DEFAULT_FIND_STATEMENT_BY_CLIENT_ID = BASE_FIND_STATEMENT + " where client_id = ?";
  45 +
  46 +
  47 + String SPRING_SECURITY_MOBILE_KEY = "mobile";
  48 +
  49 + String SPRING_SECURITY_CODE_KEY = "code";
  50 +
  51 + /**
  52 + * 手机验证码登录的地址
  53 + */
  54 + String SPRING_SECURITY_MOBILE_TOKEN_URL = "/mobile/token";
  55 +
  56 +
  57 + String REDIS_CODE_PREFIX = "panda_code:";
  58 +
  59 + Integer REDIS_CODE_EXPIRE = 60;
  60 +
  61 +}
... ...
cloud/common/src/main/java/com/sincere/common/constants/UserConstants.java 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +package com.sincere.common.constants;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/17 09:24
  6 + * @description:
  7 + */
  8 +public interface UserConstants {
  9 +
  10 + /**
  11 + * jwt中 用户id的key
  12 + */
  13 + String USER_ID = "userId";
  14 +
  15 +
  16 + /**
  17 + * jwt中 用户userName的key
  18 + */
  19 + String USER_NAME = "userName";
  20 +
  21 + /**
  22 + * jwt中 角色集合的key
  23 + */
  24 + String AUTHORITIES = "authorities";
  25 +
  26 +}
... ...
cloud/common/src/main/java/com/sincere/common/entity/SysUser.java 0 → 100644
... ... @@ -0,0 +1,99 @@
  1 +package com.sincere.common.entity;
  2 +
  3 +
  4 +import lombok.Data;
  5 +import lombok.experimental.Accessors;
  6 +
  7 +import java.time.LocalDateTime;
  8 +
  9 +/**
  10 + * <p>
  11 + * 用户表
  12 + * </p>
  13 + *
  14 + * @author yukong
  15 + * @since 2018-10-08
  16 + */
  17 +@Data
  18 +@Accessors(chain = true)
  19 +public class SysUser {
  20 +
  21 + private static final long serialVersionUID = 1L;
  22 +
  23 + /**
  24 + * 主键ID
  25 + */
  26 + private Integer userId;
  27 +
  28 + /**
  29 + * 用户名
  30 + */
  31 + private String username;
  32 +
  33 + /**
  34 + * 密码
  35 + */
  36 + private String password;
  37 +
  38 + /**
  39 + * 邮箱
  40 + */
  41 + private String email;
  42 +
  43 + /**
  44 + * 手机号码
  45 + */
  46 + private String mobile;
  47 +
  48 + /**
  49 + * qq号码
  50 + */
  51 + private String qq;
  52 +
  53 + /**
  54 + * 微信号码
  55 + */
  56 + private String wechat;
  57 +
  58 + /**
  59 + * 微博url
  60 + */
  61 + private String weibo;
  62 +
  63 + /**
  64 + * 头像url
  65 + */
  66 + private String avatar;
  67 +
  68 + /**
  69 + * qq openid
  70 + */
  71 + private String qqOpenid;
  72 +
  73 + /**
  74 + * 微信openid
  75 + */
  76 + private String wechatOpenid;
  77 +
  78 + /**
  79 + * 微博openid
  80 + */
  81 + private String weiboOpenid;
  82 +
  83 + /**
  84 + * 创建时间
  85 + */
  86 + private LocalDateTime createTime;
  87 +
  88 + /**
  89 + * 更新时间
  90 + */
  91 + private LocalDateTime modifyTime;
  92 +
  93 + /**
  94 + * 是否删除 0-未删除 1-删除
  95 + */
  96 + private String delFlag;
  97 +
  98 +
  99 +}
... ...
cloud/common/src/main/java/com/sincere/common/enums/ApiErrorCodeEnum.java 0 → 100644
... ... @@ -0,0 +1,57 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +
  4 +import com.baomidou.mybatisplus.extension.api.IErrorCode;
  5 +
  6 +/**
  7 + * @author yukong
  8 + * @date 2019-04-20 18:54
  9 + */
  10 +public enum ApiErrorCodeEnum implements IErrorCode {
  11 + /**
  12 + * 失败
  13 + */
  14 + FAILED(-1, "失败"),
  15 + /**
  16 + * 成功
  17 + */
  18 + SUCCESS(0, "成功"),
  19 +
  20 + /**
  21 + * 认证失败
  22 + */
  23 + AUTHORIZED_FAILED(-2, "用户名或密码错误");
  24 +
  25 + private final long code;
  26 + private final String msg;
  27 +
  28 + ApiErrorCodeEnum(final long code, final String msg) {
  29 + this.code = code;
  30 + this.msg = msg;
  31 + }
  32 +
  33 + public static ApiErrorCodeEnum fromCode(long code) {
  34 + ApiErrorCodeEnum[] ecs = ApiErrorCodeEnum.values();
  35 + for (ApiErrorCodeEnum ec : ecs) {
  36 + if (ec.getCode() == code) {
  37 + return ec;
  38 + }
  39 + }
  40 + return SUCCESS;
  41 + }
  42 +
  43 + @Override
  44 + public long getCode() {
  45 + return code;
  46 + }
  47 +
  48 + @Override
  49 + public String getMsg() {
  50 + return msg;
  51 + }
  52 +
  53 + @Override
  54 + public String toString() {
  55 + return String.format(" ErrorCode:{code=%s, msg=%s} ", code, msg);
  56 + }
  57 +}
0 58 \ No newline at end of file
... ...
cloud/common/src/main/java/com/sincere/common/enums/DataStatusEnum.java 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/9 14:35
  6 + * @description: 数据状态枚举
  7 + */
  8 +public enum DataStatusEnum {
  9 +
  10 + NORMAL("0", "正常"),
  11 + LOCK("1","删除");
  12 +
  13 +
  14 + private String code;
  15 +
  16 + private String message;
  17 +
  18 + DataStatusEnum(String code, String message) {
  19 + this.code = code;
  20 + this.message = message;
  21 + }
  22 +
  23 + public String getCode() {
  24 + return code;
  25 + }
  26 +
  27 + public String getMessage() {
  28 + return message;
  29 + }
  30 +}
... ...
cloud/common/src/main/java/com/sincere/common/enums/JobDataStatusEnum.java 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author yukong
  5 + * @date 2018/10/9 14:35
  6 + * @description job任务状态枚举
  7 + */
  8 +public enum JobDataStatusEnum {
  9 +
  10 + /**
  11 + * 运行中
  12 + */
  13 + UP(0, "运行"),
  14 +
  15 + /**
  16 + * 停止
  17 + */
  18 + STOP(1,"停止");
  19 +
  20 +
  21 + private Integer code;
  22 +
  23 + private String message;
  24 +
  25 + JobDataStatusEnum(Integer code, String message) {
  26 + this.code = code;
  27 + this.message = message;
  28 + }
  29 +
  30 + public Integer getCode() {
  31 + return code;
  32 + }
  33 +
  34 + public String getMessage() {
  35 + return message;
  36 + }
  37 +}
... ...
cloud/common/src/main/java/com/sincere/common/enums/OperationStatusEnum.java 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/9 14:35
  6 + * @description: 用户状态枚举
  7 + */
  8 +public enum OperationStatusEnum {
  9 +
  10 + SUCCESS("0", "成功"),
  11 + FAIL("1","失败");
  12 +
  13 +
  14 + private String code;
  15 +
  16 + private String message;
  17 +
  18 + OperationStatusEnum(String code, String message) {
  19 + this.code = code;
  20 + this.message = message;
  21 + }
  22 +
  23 + public String getCode() {
  24 + return code;
  25 + }
  26 +
  27 + public String getMessage() {
  28 + return message;
  29 + }
  30 +}
... ...
cloud/common/src/main/java/com/sincere/common/enums/PasswordEncoderEnum.java 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author yukong
  5 + * @date 2019-04-23 14:15
  6 + */
  7 +public enum PasswordEncoderEnum {
  8 +
  9 + /**
  10 + * bcrypt加密
  11 + */
  12 + BCRYPT("{bcrypt}"),
  13 + /**
  14 + * 明文
  15 + */
  16 + NOOP("{noop}");
  17 +
  18 + private String value;
  19 +
  20 + private PasswordEncoderEnum(String value){
  21 + this.value = value;
  22 + }
  23 +
  24 + public String getValue() {
  25 + return value;
  26 + }
  27 +}
... ...
cloud/common/src/main/java/com/sincere/common/enums/ResourceTypeEnum.java 0 → 100644
... ... @@ -0,0 +1,29 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/17 16:03
  6 + * @description: 资源类型枚举
  7 + */
  8 +public enum ResourceTypeEnum {
  9 + MENU("0", "菜单"),
  10 + BUTTON("1","按钮");
  11 +
  12 +
  13 + private String code;
  14 +
  15 + private String message;
  16 +
  17 + ResourceTypeEnum(String code, String message) {
  18 + this.code = code;
  19 + this.message = message;
  20 + }
  21 +
  22 + public String getCode() {
  23 + return code;
  24 + }
  25 +
  26 + public String getMessage() {
  27 + return message;
  28 + }
  29 +}
... ...
cloud/common/src/main/java/com/sincere/common/enums/ResponseCodeEnum.java 0 → 100644
... ... @@ -0,0 +1,36 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/12 10:51
  6 + * @description: 响应信息code枚举
  7 + */
  8 +public enum ResponseCodeEnum {
  9 +
  10 + SUCCESS(0, "success"),
  11 +
  12 + NOT_LOGIN(-1,"need login"),
  13 +
  14 + FAIL(-1,"fail"),
  15 +
  16 + PERMISSION_DEFINED(2,"permission defined");
  17 +
  18 +
  19 + private Integer code;
  20 +
  21 + private String message;
  22 +
  23 + ResponseCodeEnum(Integer code, String message) {
  24 + this.code = code;
  25 + this.message = message;
  26 + }
  27 +
  28 + public Integer getCode() {
  29 + return code;
  30 + }
  31 +
  32 + public String getMessage() {
  33 + return message;
  34 + }
  35 +
  36 +}
... ...
cloud/common/src/main/java/com/sincere/common/enums/SmsMessageChannnelEnum.java 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +import lombok.Getter;
  4 +
  5 +/**
  6 + * @author: yukong
  7 + * @date: 2018/12/3 10:44
  8 + */
  9 +
  10 +public enum SmsMessageChannnelEnum {
  11 +
  12 + /**
  13 + * 腾讯云
  14 + */
  15 + TENCENT_CLOUD("smsTencentCloudMessageHandler", "腾讯云");
  16 +
  17 + @Getter
  18 + String code;
  19 +
  20 + @Getter
  21 + String desc;
  22 +
  23 + private SmsMessageChannnelEnum(String code, String desc) {
  24 + this.code = code;
  25 + this.desc = desc;
  26 + }
  27 +}
... ...
cloud/common/src/main/java/com/sincere/common/enums/SmsTemplateEnum.java 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +import lombok.Getter;
  4 +
  5 +/**
  6 + * @author: yukong
  7 + * @date: 2018/12/14 14:53
  8 + */
  9 +public enum SmsTemplateEnum {
  10 +
  11 + /**
  12 + * 腾讯云
  13 + */
  14 + LOGIN_CODE("程序咖啡厅", "238684");
  15 +
  16 + @Getter
  17 + String signName;
  18 +
  19 + @Getter
  20 + String tempalte;
  21 +
  22 + private SmsTemplateEnum(String signName, String tempalte) {
  23 + this.signName = signName;
  24 + this.tempalte = tempalte;
  25 + }
  26 +}
... ...
cloud/common/src/main/java/com/sincere/common/enums/SysLogTypeEnum.java 0 → 100644
... ... @@ -0,0 +1,29 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/17 16:03
  6 + * @description: 资源类型枚举
  7 + */
  8 +public enum SysLogTypeEnum {
  9 + LOGIN("0", "登录日志"),
  10 + OPERATOR("1","操作日志");
  11 +
  12 +
  13 + private String code;
  14 +
  15 + private String message;
  16 +
  17 + SysLogTypeEnum(String code, String message) {
  18 + this.code = code;
  19 + this.message = message;
  20 + }
  21 +
  22 + public String getCode() {
  23 + return code;
  24 + }
  25 +
  26 + public String getMessage() {
  27 + return message;
  28 + }
  29 +}
... ...
cloud/common/src/main/java/com/sincere/common/enums/UserStatusEnum.java 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/9 14:35
  6 + * @description: 用户状态枚举
  7 + */
  8 +public enum UserStatusEnum {
  9 +
  10 + /**
  11 + * 正常
  12 + */
  13 + NORMAL("0", "正常"),
  14 +
  15 + /**
  16 + * 锁定
  17 + */
  18 + LOCK("1","锁定");
  19 +
  20 +
  21 + private String code;
  22 +
  23 + private String message;
  24 +
  25 + UserStatusEnum(String code, String message) {
  26 + this.code = code;
  27 + this.message = message;
  28 + }
  29 +
  30 + public String getCode() {
  31 + return code;
  32 + }
  33 +
  34 + public String getMessage() {
  35 + return message;
  36 + }
  37 +}
... ...
cloud/common/src/main/java/com/sincere/common/model/log/SysLog.java 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +package com.sincere.common.model.log;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Builder;
  5 +import lombok.Data;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +import java.io.Serializable;
  9 +import java.util.Date;
  10 +
  11 +
  12 +/**
  13 +* @author 作者 owen E-mail: 624191343@qq.com
  14 +* @version 创建时间:2017年11月12日 上午22:57:51
  15 +* 日志实体
  16 + */
  17 +@Builder
  18 +@Data
  19 +@NoArgsConstructor
  20 +@AllArgsConstructor
  21 +public class SysLog implements Serializable {
  22 +
  23 + private static final long serialVersionUID = -5398795297842978376L;
  24 +
  25 + private Long id;
  26 +// 用户名
  27 + private String username;
  28 +// 归属模块
  29 + private String module;
  30 +// 执行方法的参数值
  31 + private String params;
  32 + private String remark;
  33 +// 是否执行成功
  34 + private Boolean flag;
  35 +
  36 + private Date createTime;
  37 +}
... ...
cloud/common/src/main/java/com/sincere/common/model/system/LoginAppUser.java 0 → 100644
... ... @@ -0,0 +1,93 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonIgnore;
  4 +import lombok.Getter;
  5 +import lombok.Setter;
  6 +import org.springframework.security.core.GrantedAuthority;
  7 +import org.springframework.security.core.authority.SimpleGrantedAuthority;
  8 +import org.springframework.security.core.userdetails.UserDetails;
  9 +import org.springframework.util.CollectionUtils;
  10 +
  11 +import java.io.Serializable;
  12 +import java.util.Collection;
  13 +import java.util.HashSet;
  14 +import java.util.Set;
  15 +
  16 +/**
  17 + * 用户实体绑定spring security
  18 + */
  19 +@Getter
  20 +@Setter
  21 +public class LoginAppUser extends SysUser implements UserDetails {
  22 +
  23 + /**
  24 + *
  25 + */
  26 + private static final long serialVersionUID = -3685249101751401211L;
  27 +
  28 + private Set<SysRole> sysRoles;
  29 +
  30 + private Set<String> permissions;
  31 +
  32 + /***
  33 + * 权限重写
  34 + */
  35 + @JsonIgnore
  36 + @Override
  37 + public Collection<? extends GrantedAuthority> getAuthorities() {
  38 + Collection<GrantedAuthority> collection = new HashSet<>();
  39 + if (!CollectionUtils.isEmpty(sysRoles)) {
  40 + sysRoles.parallelStream().forEach(role -> {
  41 + if (role.getCode().startsWith("ROLE_")) {
  42 + collection.add(new SimpleGrantedAuthority(role.getCode()));
  43 + } else {
  44 + collection.add(new SimpleGrantedAuthority("ROLE_" + role.getCode()));
  45 + }
  46 + });
  47 + }
  48 +
  49 + if (!CollectionUtils.isEmpty(permissions)) {
  50 + permissions.parallelStream().forEach(per -> {
  51 + collection.add(new SimpleGrantedAuthority(per));
  52 + });
  53 + }
  54 +
  55 + return collection;
  56 + }
  57 +
  58 +
  59 + @JsonIgnore
  60 + public Collection<? extends GrantedAuthority> putAll( Collection<GrantedAuthority> collections) {
  61 + Collection<GrantedAuthority> collection = new HashSet<>();
  62 +
  63 + collection.addAll(collections) ;
  64 +
  65 + return collection;
  66 + }
  67 +
  68 +
  69 + @Override
  70 + public boolean isAccountNonExpired() {
  71 + return true;
  72 + }
  73 +
  74 + @Override
  75 + public boolean isAccountNonLocked() {
  76 + return true;
  77 + }
  78 +
  79 + @Override
  80 + public boolean isCredentialsNonExpired() {
  81 + return true;
  82 + }
  83 +
  84 + @Override
  85 + public boolean isEnabled() {
  86 + return getEnabled();
  87 + }
  88 +
  89 + @Override
  90 + protected Serializable pkVal() {
  91 + return null;
  92 + }
  93 +}
... ...
cloud/common/src/main/java/com/sincere/common/model/system/SysMenu.java 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  4 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  5 +import lombok.Data;
  6 +
  7 +import java.io.Serializable;
  8 +import java.util.Date;
  9 +import java.util.List;
  10 +import java.util.Set;
  11 +
  12 +@Data
  13 +public class SysMenu implements Serializable {
  14 +
  15 + private static final long serialVersionUID = 749360940290141180L;
  16 + @JsonSerialize(using= ToStringSerializer.class)
  17 + private Long id;
  18 + private Long parentId;
  19 + private String name;
  20 + private String css;
  21 + private String url;
  22 + private String path;
  23 + private Integer sort;
  24 + private Date createTime;
  25 + private Date updateTime;
  26 + private Integer isMenu;
  27 + private Boolean hidden;
  28 +
  29 +
  30 + private List<SysMenu> subMenus;
  31 +
  32 + private Long roleId;
  33 + private Set<Long> menuIds;
  34 +
  35 +
  36 +
  37 +}
... ...
cloud/common/src/main/java/com/sincere/common/model/system/SysPermission.java 0 → 100644
... ... @@ -0,0 +1,47 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.IdType;
  4 +import com.baomidou.mybatisplus.annotation.TableField;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import com.baomidou.mybatisplus.extension.activerecord.Model;
  8 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  9 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  10 +import lombok.Data;
  11 +
  12 +import java.io.Serializable;
  13 +import java.util.Date;
  14 +import java.util.Set;
  15 +
  16 +
  17 +/**
  18 + * @author 作者 owen E-mail: 624191343@qq.com
  19 + * @version 创建时间:2017年11月12日 上午22:57:51
  20 + * 权限标识
  21 + */
  22 +@Data
  23 +@TableName("sys_permission")
  24 +public class SysPermission extends Model<SysPermission> implements Serializable {
  25 + /**
  26 + *
  27 + */
  28 + private static final long serialVersionUID = 1389727646460449239L;
  29 + @TableId(value="id",type= IdType.ID_WORKER) //雪花算法 id生成策略
  30 + @JsonSerialize(using= ToStringSerializer.class)
  31 + private Long id;
  32 + private String permission;
  33 + private String name;
  34 + @TableField(value="createTime")
  35 + private Date createTime;
  36 + @TableField(value="updateTime")
  37 + private Date updateTime;
  38 + @TableField(exist=false)
  39 + private Long roleId;
  40 + @TableField(exist=false)
  41 + private Set<Long> authIds;
  42 +
  43 + @Override
  44 + protected Serializable pkVal() {
  45 + return null;
  46 + }
  47 +}
... ...
cloud/common/src/main/java/com/sincere/common/model/system/SysRole.java 0 → 100644
... ... @@ -0,0 +1,29 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  4 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  5 +import lombok.Data;
  6 +
  7 +import java.io.Serializable;
  8 +import java.util.Date;
  9 +
  10 +/**
  11 + * @author 作者 owen E-mail: 624191343@qq.com
  12 + * @version 创建时间:2017年11月12日 上午22:57:51
  13 + * 角色
  14 + */
  15 +@Data
  16 +public class SysRole implements Serializable {
  17 +
  18 + /**
  19 + *
  20 + */
  21 + private static final long serialVersionUID = 4497149010220586111L;
  22 + @JsonSerialize(using= ToStringSerializer.class)
  23 + private Long id;
  24 + private String code;
  25 + private String name;
  26 + private Date createTime;
  27 + private Date updateTime;
  28 + private Long userId;
  29 +}
... ...
cloud/common/src/main/java/com/sincere/common/model/system/SysUser.java 0 → 100644
... ... @@ -0,0 +1,60 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.IdType;
  4 +import com.baomidou.mybatisplus.annotation.TableField;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import com.baomidou.mybatisplus.extension.activerecord.Model;
  8 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  9 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  10 +import lombok.Data;
  11 +
  12 +import java.io.Serializable;
  13 +import java.util.Date;
  14 +import java.util.List;
  15 +
  16 +/**
  17 + * @author 作者 owen E-mail: 624191343@qq.com
  18 + * @version 创建时间:2017年11月12日 上午22:57:51
  19 + * 用户实体
  20 + */
  21 +@Data
  22 +@TableName("sys_user")
  23 +public class SysUser extends Model<SysUser> implements Serializable {
  24 +
  25 + /**
  26 + *
  27 + */
  28 + private static final long serialVersionUID = -5886012896705137070L;
  29 + @TableId(value="id",type= IdType.ID_WORKER) //雪花算法 id生成策略
  30 + @JsonSerialize(using= ToStringSerializer.class)
  31 + private Long id;
  32 + private String username;
  33 + private String password;
  34 + private String nickname;
  35 + private String headImgUrl;
  36 + private String phone;
  37 + private Integer sex;
  38 + private Boolean enabled;
  39 + private String type;
  40 + @TableField(value="createTime")
  41 + private Date createTime;
  42 + @TableField(value="updateTime")
  43 + private Date updateTime;
  44 +
  45 + @TableField(exist=false)
  46 + private List<SysRole> roles;
  47 +
  48 + @TableField(exist=false)
  49 + private String roleId;
  50 +
  51 + @TableField(exist=false)
  52 + private String oldPassword;
  53 + @TableField(exist=false)
  54 + private String newPassword;
  55 +
  56 + @Override
  57 + protected Serializable pkVal() {
  58 + return null;
  59 + }
  60 +}
... ...
cloud/common/src/main/java/com/sincere/common/model/system/SysUserRole.java 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import lombok.Data;
  4 +
  5 +/**
  6 + * @Author: [gitgeek]
  7 + * @Date: [2018-08-06 21:29]
  8 + * @Description: [ ]
  9 + * @Version: [1.0.0]
  10 + * @Copy: [com.zzg]
  11 + */
  12 +@Data
  13 +public class SysUserRole {
  14 +
  15 + private String userId;
  16 + private String roleId;
  17 +
  18 +}
... ...
cloud/common/src/main/java/com/sincere/common/model/system/constants/UserType.java 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +package com.sincere.common.model.system.constants;
  2 +
  3 +
  4 +/**
  5 + * @author 作者 owen E-mail: 624191343@qq.com
  6 + * @version 创建时间:2017年11月12日 上午22:57:51
  7 + * 用户类型
  8 + */
  9 +public enum UserType {
  10 +
  11 + /**
  12 + * 前端app用户
  13 + */
  14 + APP,
  15 + /**
  16 + * 后端管理用户
  17 + */
  18 + BACKEND
  19 +}
... ...
cloud/common/src/main/java/com/sincere/common/props/PermitUrlProperties.java 0 → 100644
... ... @@ -0,0 +1,55 @@
  1 +package com.sincere.common.props;
  2 +
  3 +import org.springframework.boot.context.properties.ConfigurationProperties;
  4 +
  5 +import java.util.ArrayList;
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * @author 作者 owen E-mail: 624191343@qq.com
  10 + * @version 创建时间:2017年11月12日 上午22:57:51 url白名单处理 application.yml中配置需要放权的url白名单
  11 + */
  12 +// @ConfigurationProperties(prefix = "permit")
  13 +@ConfigurationProperties(prefix = "security.oauth2")
  14 +public class PermitUrlProperties {
  15 +
  16 + /**
  17 + * 监控中心和swagger需要访问的url
  18 + */
  19 + private static final String[] ENDPOINTS = {
  20 + "/**/actuator/**" , "/**/actuator/**/**" , //断点监控
  21 + "/**/v2/api-docs/**", "/**/swagger-ui.html", "/**/swagger-resources/**", "/**/webjars/**", //swagger
  22 + "/**/turbine.stream","/**/turbine.stream**/**", "/**/hystrix", "/**/hystrix.stream", "/**/hystrix/**", "/**/hystrix/**/**", "/**/proxy.stream/**" , //熔断监控
  23 + "/**/druid/**", "/**/favicon.ico", "/**/prometheus"
  24 + };
  25 +
  26 + private String[] ignored;
  27 +
  28 + /**
  29 + * 需要放开权限的url
  30 + *
  31 + * @param urls
  32 + * 自定义的url
  33 + * @return 自定义的url和监控中心需要访问的url集合
  34 + */
  35 + public String[] getIgnored() {
  36 + if (ignored == null || ignored.length == 0) {
  37 + return ENDPOINTS;
  38 + }
  39 +
  40 + List<String> list = new ArrayList<>();
  41 + for (String url : ENDPOINTS) {
  42 + list.add(url);
  43 + }
  44 + for (String url : ignored) {
  45 + list.add(url);
  46 + }
  47 +
  48 + return list.toArray(new String[list.size()]);
  49 + }
  50 +
  51 + public void setIgnored(String[] ignored) {
  52 + this.ignored = ignored;
  53 + }
  54 +
  55 +}
... ...
cloud/common/src/main/java/com/sincere/common/util/ApiResult.java 0 → 100644
... ... @@ -0,0 +1,51 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import com.sincere.common.enums.ResponseCodeEnum;
  4 +import lombok.Data;
  5 +
  6 +import java.io.Serializable;
  7 +
  8 +/**
  9 + * @author: yukong
  10 + * @date: 2018/10/12 10:39
  11 + * @description: 统一响应信息主体
  12 + */
  13 +@Data
  14 +public class ApiResult<T> implements Serializable {
  15 +
  16 + private T data;
  17 +
  18 + private Integer code = ResponseCodeEnum.SUCCESS.getCode();
  19 +
  20 + private String message = ResponseCodeEnum.SUCCESS.getMessage();
  21 +
  22 + public ApiResult() {
  23 + }
  24 +
  25 + public ApiResult(T data) {
  26 + this.data = data;
  27 + }
  28 +
  29 + public ApiResult(T data, String message) {
  30 + this.data = data;
  31 + this.message = message;
  32 + }
  33 +
  34 + public ApiResult(T data, ResponseCodeEnum responseCode) {
  35 + this.data = data;
  36 + this.code = responseCode.getCode();
  37 + this.message = responseCode.getMessage();
  38 + }
  39 +
  40 + public ApiResult(Throwable throwable) {
  41 + this.message = throwable.getMessage();
  42 + this.code = ResponseCodeEnum.FAIL.getCode();
  43 + }
  44 +
  45 + public ApiResult(Throwable throwable, ResponseCodeEnum code) {
  46 + this.message = throwable.getMessage();
  47 + this.code = code.getCode();
  48 + }
  49 +
  50 +
  51 +}
... ...
cloud/common/src/main/java/com/sincere/common/util/SpringUtils.java 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import org.springframework.beans.BeansException;
  4 +import org.springframework.context.ApplicationContext;
  5 +import org.springframework.context.ApplicationContextAware;
  6 +import org.springframework.core.env.Environment;
  7 +import org.springframework.stereotype.Component;
  8 +
  9 +/**
  10 + * spring获取bean工具类
  11 + *
  12 +* @author 作者 owen E-mail: 624191343@qq.com
  13 + * @version 创建时间:2018年3月20日 下午10:13:18 类说明
  14 + *
  15 + */
  16 +@Component
  17 +public class SpringUtils implements ApplicationContextAware {
  18 +
  19 + private static ApplicationContext applicationContext = null;
  20 +
  21 + @Override
  22 + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  23 + SpringUtils.applicationContext = applicationContext;
  24 + }
  25 +
  26 + public static <T> T getBean(Class<T> cla) {
  27 + return applicationContext.getBean(cla);
  28 + }
  29 +
  30 + public static <T> T getBean(String name, Class<T> cal) {
  31 + return applicationContext.getBean(name, cal);
  32 + }
  33 +
  34 + public static String getProperty(String key) {
  35 + return applicationContext.getBean(Environment.class).getProperty(key);
  36 + }
  37 +}
... ...
cloud/common/src/main/java/com/sincere/common/util/UrlUtil.java 0 → 100644
... ... @@ -0,0 +1,47 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import javax.servlet.http.HttpServletRequest;
  4 +import java.io.PrintWriter;
  5 +import java.io.StringWriter;
  6 +
  7 +/**
  8 + * @author: yukong
  9 + * @date: 2018/11/14 19:50
  10 + */
  11 +public class UrlUtil {
  12 +
  13 + /**
  14 + * 获取目标主机的ip
  15 + * @param request
  16 + * @return
  17 + */
  18 + public static String getRemoteHost(HttpServletRequest request) {
  19 + String ip = request.getHeader("x-forwarded-for");
  20 + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  21 + ip = request.getHeader("Proxy-Client-IP");
  22 + }
  23 + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  24 + ip = request.getHeader("WL-Proxy-Client-IP");
  25 + }
  26 + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  27 + ip = request.getRemoteAddr();
  28 + }
  29 + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
  30 + }
  31 +
  32 +
  33 + /**
  34 + * 获取完整的异常栈信息
  35 + * @param t
  36 + * @return
  37 + */
  38 + public static String getTrace(Throwable t) {
  39 + StringWriter stringWriter= new StringWriter();
  40 + PrintWriter writer= new PrintWriter(stringWriter);
  41 + t.printStackTrace(writer);
  42 + StringBuffer buffer= stringWriter.getBuffer();
  43 + return buffer.toString();
  44 + }
  45 +
  46 +
  47 +}
... ...
cloud/common/src/main/java/com/sincere/common/util/UserUtil.java 0 → 100644
... ... @@ -0,0 +1,95 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import com.sincere.common.constants.SecurityConstants;
  4 +import com.sincere.common.constants.UserConstants;
  5 +import io.jsonwebtoken.Claims;
  6 +import io.jsonwebtoken.Jwts;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +
  9 +import javax.servlet.http.HttpServletRequest;
  10 +import java.util.Base64;
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * @author: yukong
  15 + * @date: 2018/10/17 08:56
  16 + * @description:
  17 + */
  18 +@Slf4j
  19 +public class UserUtil {
  20 +
  21 + /**
  22 + * 获取请求中的token
  23 + * @param request
  24 + * @return token
  25 + */
  26 + public static String getToken(HttpServletRequest request){
  27 + String authorization = request.getHeader(SecurityConstants.TOKEN_HEADER);
  28 + if(authorization == null){
  29 + return null;
  30 + }
  31 + String token = authorization.split(" ")[1];
  32 + log.info("获取token成功,值为{}", token);
  33 + return token;
  34 + }
  35 +
  36 + /**
  37 + * 获取jwt中的claims信息
  38 + * @param token
  39 + * @return claim
  40 + */
  41 + public static Claims getClaims(String token) {
  42 + String key = Base64.getEncoder().encodeToString(SecurityConstants.SIGN_KEY.getBytes());
  43 + Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
  44 + return claims;
  45 + }
  46 +
  47 + /**
  48 + * 获取请求中的userId
  49 + * @param request
  50 + * @return userId
  51 + */
  52 + public static Integer getUserId(HttpServletRequest request){
  53 + String token = getToken(request);
  54 + if(token == null){
  55 + return null;
  56 + }
  57 + Claims claims = getClaims(token);
  58 + Integer userId = (Integer) claims.get(UserConstants.USER_ID);
  59 + log.info("获取userId成功,值为", userId);
  60 + return userId;
  61 + }
  62 +
  63 + /**
  64 + * 获取请求中的userId
  65 + * @param request
  66 + * @return userId
  67 + */
  68 + public static String getUserName(HttpServletRequest request){
  69 + String token = getToken(request);
  70 + if(token == null){
  71 + return null;
  72 + }
  73 + Claims claims = getClaims(token);
  74 + String username = (String) claims.get(UserConstants.USER_NAME);
  75 + log.info("获取username成功,值为", username);
  76 + return username;
  77 + }
  78 +
  79 + /**
  80 + * 获取请求中的roles集合
  81 + * @param request
  82 + * @return roles
  83 + */
  84 + public static List<String> getRoles(HttpServletRequest request) {
  85 + String token = getToken(request);
  86 + if(token == null){
  87 + return null;
  88 + }
  89 + Claims claims = getClaims(token);
  90 + List<String> roles = (List<String>) claims.get(UserConstants.AUTHORITIES);
  91 + return roles;
  92 + }
  93 +
  94 +
  95 +}
... ...