瀏覽代碼

first commit

Joshua Chung 6 年之前
當前提交
926475ad4d
共有 27 個檔案被更改,包括 1087 行新增0 行删除
  1. 25
    0
      .gitignore
  2. 二進制
      .mvn/wrapper/maven-wrapper.jar
  3. 1
    0
      .mvn/wrapper/maven-wrapper.properties
  4. 39
    0
      README.md
  5. 225
    0
      mvnw
  6. 143
    0
      mvnw.cmd
  7. 114
    0
      pom.xml
  8. 12
    0
      src/main/java/com/proximity/demo/DemoApplication.java
  9. 40
    0
      src/main/java/com/proximity/demo/account/model/Role.java
  10. 60
    0
      src/main/java/com/proximity/demo/account/model/User.java
  11. 7
    0
      src/main/java/com/proximity/demo/account/repository/RoleRepository.java
  12. 9
    0
      src/main/java/com/proximity/demo/account/repository/UserRepository.java
  13. 7
    0
      src/main/java/com/proximity/demo/account/service/SecurityService.java
  14. 45
    0
      src/main/java/com/proximity/demo/account/service/SecurityServiceImpl.java
  15. 33
    0
      src/main/java/com/proximity/demo/account/service/UserDetailsServiceImpl.java
  16. 9
    0
      src/main/java/com/proximity/demo/account/service/UserService.java
  17. 32
    0
      src/main/java/com/proximity/demo/account/service/UserServiceImpl.java
  18. 42
    0
      src/main/java/com/proximity/demo/account/validator/UserValidator.java
  19. 64
    0
      src/main/java/com/proximity/demo/account/web/UserController.java
  20. 4
    0
      src/main/resources/application.properties
  21. 46
    0
      src/main/resources/db.sql
  22. 0
    0
      src/main/resources/logback.xml
  23. 5
    0
      src/main/resources/validation.properties
  24. 53
    0
      src/main/webapp/WEB-INF/appconfig-data.xml
  25. 27
    0
      src/main/webapp/WEB-INF/appconfig-mvc.xml
  26. 29
    0
      src/main/webapp/WEB-INF/appconfig-security.xml
  27. 16
    0
      src/test/java/com/proximity/demo/DemoApplicationTests.java

+ 25
- 0
.gitignore 查看文件

@@ -0,0 +1,25 @@
1
+/target/
2
+!.mvn/wrapper/maven-wrapper.jar
3
+
4
+### STS ###
5
+.apt_generated
6
+.classpath
7
+.factorypath
8
+.project
9
+.settings
10
+.springBeans
11
+.sts4-cache
12
+
13
+### IntelliJ IDEA ###
14
+.idea
15
+*.iws
16
+*.iml
17
+*.ipr
18
+
19
+### NetBeans ###
20
+/nbproject/private/
21
+/build/
22
+/nbbuild/
23
+/dist/
24
+/nbdist/
25
+/.nb-gradle/

二進制
.mvn/wrapper/maven-wrapper.jar 查看文件


+ 1
- 0
.mvn/wrapper/maven-wrapper.properties 查看文件

@@ -0,0 +1 @@
1
+distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip

+ 39
- 0
README.md 查看文件

@@ -0,0 +1,39 @@
1
+Passion Project Proximity Description Proximity is going to be a mobile app for events. Both users and businesses will be able to create and search for events. This will allow users to connect with their city by finding new events with ease of access. Business will be able to market their events through a new platform. Users will be able to log in using either Gmail and Facebook account using OAuth2 protocol, or create a regular account through the app.
2
+
3
+FrontEnd UI (React Native using Javascript)
4
+
5
+-Description- The basic UI of the app after logging in will be a map of general proximity and user's current location. Events will be shown on the map in a pop up bubble with title of event and location. If user clicks on the event bubble, a floating window with event description, location, date, number of invites and accepts, option to save into user's events, and share.
6
+
7
+-Features-
8
+
9
+A search bar will be set on the top to look for specific events. [FILTER] button will be set on the search bar:
10
+
11
+By time: year, month, week, day, current Public, private, friends, sponsored events etc.. Floating [MENU] button will show list of various options:
12
+
13
+[DISCOVER]: shows random events happening [CATEGORIES]: shows different types of events [CREATE EVENT]: user will be able to create event [MY EVENTS]: shows all saved events [SETTINGS]: various personal settings User Status:
14
+
15
+Currently attending Event crowd level etc.. Sponsored events will have larger proximity when zooming out from map.
16
+
17
+Link to buy tickets for event If an event is currently happening, event window will glow with timer until the end of event.
18
+
19
+-Requirements-
20
+
21
+Reactive Native Create Android Virtual Device Testing done through Android SDK Create and Aquire images for UI Google Maps API Maps SDK for android (https://developers.google.com/maps/documentation/android-sdk/intro) When user's and businesses create events with specific addresses, it will show on Proximity's map. Eventbrite API (https://www.eventbrite.com/developer/v3/) Posts events from Eventbrite to Proximity and categorizes events into [CATEGORIES] Will be able to automatically show venue location, info, etc.. Ticketmaster API (https://developer.ticketmaster.com/) Same as Eventbrite Server (Spring Boot/Android)
22
+
23
+-Description- Spring for Android is a framework that is designed to provide components of the Spring family of projects for us in Android apps. It features a Rest Client for Android and Auth support for accessing secure APIs.
24
+
25
+-Maven-
26
+
27
+<groupId>org.springframework.android</groupId>
28
+<artifactId>spring-android-rest-template</artifactId>
29
+<version>2.0.0.M3</version>
30
+<id>spring-milestones</id>
31
+<name>Spring Milestones</name>
32
+<url>https://repo.spring.io/libs-milestone</url>
33
+<snapshots>
34
+    <enabled>false</enabled>
35
+</snapshots>
36
+Database (SQLite for Users and MySQL for main database) -Description- SQLite is a relational database, a lighter version of SQL designed for mobile. It is an in-process library that implements a self-contained, server-less, zero-configuration, transactional SQL database engine. It is an embedded SQL database engine without any separate server process, unlike any other SQL database. SQLite can be stored both on disk as well as in memory and each database file is a single disk file and can be used cross-platform. It is very fast and need very less memory to operate.
37
+-Implementation-
38
+
39
+User database Event databases Ticketmaster Eventbrite User Event Business' Event

+ 225
- 0
mvnw 查看文件

@@ -0,0 +1,225 @@
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
+#    http://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 Migwn, 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
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
204
+echo $MAVEN_PROJECTBASEDIR
205
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
206
+
207
+# For Cygwin, switch paths to Windows format before running java
208
+if $cygwin; then
209
+  [ -n "$M2_HOME" ] &&
210
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
211
+  [ -n "$JAVA_HOME" ] &&
212
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
213
+  [ -n "$CLASSPATH" ] &&
214
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
215
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
216
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
217
+fi
218
+
219
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
220
+
221
+exec "$JAVACMD" \
222
+  $MAVEN_OPTS \
223
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
224
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
225
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 143
- 0
mvnw.cmd 查看文件

@@ -0,0 +1,143 @@
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    http://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 enable echoing my setting MAVEN_BATCH_ECHO to 'on'
39
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
40
+
41
+@REM set %HOME% to equivalent of $HOME
42
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
43
+
44
+@REM Execute a user defined script before this one
45
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
46
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
47
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
48
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
49
+:skipRcPre
50
+
51
+@setlocal
52
+
53
+set ERROR_CODE=0
54
+
55
+@REM To isolate internal variables from possible post scripts, we use another setlocal
56
+@setlocal
57
+
58
+@REM ==== START VALIDATION ====
59
+if not "%JAVA_HOME%" == "" goto OkJHome
60
+
61
+echo.
62
+echo Error: JAVA_HOME not found in your environment. >&2
63
+echo Please set the JAVA_HOME variable in your environment to match the >&2
64
+echo location of your Java installation. >&2
65
+echo.
66
+goto error
67
+
68
+:OkJHome
69
+if exist "%JAVA_HOME%\bin\java.exe" goto init
70
+
71
+echo.
72
+echo Error: JAVA_HOME is set to an invalid directory. >&2
73
+echo JAVA_HOME = "%JAVA_HOME%" >&2
74
+echo Please set the JAVA_HOME variable in your environment to match the >&2
75
+echo location of your Java installation. >&2
76
+echo.
77
+goto error
78
+
79
+@REM ==== END VALIDATION ====
80
+
81
+:init
82
+
83
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
84
+@REM Fallback to current working directory if not found.
85
+
86
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
87
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
88
+
89
+set EXEC_DIR=%CD%
90
+set WDIR=%EXEC_DIR%
91
+:findBaseDir
92
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
93
+cd ..
94
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
95
+set WDIR=%CD%
96
+goto findBaseDir
97
+
98
+:baseDirFound
99
+set MAVEN_PROJECTBASEDIR=%WDIR%
100
+cd "%EXEC_DIR%"
101
+goto endDetectBaseDir
102
+
103
+:baseDirNotFound
104
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
105
+cd "%EXEC_DIR%"
106
+
107
+:endDetectBaseDir
108
+
109
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
110
+
111
+@setlocal EnableExtensions EnableDelayedExpansion
112
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
113
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
114
+
115
+:endReadAdditionalConfig
116
+
117
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
118
+
119
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
120
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
121
+
122
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
123
+if ERRORLEVEL 1 goto error
124
+goto end
125
+
126
+:error
127
+set ERROR_CODE=1
128
+
129
+:end
130
+@endlocal & set ERROR_CODE=%ERROR_CODE%
131
+
132
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
133
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
134
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
135
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
136
+:skipRcPost
137
+
138
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
139
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
140
+
141
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
142
+
143
+exit /B %ERROR_CODE%

+ 114
- 0
pom.xml 查看文件

@@ -0,0 +1,114 @@
1
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
2
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3
+    <modelVersion>4.0.0</modelVersion>
4
+    <groupId>com.hellokoding</groupId>
5
+    <artifactId>account</artifactId>
6
+    <packaging>war</packaging>
7
+    <version>1.0-SNAPSHOT</version>
8
+    <name>Account Registration Webapp</name>
9
+    <url>http://maven.apache.org</url>
10
+    <properties>
11
+        <spring.version>4.2.0.RELEASE</spring.version>
12
+        <spring-security.version>4.0.2.RELEASE</spring-security.version>
13
+        <spring-data-jpa.version>1.8.2.RELEASE</spring-data-jpa.version>
14
+        <hibernate.version>4.3.11.Final</hibernate.version>
15
+        <hibernate-validator.version>5.2.1.Final</hibernate-validator.version>
16
+        <mysql-connector.version>5.1.36</mysql-connector.version>
17
+        <commons-dbcp.version>1.4</commons-dbcp.version>
18
+        <jstl.version>1.2</jstl.version>
19
+        <junit.version>3.8.1</junit.version>
20
+        <logback.version>1.1.3</logback.version>
21
+        <maven.compiler.source>1.8</maven.compiler.source>
22
+        <maven.compiler.target>1.8</maven.compiler.target>
23
+    </properties>
24
+
25
+    <dependencies>
26
+        <dependency>
27
+            <groupId>org.springframework</groupId>
28
+            <artifactId>spring-web</artifactId>
29
+            <version>${spring.version}</version>
30
+        </dependency>
31
+
32
+        <dependency>
33
+            <groupId>org.springframework</groupId>
34
+            <artifactId>spring-webmvc</artifactId>
35
+            <version>${spring.version}</version>
36
+        </dependency>
37
+
38
+        <dependency>
39
+            <groupId>org.springframework.security</groupId>
40
+            <artifactId>spring-security-web</artifactId>
41
+            <version>${spring-security.version}</version>
42
+        </dependency>
43
+
44
+        <dependency>
45
+            <groupId>org.springframework.security</groupId>
46
+            <artifactId>spring-security-config</artifactId>
47
+            <version>${spring-security.version}</version>
48
+        </dependency>
49
+
50
+        <dependency>
51
+            <groupId>org.hibernate</groupId>
52
+            <artifactId>hibernate-validator</artifactId>
53
+            <version>${hibernate-validator.version}</version>
54
+        </dependency>
55
+
56
+        <dependency>
57
+            <groupId>org.springframework.data</groupId>
58
+            <artifactId>spring-data-jpa</artifactId>
59
+            <version>${spring-data-jpa.version}</version>
60
+        </dependency>
61
+
62
+        <dependency>
63
+            <groupId>org.hibernate</groupId>
64
+            <artifactId>hibernate-entitymanager</artifactId>
65
+            <version>${hibernate.version}</version>
66
+        </dependency>
67
+
68
+        <dependency>
69
+            <groupId>mysql</groupId>
70
+            <artifactId>mysql-connector-java</artifactId>
71
+            <version>${mysql-connector.version}</version>
72
+        </dependency>
73
+
74
+        <dependency>
75
+            <groupId>commons-dbcp</groupId>
76
+            <artifactId>commons-dbcp</artifactId>
77
+            <version>${commons-dbcp.version}</version>
78
+        </dependency>
79
+
80
+        <dependency>
81
+            <groupId>javax.servlet</groupId>
82
+            <artifactId>jstl</artifactId>
83
+            <version>${jstl.version}</version>
84
+        </dependency>
85
+
86
+        <dependency>
87
+            <groupId>junit</groupId>
88
+            <artifactId>junit</artifactId>
89
+            <version>${junit.version}</version>
90
+            <scope>test</scope>
91
+        </dependency>
92
+
93
+        <dependency>
94
+            <groupId>ch.qos.logback</groupId>
95
+            <artifactId>logback-classic</artifactId>
96
+            <version>${logback.version}</version>
97
+        </dependency>
98
+    </dependencies>
99
+    <build>
100
+        <plugins>
101
+            <plugin>
102
+                <groupId>org.eclipse.jetty</groupId>
103
+                <artifactId>jetty-maven-plugin</artifactId>
104
+                <version>9.2.11.v20150529</version>
105
+                <configuration>
106
+                    <scanIntervalSeconds>10</scanIntervalSeconds>
107
+                    <webApp>
108
+                        <contextPath>/</contextPath>
109
+                    </webApp>
110
+                </configuration>
111
+            </plugin>
112
+        </plugins>
113
+    </build>
114
+</project>

+ 12
- 0
src/main/java/com/proximity/demo/DemoApplication.java 查看文件

@@ -0,0 +1,12 @@
1
+package com.proximity.demo;
2
+
3
+import org.springframework.boot.SpringApplication;
4
+import org.springframework.boot.autoconfigure.SpringBootApplication;
5
+
6
+@SpringBootApplication
7
+public class DemoApplication {
8
+
9
+    public static void main(String[] args) {
10
+        SpringApplication.run(DemoApplication.class, args);
11
+    }
12
+}

+ 40
- 0
src/main/java/com/proximity/demo/account/model/Role.java 查看文件

@@ -0,0 +1,40 @@
1
+package com.proximity.demo.account.model;
2
+
3
+import javax.persistence.*;
4
+import java.util.Set;
5
+
6
+@Entity
7
+@Table(name = "role")
8
+public class Role {
9
+    private Long id;
10
+    private String name;
11
+    private Set<User> users;
12
+
13
+    @Id
14
+    @GeneratedValue(strategy = GenerationType.AUTO)
15
+    public Long getId() {
16
+        return id;
17
+    }
18
+
19
+    public void setId(Long id) {
20
+        this.id = id;
21
+    }
22
+
23
+    public String getName() {
24
+        return name;
25
+    }
26
+
27
+    public void setName(String name) {
28
+        this.name = name;
29
+    }
30
+
31
+    @ManyToMany(mappedBy = "roles")
32
+    public Set<User> getUsers() {
33
+        return users;
34
+    }
35
+
36
+    public void setUsers(Set<User> users) {
37
+        this.users = users;
38
+    }
39
+}
40
+

+ 60
- 0
src/main/java/com/proximity/demo/account/model/User.java 查看文件

@@ -0,0 +1,60 @@
1
+package com.proximity.demo.account.model;
2
+
3
+import javax.persistence.*;
4
+import java.util.Set;
5
+
6
+@Entity
7
+@Table(name = "user")
8
+public class User {
9
+    private Long id;
10
+    private String username;
11
+    private String password;
12
+    private String passwordConfirm;
13
+    private Set<Role> roles;
14
+
15
+    @Id
16
+    @GeneratedValue(strategy = GenerationType.AUTO)
17
+    public Long getId() {
18
+        return id;
19
+    }
20
+
21
+    public void setId(Long id) {
22
+        this.id = id;
23
+    }
24
+
25
+    public String getUsername() {
26
+        return username;
27
+    }
28
+
29
+    public void setUsername(String username) {
30
+        this.username = username;
31
+    }
32
+
33
+    public String getPassword() {
34
+        return password;
35
+    }
36
+
37
+    public void setPassword(String password) {
38
+        this.password = password;
39
+    }
40
+
41
+    @Transient
42
+    public String getPasswordConfirm() {
43
+        return passwordConfirm;
44
+    }
45
+
46
+    public void setPasswordConfirm(String passwordConfirm) {
47
+        this.passwordConfirm = passwordConfirm;
48
+    }
49
+
50
+    @ManyToMany
51
+    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
52
+    public Set<Role> getRoles() {
53
+        return roles;
54
+    }
55
+
56
+    public void setRoles(Set<Role> roles) {
57
+        this.roles = roles;
58
+    }
59
+}
60
+

+ 7
- 0
src/main/java/com/proximity/demo/account/repository/RoleRepository.java 查看文件

@@ -0,0 +1,7 @@
1
+package com.proximity.demo.account.repository;
2
+
3
+import com.proximity.demo.account.model.Role;
4
+import org.springframework.data.jpa.repository.JpaRepository;
5
+
6
+public interface RoleRepository extends JpaRepository<Role, Long>{
7
+}

+ 9
- 0
src/main/java/com/proximity/demo/account/repository/UserRepository.java 查看文件

@@ -0,0 +1,9 @@
1
+package com.proximity.demo.account.repository;
2
+
3
+import com.proximity.demo.account.model.User;
4
+import org.springframework.data.jpa.repository.JpaRepository;
5
+
6
+public interface UserRepository extends JpaRepository<User, Long> {
7
+    User findByUsername(String username);
8
+}
9
+

+ 7
- 0
src/main/java/com/proximity/demo/account/service/SecurityService.java 查看文件

@@ -0,0 +1,7 @@
1
+package com.proximity.demo.account.service;
2
+
3
+public interface SecurityService {
4
+    String findLoggedInUsername();
5
+
6
+    void autologin(String username, String password);
7
+}

+ 45
- 0
src/main/java/com/proximity/demo/account/service/SecurityServiceImpl.java 查看文件

@@ -0,0 +1,45 @@
1
+package com.proximity.demo.account.service;
2
+
3
+import org.slf4j.Logger;
4
+import org.slf4j.LoggerFactory;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.security.authentication.AuthenticationManager;
7
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
8
+import org.springframework.security.core.context.SecurityContextHolder;
9
+import org.springframework.security.core.userdetails.UserDetails;
10
+import org.springframework.security.core.userdetails.UserDetailsService;
11
+import org.springframework.stereotype.Service;
12
+
13
+@Service
14
+public class SecurityServiceImpl implements SecurityService{
15
+    @Autowired
16
+    private AuthenticationManager authenticationManager;
17
+
18
+    @Autowired
19
+    private UserDetailsService userDetailsService;
20
+
21
+    private static final Logger logger = LoggerFactory.getLogger(SecurityServiceImpl.class);
22
+
23
+    @Override
24
+    public String findLoggedInUsername() {
25
+        Object userDetails = SecurityContextHolder.getContext().getAuthentication().getDetails();
26
+        if (userDetails instanceof UserDetails) {
27
+            return ((UserDetails)userDetails).getUsername();
28
+        }
29
+
30
+        return null;
31
+    }
32
+
33
+    @Override
34
+    public void autologin(String username, String password) {
35
+        UserDetails userDetails = userDetailsService.loadUserByUsername(username);
36
+        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities());
37
+
38
+        authenticationManager.authenticate(usernamePasswordAuthenticationToken);
39
+
40
+        if (usernamePasswordAuthenticationToken.isAuthenticated()) {
41
+            SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
42
+            logger.debug(String.format("Auto login %s successfully!", username));
43
+        }
44
+    }
45
+}

+ 33
- 0
src/main/java/com/proximity/demo/account/service/UserDetailsServiceImpl.java 查看文件

@@ -0,0 +1,33 @@
1
+package com.proximity.demo.account.service;
2
+
3
+import com.proximity.demo.account.model.Role;
4
+import com.proximity.demo.account.model.User;
5
+import com.proximity.demo.account.repository.UserRepository;
6
+import org.springframework.beans.factory.annotation.Autowired;
7
+import org.springframework.security.core.GrantedAuthority;
8
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
9
+import org.springframework.security.core.userdetails.UserDetails;
10
+import org.springframework.security.core.userdetails.UserDetailsService;
11
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
12
+import org.springframework.transaction.annotation.Transactional;
13
+
14
+import java.util.HashSet;
15
+import java.util.Set;
16
+
17
+public class UserDetailsServiceImpl implements UserDetailsService{
18
+    @Autowired
19
+    private UserRepository userRepository;
20
+
21
+    @Override
22
+    @Transactional(readOnly = true)
23
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
24
+        User user = userRepository.findByUsername(username);
25
+
26
+        Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
27
+        for (Role role : user.getRoles()){
28
+            grantedAuthorities.add(new SimpleGrantedAuthority(role.getName()));
29
+        }
30
+
31
+        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities);
32
+    }
33
+}

+ 9
- 0
src/main/java/com/proximity/demo/account/service/UserService.java 查看文件

@@ -0,0 +1,9 @@
1
+package com.proximity.demo.account.service;
2
+
3
+import com.proximity.demo.account.model.User;
4
+
5
+public interface UserService {
6
+    void save(User user);
7
+
8
+    User findByUsername(String username);
9
+}

+ 32
- 0
src/main/java/com/proximity/demo/account/service/UserServiceImpl.java 查看文件

@@ -0,0 +1,32 @@
1
+package com.proximity.demo.account.service;
2
+
3
+import com.proximity.demo.account.model.User;
4
+import com.proximity.demo.account.repository.RoleRepository;
5
+import com.proximity.demo.account.repository.UserRepository;
6
+import org.springframework.beans.factory.annotation.Autowired;
7
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
8
+import org.springframework.stereotype.Service;
9
+
10
+import java.util.HashSet;
11
+
12
+@Service
13
+public class UserServiceImpl implements UserService {
14
+    @Autowired
15
+    private UserRepository userRepository;
16
+    @Autowired
17
+    private RoleRepository roleRepository;
18
+    @Autowired
19
+    private BCryptPasswordEncoder bCryptPasswordEncoder;
20
+
21
+    @Override
22
+    public void save(User user) {
23
+        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
24
+        user.setRoles(new HashSet<>(roleRepository.findAll()));
25
+        userRepository.save(user);
26
+    }
27
+
28
+    @Override
29
+    public User findByUsername(String username) {
30
+        return userRepository.findByUsername(username);
31
+    }
32
+}

+ 42
- 0
src/main/java/com/proximity/demo/account/validator/UserValidator.java 查看文件

@@ -0,0 +1,42 @@
1
+package com.proximity.demo.account.validator;
2
+
3
+import com.proximity.demo.account.model.User;
4
+import com.proximity.demo.account.service.UserService;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.stereotype.Component;
7
+import org.springframework.validation.Errors;
8
+import org.springframework.validation.ValidationUtils;
9
+import org.springframework.validation.Validator;
10
+
11
+@Component
12
+public class UserValidator implements Validator {
13
+    @Autowired
14
+    private UserService userService;
15
+
16
+    @Override
17
+    public boolean supports(Class<?> aClass) {
18
+        return User.class.equals(aClass);
19
+    }
20
+
21
+    @Override
22
+    public void validate(Object o, Errors errors) {
23
+        User user = (User) o;
24
+
25
+        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "NotEmpty");
26
+        if (user.getUsername().length() < 6 || user.getUsername().length() > 32) {
27
+            errors.rejectValue("username", "Size.userForm.username");
28
+        }
29
+        if (userService.findByUsername(user.getUsername()) != null) {
30
+            errors.rejectValue("username", "Duplicate.userForm.username");
31
+        }
32
+
33
+        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "NotEmpty");
34
+        if (user.getPassword().length() < 8 || user.getPassword().length() > 32) {
35
+            errors.rejectValue("password", "Size.userForm.password");
36
+        }
37
+
38
+        if (!user.getPasswordConfirm().equals(user.getPassword())) {
39
+            errors.rejectValue("passwordConfirm", "Diff.userForm.passwordConfirm");
40
+        }
41
+    }
42
+}

+ 64
- 0
src/main/java/com/proximity/demo/account/web/UserController.java 查看文件

@@ -0,0 +1,64 @@
1
+package com.proximity.demo.account.web;
2
+
3
+import com.proximity.demo.account.model.User;
4
+import com.proximity.demo.account.service.SecurityService;
5
+import com.proximity.demo.account.service.UserService;
6
+import com.proximity.demo.account.validator.UserValidator;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.stereotype.Controller;
9
+import org.springframework.ui.Model;
10
+import org.springframework.validation.BindingResult;
11
+import org.springframework.web.bind.annotation.ModelAttribute;
12
+import org.springframework.web.bind.annotation.RequestMapping;
13
+import org.springframework.web.bind.annotation.RequestMethod;
14
+
15
+@Controller
16
+public class UserController {
17
+    @Autowired
18
+    private UserService userService;
19
+
20
+    @Autowired
21
+    private SecurityService securityService;
22
+
23
+    @Autowired
24
+    private UserValidator userValidator;
25
+
26
+    @RequestMapping(value = "/registration", method = RequestMethod.GET)
27
+    public String registration(Model model) {
28
+        model.addAttribute("userForm", new User());
29
+
30
+        return "registration";
31
+    }
32
+
33
+    @RequestMapping(value = "/registration", method = RequestMethod.POST)
34
+    public String registration(@ModelAttribute("userForm") User userForm, BindingResult bindingResult, Model model) {
35
+        userValidator.validate(userForm, bindingResult);
36
+
37
+        if (bindingResult.hasErrors()) {
38
+            return "registration";
39
+        }
40
+
41
+        userService.save(userForm);
42
+
43
+        securityService.autologin(userForm.getUsername(), userForm.getPasswordConfirm());
44
+
45
+        return "redirect:/welcome";
46
+    }
47
+
48
+    @RequestMapping(value = "/login", method = RequestMethod.GET)
49
+    public String login(Model model, String error, String logout) {
50
+        if (error != null)
51
+            model.addAttribute("error", "Your username and password is invalid.");
52
+
53
+        if (logout != null)
54
+            model.addAttribute("message", "You have been logged out successfully.");
55
+
56
+        return "login";
57
+    }
58
+
59
+    @RequestMapping(value = {"/", "/welcome"}, method = RequestMethod.GET)
60
+    public String welcome(Model model) {
61
+        return "welcome";
62
+    }
63
+}
64
+

+ 4
- 0
src/main/resources/application.properties 查看文件

@@ -0,0 +1,4 @@
1
+jdbc.driverClassName=com.mysql.jdbc.Driver
2
+jdbc.url=jdbc:mysql://localhost:3306/accounts?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
3
+jdbc.username=hellokoding
4
+jdbc.password=hellokoding

+ 46
- 0
src/main/resources/db.sql 查看文件

@@ -0,0 +1,46 @@
1
+CREATE DATABASE  IF NOT EXISTS `accounts`;
2
+USE `accounts`;
3
+--
4
+-- Table structure for table `role`
5
+--
6
+
7
+DROP TABLE IF EXISTS `role`;
8
+CREATE TABLE `role` (
9
+  `id` int(11) NOT NULL AUTO_INCREMENT,
10
+  `name` varchar(45) DEFAULT NULL,
11
+  PRIMARY KEY (`id`)
12
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
13
+
14
+--
15
+-- Dumping data for table `role`
16
+--
17
+
18
+LOCK TABLES `role` WRITE;
19
+INSERT INTO `role` VALUES (1,'ROLE_USER');
20
+UNLOCK TABLES;
21
+
22
+--
23
+-- Table structure for table `user`
24
+--
25
+
26
+DROP TABLE IF EXISTS `user`;
27
+CREATE TABLE `user` (
28
+  `id` int(11) NOT NULL AUTO_INCREMENT,
29
+  `username` varchar(255) DEFAULT NULL,
30
+  `password` varchar(255) DEFAULT NULL,
31
+  PRIMARY KEY (`id`)
32
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
33
+
34
+--
35
+-- Table structure for table `user_role`
36
+--
37
+
38
+DROP TABLE IF EXISTS `user_role`;
39
+CREATE TABLE `user_role` (
40
+  `user_id` int(11) NOT NULL,
41
+  `role_id` int(11) NOT NULL,
42
+  PRIMARY KEY (`user_id`,`role_id`),
43
+  KEY `fk_user_role_roleid_idx` (`role_id`),
44
+  CONSTRAINT `fk_user_role_roleid` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
45
+  CONSTRAINT `fk_user_role_userid` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
46
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;

+ 0
- 0
src/main/resources/logback.xml 查看文件


+ 5
- 0
src/main/resources/validation.properties 查看文件

@@ -0,0 +1,5 @@
1
+NotEmpty=This field is required.
2
+Size.userForm.username=Please use between 6 and 32 characters.
3
+Duplicate.userForm.username=Someone already has that username.
4
+Size.userForm.password=Try one with at least 8 characters.
5
+Diff.userForm.passwordConfirm=These passwords don't match.

+ 53
- 0
src/main/webapp/WEB-INF/appconfig-data.xml 查看文件

@@ -0,0 +1,53 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
+       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
4
+       xmlns:tx="http://www.springframework.org/schema/tx"
5
+       xmlns="http://www.springframework.org/schema/beans"
6
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
7
+    http://www.springframework.org/schema/beans/spring-beans.xsd
8
+    http://www.springframework.org/schema/data/jpa
9
+    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
10
+    http://www.springframework.org/schema/tx
11
+    http://www.springframework.org/schema/tx/spring-tx.xsd">
12
+
13
+
14
+    <!-- Configure the data source bean -->
15
+    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
16
+        <property name="driverClassName" value="${jdbc.driverClassName}"/>
17
+        <property name="url" value="${jdbc.url}"/>
18
+        <property name="username" value="${jdbc.username}"/>
19
+        <property name="password" value="${jdbc.password}"/>
20
+    </bean>
21
+
22
+    <!-- Configure the entity manager factory bean -->
23
+    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
24
+        <property name="dataSource" ref="dataSource"/>
25
+        <property name="packagesToScan" value="com.proximity.demo.account.model"/>
26
+        <property name="jpaVendorAdapter">
27
+            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
28
+        </property>
29
+        <property name="jpaProperties">
30
+            <props>
31
+                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
32
+                <prop key="hibernate.show_sql">true</prop>
33
+            </props>
34
+        </property>
35
+    </bean>
36
+
37
+    <!-- Configure the transaction manager bean -->
38
+    <bean id="transactionManager"
39
+          class="org.springframework.orm.jpa.JpaTransactionManager">
40
+        <property name="entityManagerFactory" ref="entityManagerFactory"/>
41
+    </bean>
42
+
43
+    <!-- Enable annotation driven transaction management -->
44
+    <tx:annotation-driven/>
45
+
46
+    <!--
47
+      Configure Spring Data JPA and set the base package of the
48
+      repository interfaces
49
+    -->
50
+
51
+    <jpa:repositories base-package="com.proximity.demo.account.repository"/>
52
+
53
+</beans>

+ 27
- 0
src/main/webapp/WEB-INF/appconfig-mvc.xml 查看文件

@@ -0,0 +1,27 @@
1
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2
+       xmlns:mvc="http://www.springframework.org/schema/mvc"
3
+       xmlns="http://www.springframework.org/schema/beans"
4
+       xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans
5
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
6
+
7
+    <mvc:annotation-driven/>
8
+
9
+    <mvc:resources mapping="/resources/**" location="/resources/"/>
10
+
11
+    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
12
+        <property name="basenames">
13
+            <list>
14
+                <value>classpath:validation</value>
15
+            </list>
16
+        </property>
17
+    </bean>
18
+
19
+    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
20
+        <property name="prefix">
21
+            <value>/WEB-INF/views/</value>
22
+        </property>
23
+        <property name="suffix">
24
+            <value>.jsp</value>
25
+        </property>
26
+    </bean>
27
+</beans>

+ 29
- 0
src/main/webapp/WEB-INF/appconfig-security.xml 查看文件

@@ -0,0 +1,29 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<beans:beans xmlns="http://www.springframework.org/schema/security"
3
+             xmlns:beans="http://www.springframework.org/schema/beans"
4
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+             xsi:schemaLocation="http://www.springframework.org/schema/beans
6
+		http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
7
+		http://www.springframework.org/schema/security
8
+		http://www.springframework.org/schema/security/spring-security.xsd">
9
+
10
+    <http auto-config="true">
11
+        <intercept-url pattern="/" access="hasRole('ROLE_USER')"/>
12
+        <intercept-url pattern="/welcome" access="hasRole('ROLE_USER')"/>
13
+        <form-login login-page="/login" default-target-url="/welcome" authentication-failure-url="/login?error" username-parameter="username" password-parameter="password"/>
14
+        <logout logout-success-url="/login?logout" />
15
+    </http>
16
+
17
+    <authentication-manager alias="authenticationManager">
18
+        <authentication-provider user-service-ref="userDetailsServiceImpl">
19
+            <password-encoder ref="encoder"></password-encoder>
20
+        </authentication-provider>
21
+    </authentication-manager>
22
+
23
+    <beans:bean id="userDetailsServiceImpl" class="com.proximity.demo.account.service.UserDetailsServiceImpl"></beans:bean>
24
+
25
+    <beans:bean id="encoder"
26
+                class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
27
+        <beans:constructor-arg name="strength" value="11"/>
28
+    </beans:bean>
29
+</beans:beans>

+ 16
- 0
src/test/java/com/proximity/demo/DemoApplicationTests.java 查看文件

@@ -0,0 +1,16 @@
1
+//package com.proximity.demo;
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 DemoApplicationTests {
11
+//
12
+//    @Test
13
+//    public void contextLoads() {
14
+//    }
15
+//
16
+//}