From a4b271e030d4f16146a5a8c3c8638b5c9431b8d6 Mon Sep 17 00:00:00 2001 From: Zastian Pretorius Date: Sun, 28 Aug 2022 02:31:02 +0100 Subject: [PATCH] First commit --- README.md | 0 mvnw | 310 ++++++++++++++++++ mvnw.cmd | 182 ++++++++++ pom.xml | 84 +++++ ...pringBootSecurityThymeleafApplication.java | 13 + .../config/SecurityConfiguration.java | 62 ++++ .../net/javaguides/springboot/model/Role.java | 39 +++ .../net/javaguides/springboot/model/User.java | 95 ++++++ .../springboot/repository/UserRepository.java | 11 + .../springboot/service/UserService.java | 10 + .../springboot/service/UserServiceImpl.java | 56 ++++ .../springboot/web/MainController.java | 18 + .../web/UserRegistrationController.java | 39 +++ .../web/dto/UserRegistrationDto.java | 45 +++ src/main/resources/application.properties | 15 + src/main/resources/templates/index.html | 46 +++ src/main/resources/templates/login.html | 81 +++++ .../resources/templates/registration.html | 80 +++++ ...BootSecurityThymeleafApplicationTests.java | 13 + target/classes/application.properties | 15 + ...ringBootSecurityThymeleafApplication.class | Bin 0 -> 871 bytes .../config/SecurityConfiguration.class | Bin 0 -> 5127 bytes .../javaguides/springboot/model/Role.class | Bin 0 -> 1186 bytes .../javaguides/springboot/model/User.class | Bin 0 -> 3274 bytes .../repository/UserRepository.class | Bin 0 -> 566 bytes .../springboot/service/UserService.class | Bin 0 -> 370 bytes .../springboot/service/UserServiceImpl.class | Bin 0 -> 4403 bytes .../springboot/web/MainController.class | Bin 0 -> 699 bytes .../web/UserRegistrationController.class | Bin 0 -> 1811 bytes .../web/dto/UserRegistrationDto.class | Bin 0 -> 1498 bytes target/classes/templates/index.html | 46 +++ target/classes/templates/login.html | 81 +++++ target/classes/templates/registration.html | 80 +++++ ...ootSecurityThymeleafApplicationTests.class | Bin 0 -> 669 bytes 34 files changed, 1421 insertions(+) create mode 100644 README.md create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplication.java create mode 100644 src/main/java/net/javaguides/springboot/config/SecurityConfiguration.java create mode 100644 src/main/java/net/javaguides/springboot/model/Role.java create mode 100644 src/main/java/net/javaguides/springboot/model/User.java create mode 100644 src/main/java/net/javaguides/springboot/repository/UserRepository.java create mode 100644 src/main/java/net/javaguides/springboot/service/UserService.java create mode 100644 src/main/java/net/javaguides/springboot/service/UserServiceImpl.java create mode 100644 src/main/java/net/javaguides/springboot/web/MainController.java create mode 100644 src/main/java/net/javaguides/springboot/web/UserRegistrationController.java create mode 100644 src/main/java/net/javaguides/springboot/web/dto/UserRegistrationDto.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/templates/index.html create mode 100644 src/main/resources/templates/login.html create mode 100644 src/main/resources/templates/registration.html create mode 100644 src/test/java/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplicationTests.java create mode 100644 target/classes/application.properties create mode 100644 target/classes/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplication.class create mode 100644 target/classes/net/javaguides/springboot/config/SecurityConfiguration.class create mode 100644 target/classes/net/javaguides/springboot/model/Role.class create mode 100644 target/classes/net/javaguides/springboot/model/User.class create mode 100644 target/classes/net/javaguides/springboot/repository/UserRepository.class create mode 100644 target/classes/net/javaguides/springboot/service/UserService.class create mode 100644 target/classes/net/javaguides/springboot/service/UserServiceImpl.class create mode 100644 target/classes/net/javaguides/springboot/web/MainController.class create mode 100644 target/classes/net/javaguides/springboot/web/UserRegistrationController.class create mode 100644 target/classes/net/javaguides/springboot/web/dto/UserRegistrationDto.class create mode 100644 target/classes/templates/index.html create mode 100644 target/classes/templates/login.html create mode 100644 target/classes/templates/registration.html create mode 100644 target/test-classes/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplicationTests.class diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a25ed3d --- /dev/null +++ b/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.0.RELEASE + + + net.javaguides + registration-login-spring-boot-security-thymeleaf + 0.0.1-SNAPSHOT + registration-login-spring-boot-security-thymeleaf + Demo project for Spring Boot Thymeleaf and Hibernate + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity5 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + mysql + mysql-connector-java + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplication.java b/src/main/java/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplication.java new file mode 100644 index 0000000..cadc82f --- /dev/null +++ b/src/main/java/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplication.java @@ -0,0 +1,13 @@ +package net.javaguides.springboot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class RegistrationLoginSpringBootSecurityThymeleafApplication { + + public static void main(String[] args) { + SpringApplication.run(RegistrationLoginSpringBootSecurityThymeleafApplication.class, args); + } + +} diff --git a/src/main/java/net/javaguides/springboot/config/SecurityConfiguration.java b/src/main/java/net/javaguides/springboot/config/SecurityConfiguration.java new file mode 100644 index 0000000..318b463 --- /dev/null +++ b/src/main/java/net/javaguides/springboot/config/SecurityConfiguration.java @@ -0,0 +1,62 @@ +package net.javaguides.springboot.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +import net.javaguides.springboot.service.UserService; + +@Configuration +@EnableWebSecurity +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Autowired + private UserService userService; + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public DaoAuthenticationProvider authenticationProvider() { + DaoAuthenticationProvider auth = new DaoAuthenticationProvider(); + auth.setUserDetailsService(userService); + auth.setPasswordEncoder(passwordEncoder()); + return auth; + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(authenticationProvider()); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests().antMatchers( + "/registration**", + "/js/**", + "/css/**", + "/img/**").permitAll() + .anyRequest().authenticated() + .and() + .formLogin() + .loginPage("/login") + .permitAll() + .and() + .logout() + .invalidateHttpSession(true) + .clearAuthentication(true) + .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) + .logoutSuccessUrl("/login?logout") + .permitAll(); + } + +} diff --git a/src/main/java/net/javaguides/springboot/model/Role.java b/src/main/java/net/javaguides/springboot/model/Role.java new file mode 100644 index 0000000..6fbdef8 --- /dev/null +++ b/src/main/java/net/javaguides/springboot/model/Role.java @@ -0,0 +1,39 @@ +package net.javaguides.springboot.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "role") +public class Role { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; + + public Role() { + + } + + public Role(String name) { + super(); + this.name = name; + } + + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/net/javaguides/springboot/model/User.java b/src/main/java/net/javaguides/springboot/model/User.java new file mode 100644 index 0000000..f229504 --- /dev/null +++ b/src/main/java/net/javaguides/springboot/model/User.java @@ -0,0 +1,95 @@ +package net.javaguides.springboot.model; + +import java.util.Collection; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; +import javax.persistence.JoinColumn; + +@Entity +@Table(name = "user", uniqueConstraints = @UniqueConstraint(columnNames = "email")) +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "first_name") + private String firstName; + + @Column(name = "last_name") + private String lastName; + + private String email; + + private String password; + + @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @JoinTable( + name = "users_roles", + joinColumns = @JoinColumn( + name = "user_id", referencedColumnName = "id"), + inverseJoinColumns = @JoinColumn( + name = "role_id", referencedColumnName = "id")) + + private Collection roles; + + public User() { + + } + + public User(String firstName, String lastName, String email, String password, Collection roles) { + super(); + this.firstName = firstName; + this.lastName = lastName; + this.email = email; + this.password = password; + this.roles = roles; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + public Collection getRoles() { + return roles; + } + public void setRoles(Collection roles) { + this.roles = roles; + } + +} diff --git a/src/main/java/net/javaguides/springboot/repository/UserRepository.java b/src/main/java/net/javaguides/springboot/repository/UserRepository.java new file mode 100644 index 0000000..2fc1971 --- /dev/null +++ b/src/main/java/net/javaguides/springboot/repository/UserRepository.java @@ -0,0 +1,11 @@ +package net.javaguides.springboot.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.javaguides.springboot.model.User; + +@Repository +public interface UserRepository extends JpaRepository{ + User findByEmail(String email); +} diff --git a/src/main/java/net/javaguides/springboot/service/UserService.java b/src/main/java/net/javaguides/springboot/service/UserService.java new file mode 100644 index 0000000..28cbb4b --- /dev/null +++ b/src/main/java/net/javaguides/springboot/service/UserService.java @@ -0,0 +1,10 @@ +package net.javaguides.springboot.service; + +import org.springframework.security.core.userdetails.UserDetailsService; + +import net.javaguides.springboot.model.User; +import net.javaguides.springboot.web.dto.UserRegistrationDto; + +public interface UserService extends UserDetailsService{ + User save(UserRegistrationDto registrationDto); +} diff --git a/src/main/java/net/javaguides/springboot/service/UserServiceImpl.java b/src/main/java/net/javaguides/springboot/service/UserServiceImpl.java new file mode 100644 index 0000000..f271014 --- /dev/null +++ b/src/main/java/net/javaguides/springboot/service/UserServiceImpl.java @@ -0,0 +1,56 @@ +package net.javaguides.springboot.service; + +import java.util.Arrays; +import java.util.Collection; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; + +import net.javaguides.springboot.model.Role; +import net.javaguides.springboot.model.User; +import net.javaguides.springboot.repository.UserRepository; +import net.javaguides.springboot.web.dto.UserRegistrationDto; + +@Service +public class UserServiceImpl implements UserService{ + + private UserRepository userRepository; + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + + public UserServiceImpl(UserRepository userRepository) { + super(); + this.userRepository = userRepository; + } + + @Override + public User save(UserRegistrationDto registrationDto) { + User user = new User(registrationDto.getFirstName(), + registrationDto.getLastName(), registrationDto.getEmail(), + passwordEncoder.encode(registrationDto.getPassword()), Arrays.asList(new Role("ROLE_USER"))); + + return userRepository.save(user); + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + + User user = userRepository.findByEmail(username); + if(user == null) { + throw new UsernameNotFoundException("Invalid username or password."); + } + return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), mapRolesToAuthorities(user.getRoles())); + } + + private Collection mapRolesToAuthorities(Collection roles){ + return roles.stream().map(role -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList()); + } + +} diff --git a/src/main/java/net/javaguides/springboot/web/MainController.java b/src/main/java/net/javaguides/springboot/web/MainController.java new file mode 100644 index 0000000..21df2df --- /dev/null +++ b/src/main/java/net/javaguides/springboot/web/MainController.java @@ -0,0 +1,18 @@ +package net.javaguides.springboot.web; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class MainController { + + @GetMapping("/login") + public String login() { + return "login"; + } + + @GetMapping("/") + public String home() { + return "index"; + } +} diff --git a/src/main/java/net/javaguides/springboot/web/UserRegistrationController.java b/src/main/java/net/javaguides/springboot/web/UserRegistrationController.java new file mode 100644 index 0000000..db45c6e --- /dev/null +++ b/src/main/java/net/javaguides/springboot/web/UserRegistrationController.java @@ -0,0 +1,39 @@ +package net.javaguides.springboot.web; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import net.javaguides.springboot.service.UserService; +import net.javaguides.springboot.web.dto.UserRegistrationDto; + +@Controller +@RequestMapping("/registration") +public class UserRegistrationController { + + private UserService userService; + + public UserRegistrationController(UserService userService) { + super(); + this.userService = userService; + } + + @ModelAttribute("user") + public UserRegistrationDto userRegistrationDto() { + return new UserRegistrationDto(); + } + + @GetMapping + public String showRegistrationForm() { + return "registration"; + } + + @PostMapping + public String registerUserAccount(@ModelAttribute("user") UserRegistrationDto registrationDto) { + userService.save(registrationDto); + return "redirect:/registration?success"; + } +} diff --git a/src/main/java/net/javaguides/springboot/web/dto/UserRegistrationDto.java b/src/main/java/net/javaguides/springboot/web/dto/UserRegistrationDto.java new file mode 100644 index 0000000..71e367f --- /dev/null +++ b/src/main/java/net/javaguides/springboot/web/dto/UserRegistrationDto.java @@ -0,0 +1,45 @@ +package net.javaguides.springboot.web.dto; + +public class UserRegistrationDto { + private String firstName; + private String lastName; + private String email; + private String password; + + public UserRegistrationDto(){ + + } + + public UserRegistrationDto(String firstName, String lastName, String email, String password) { + super(); + this.firstName = firstName; + this.lastName = lastName; + this.email = email; + this.password = password; + } + + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..0e4c996 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,15 @@ +## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) +spring.datasource.url = jdbc:mysql://localhost:3306/PRG381?useSSL=false +spring.datasource.username = mrfluffy +spring.datasource.password = 0814661902 + +## Hibernate Properties +# The SQL dialect makes Hibernate generate better SQL for the chosen database +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect + +# Hibernate ddl auto (create, create-drop, validate, update) +spring.jpa.hibernate.ddl-auto = update + +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type=TRACE + diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000..639fb67 --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,46 @@ + + + + +Registration and Login App + + + + + + + + +
+
+ +
+

Registration and Login with Spring Boot, Spring Security, + Thymeleaf, Hibernate and MySQL

+ Welcome User +
+ + diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000..32d0e98 --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,81 @@ + + + + +Registration and Login App + + + + + + + + + +
+
+
+
+
+ +

User Login Page

+
+ + +
+
Invalid username or + password.
+
+ + +
+
You have been logged out.
+
+ +
+ : + +
+ +
+ : +
+ +
+
+
+ +
+
+
+
+
+ New user? Register + here +
+
+
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/registration.html b/src/main/resources/templates/registration.html new file mode 100644 index 0000000..0833ca9 --- /dev/null +++ b/src/main/resources/templates/registration.html @@ -0,0 +1,80 @@ + + + + +Registration + + + + + + + +
+
+ +
+
+
+ + +
+
You've successfully registered + to our awesome app!
+
+ +

Registration

+ +
+
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + Already registered? Login + here +
+
+
+
+
+ + \ No newline at end of file diff --git a/src/test/java/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplicationTests.java b/src/test/java/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplicationTests.java new file mode 100644 index 0000000..93843ad --- /dev/null +++ b/src/test/java/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplicationTests.java @@ -0,0 +1,13 @@ +package net.javaguides.springboot; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class RegistrationLoginSpringBootSecurityThymeleafApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/target/classes/application.properties b/target/classes/application.properties new file mode 100644 index 0000000..0e4c996 --- /dev/null +++ b/target/classes/application.properties @@ -0,0 +1,15 @@ +## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) +spring.datasource.url = jdbc:mysql://localhost:3306/PRG381?useSSL=false +spring.datasource.username = mrfluffy +spring.datasource.password = 0814661902 + +## Hibernate Properties +# The SQL dialect makes Hibernate generate better SQL for the chosen database +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect + +# Hibernate ddl auto (create, create-drop, validate, update) +spring.jpa.hibernate.ddl-auto = update + +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type=TRACE + diff --git a/target/classes/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplication.class b/target/classes/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..7d874a8959fd74c016cb8b25214220a3e29ad7be GIT binary patch literal 871 zcmX^0Z`VEs1_l!bSuO@924;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00Sb_NbchQPek5`B=u^wP|f)MEYOf}+g4^rZa!68)gm^vvRtqQsKS{5+rh z^vt|qu$)tVeo1g@a%oX!No7bzWo~LtYGRsWK|xMtGFT}W0~Z4~I|C0711|#~BZF3c zQ99Jrw4%h^)bjkIY<;l#5aW<^GBPk1mF6)rBx(47Tm*5tb53G$v2`?(NN@?riPoAv z*i25&&nro-DA9M$&r8cpFD*(;%1K4C!WklM&B(ywoS%})$iVNDnV0HUnwykb6arGq z$ROmCpPZNzmROVt;zI>lN-{Ew85x3os2*G(r{pGP<}oseX<+kZ7$XBqVo`cABZDv& zX+{PC-_(+f{FH!1P~euN78Nrxa0Ta=7A2>;W#*(ZGT4wAje4LcU}TUCD$Og&%uNl; zEY1W4WnNx>2{@XI85!)b#sD~O6H80-lc72{Y7#P^Vg6s@}3=9lBU^Xj*5Q8uS0|O_6 z2!kjC6Iinu1IRE21`Z*1tsM-U;RyYp?7_gm#lX(MjbsJ~gBXK20|SEu$U;U2F|c)# OU{Z=f8fvW!0|Nk@ul7;^ literal 0 HcmV?d00001 diff --git a/target/classes/net/javaguides/springboot/config/SecurityConfiguration.class b/target/classes/net/javaguides/springboot/config/SecurityConfiguration.class new file mode 100644 index 0000000000000000000000000000000000000000..ab6aabbd11d047c440a45d7f6fa0faa51b9e11a5 GIT binary patch literal 5127 zcmX^0Z`VEs1_l#`xm*lP49x5dEIbUX3~Y=HvH3;m`o#rBnR)4HMTxno<@rU~`o*cq zrA3(~mHNr~d1;yH`iXgY`6Y=ZnfZD8<*7+f(b6J_NO)>eFjT!WSb1qtYLR0~VnIo2 z5hDYeO=ezZi5(*Yvxa6EI|BzJg9CmWiz*9B^7WIFLA1V;Gl&XEEG{n3FG_LEOU_S8 zE#hKe2l;@Tk--zMQHiA`8L4?CnaL1$rX=R;yCmj2qKF0*<(FlG&E#TW=49Yw;AdwL z;9(GC5MpF7%S$cM&q^#yOfSt$NiBwkQc`|?2{Z)s(ftj!h>?N2v^cdWIJKxOGdY!! zLEi_rImHk~`k@F7)?5r+3?e)Xq6}h;45G!UB_KJM)RM%^oMO0{t{Oggy`G$3l&TMM zMG8bC*aB2TtTn^982A_@co-xZq!=0a3s3`@k-bw`6nGdE8I%|q#8BfL7Q2iLzJxr3s!<>gBCl3HV=aigDxY32Z;d$DrDdmd6bkCz%m*mgCNK~`9+yk zsX?iQrK!aw#f%JXgd!JzF$M~H*NTFo)Z*gI{JhYj98l1KtN>?cM46_7P~@3cl3J9U zT2K;NloOPio>^Q{RB6r5pwGx404gx_a}x8?^@B@5r78!5AtM97ei1|!*hnoc4hCaJ z1~&byVto+Xl#zj5Ke-sfF$ZxnbJO*;w73{78LZeDta%u07;G6Cn#c%6h|fVKa6v+q3}NJ1ft(K9V5T9GwlxPsFepLhfGpu+2xSOkX9(wEh+v3hWC)@#+OSy1$iNA< zDIhUDm60Js11Z5kG7ag)6sX7`IcTED%+GVn z%qdANLJC@tt#P1a63@usM7pi8q7OM?B=RsMF(flGu;t{Z=a-f+G6a)uE_#6ZfQ>?N zcPc{~J3~4TLk2@8BZEJM$pGDaMh4N$yt2fc%#_5ER7eg0m%oe*AsSI6*HT3JCYy&L z2jmsu#8YT$-GmT3j4jl*7o7ip}!`nwJ<&5s*ib^EigP zK#r&fW$dWC+2k5uVtv zhXO{#BE{2IvORh4of}NGAy^TSGeJ_JvB(sn~a3qV6QE()ykV$YPn~+)X zHU^6W40hWX9JVnygBkAI7`zTJXl`Th6AIeK5VDOS>HtINHilTRSOUv7h7^`<3|YGw zawCQEw=)!OV<-`-*v3$`jiC<74|WXv3=9m~3`z|845|zU40;TP3?>Xl43-SW3^oiV z3{DKD3?2+-3_c9z3;_%l3^5Fr42cX@3@HrO3>geINdC@*`#Y0i62oL{{+`6Zz`)Ef s1)Kz?f>RtQ2&XYHFidA)V3@%GN={4+mJBl)W-~A{*fGpxn8Uyb0A~S&YXATM literal 0 HcmV?d00001 diff --git a/target/classes/net/javaguides/springboot/model/Role.class b/target/classes/net/javaguides/springboot/model/Role.class new file mode 100644 index 0000000000000000000000000000000000000000..1f7cf0fd33a10763b90ed74322436ac8e822bb79 GIT binary patch literal 1186 zcmX^0Z`VEs1_l!bEiMKo24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3V0ywnnXke2k)%#_q({o;b6%)IoZ{QMIA-29Z( z9Q~mDoK!{zmb}E=R7M6NACOXr>A@u+mDV8h_;?uj83Y&^m@-os83d5j_~hrMTQf39 z29@TOWag%ZWfo^9<)k|1<>i+omSpDV6*Dr3ft6S27o-*yXBL;F<|U`l z@dL+<2#RKC+%Ph*7sC{A1?QI*C8xS&g1pEHid8*OTrx69fh|Ri0N1>d%#un_%wdrP zhln*J14~hUPAY>U0|x^W0|NsS0~06_FfcL*GB7X*GB7a+F)%O)GcYoUq%w#yh%qpM z5*z~q0~-S)D5WwmGKe!UFc>p1GB7eQFtBQEXJFh2Hb;VifdQ1L85o2ZSQtbYBpDbO zcp!=xq!^?b7{CU|Fff4)a0A=Sz`zAEKudco13SVLJ_cq61_p5k76u6hP6kP^Ng#)S z%!il+VsV2_mjyY3k%1d*yc~l()P4GJ_ibU|-2itV$P)|)>h!w#lAm!E|L-}|Z_(3LeM57=%EA ztf{$)nK>X45grCnkO)UXVsUYKeo+cYP@IQBfU*YGGcqWF%|VrLPt8j$N-RlD2}{f=O|@oZ;3zHu z@zX2us?W^N3#lvstM_zq^$YO~iDYDu!eYL2eokp_o;4!_OCC5_xxhgj58-fv0ujaz z&P>lsEGaEYWn{1e8>EjGFg8AfVlgN`C)L`{nvp>cYyhfHeG~I4L-IkSH6sIST53sh z1|x$k7KLsgDX8yQT^-$BgBTgulM{=R6H`(d8RW6(aE3@i^)Ng7_+U5LD?c+YBrz!m z6mHz5#i>Qb@zA8eot2-N2MMcU?9K=2g($FQWMBtrjt8X;k)qVJ)FMzEr$A((sW&sP zEVZaO6``w`k%1j#8CVyKb3Vu~{63j^seYxoNvTC(XMs|EesW??SYlBo$eB<!uSB^miC0f|M4xv3?o zMa7H^owRii(diQ8Zr1eF63-My1|bbiq#%LjYSvS$v~w6oC(qq04>cRIuJaN z4p8PRW@M0nISW137#SRJND&=?5cfbWl7#vU-5!wd9I?w0Z4t-}uHgLAqU2P!%$!t4 z22N1Y)&tcD*o!&Wypqh4N>ITJj#bo>2b?lNMIb2GGBOC3=4BR^raI^6fr{G9ypm!@ z1{EyYLeZ32Gcs@|gNsv89xrB4WZ+<6VqjokV_*VR77UCGatsU%f(%Ry@(c_N3Ji=4 zim41r49W~lph^%b&CS5bpu)h&pjynJ#=r!s%P=L>8JIxz83O|Y6Q~vg(-I7l3``6f zV74aMA`b>81}z3A2JKV^9R^(ny=Vr;R0e$p0|r9|W{~kl493w6j1CMY3``)dDT7%t zgA9W?vX})#jE{j4RI4*EGFUP&Fc>p1GB7eQFtBQEXJFh2w$O@!fdSM2U|`T=U|}#| zux4Oj;DIP&uwk%eU;rCn$G{9WU>O4w0~;s=Kn7@OZ)ITD(%H(utEIb@K|o8AWh;ZQ zmL%&|1~HJ?%nTs2&;9z40*$oaj7BCAGbgT^aa5pP3NHAzJurfF>FffR+GH^36Fz_=lFbILT z3=9ks3=Gh4c4S~=aAI(VhKoKtT(&SsZGeXh8#o-S!EQtk6Bh~q3{{xWII#Mo&r1cmER)$!xNtkW}=i3kH38MxCj^HQ8DU2_vNa~K({G<*=I2bX|cWUc9g+oierDXBSN zM_My72>7O!WaOs=B!cWONi8a7WMEB&n9CWQnVy$eQd*SC$k2#n1;hi^K4dxGhB${I zS?80Vmu_um&B(wNoL^d$oa&aDlgh{-j2g&#pb%hWkPIr#E6L1F4a+RfOv*`h%*)F! zNi50C&nsqR(8lWE;*!*&)clglf>eD(2wSr;GB7eQGcYo+GB7YOvM@5RGjK34GH^05 mFt9Q*a4|42Ff(v7FfcGN@G$U#X+8#i1_lN;21W(}1_l6!KC~17 literal 0 HcmV?d00001 diff --git a/target/classes/net/javaguides/springboot/service/UserService.class b/target/classes/net/javaguides/springboot/service/UserService.class new file mode 100644 index 0000000000000000000000000000000000000000..30aa8bdd20aed9391b4a2260e2ca92c488e84ddf GIT binary patch literal 370 zcmX^0Z`VEs1_l!bUUmj1Mh4xy)Dr!y#InTn(#(|9V*TQRqRhPXr2PC6{o>T3vdrXE z{m|mnqF@M{oq>gsK>(y&KPNFSUEe<`D>b=&!!6CmW9jZI6C^0v+JijPgzc@9y zv?#NrQa?GrC{@3-IJGDxwIne!rx7F2}lGvv?R5tn2~|M2-Pq~ z2Cm@z(xT*4x6GVWMg{?-K+psEpN)}$k%5_kk%5(gfq{{Qk%66ogMpEOlYxPOm63r9 OB*?(cz`(%7zykm&({pP8 literal 0 HcmV?d00001 diff --git a/target/classes/net/javaguides/springboot/service/UserServiceImpl.class b/target/classes/net/javaguides/springboot/service/UserServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..35e18b295133b26891443fedb4e444aea723e2e6 GIT binary patch literal 4403 zcmX^0Z`VEs1_l#`HCzl#49x5dEIbUX3~Y=H0$GV=iTXK-dFlH8Nm;4MC5#MgHko;u zC3cJq%o>_uoD3Wcoa_u-JPh0nJd6y6d8sA(AT8;onJKBo`o#rBnR)3+`S~UK#i>PQ znaQd8p~b01!4S4*Zb1$s17B%zYEe*XL4I*&Nq$i!BZH|AZc~cj>c9pev{|z=@G&x| z;MSR&pOTsb*2Kjiz#z!ZAjHEU%pk(ZV2WE$d1{h=N=ZIgS5RttW^qYTVo7Fxo=ZtS zBLh!*YKdEBQE`c1Vs0uUgNTNv56I_`zzQw_dE6Rgl^73$ILIFE^wbicM2K>bxFipQ z6iA#SJ+;I&H!(8@6qYhP46+Pzj12q*iN(d``9&$NdCB=HsYQ$oPCofX>Cga8D@x2w zEzd8?)-O&?E-lI|snky{sw^nU*G~e|`cBRuZUCwoVAm+{Ferj-1-S+$&&8n3pu*0e z%EO?>pw7tPK&eHH3~Z@jXEQSBXdnfOb4FrOaB5*`YF=`xHI~p~XV4@f3WM@*NWuS0#LYcFt{=@$a?0LCFW$ND1fwplquvFDZnz1 z9v6cXgDyLR2P16U_`SQ11ifCwKR244n0Mg~xJ1tq~^Mg|F3mPd~;E(Q*U03L=w zh9E`;(cHuWu=>@gzi4KNu`&EyTdU z5X-|5#}LoRz?xW4kWIR2 zH8=)wI|OHOWvv;;$iU*9pOVVR!0(fpm+DuVo0M7Eo~D5{k%b{61Ah^E zqr#j_D;XJBKm{NpgBl(KkP2c(2BDn%#1v3t%&8JYf{IQ?27hQu1}9c%$)brh>JbeO zY~{5Jr0lk4WZ(cf3u3qsW*NoEz#CkWn4ImKSOASgE_m@?%*eo6l%E4CE5#r>!DRq6 zGiK)JSu-+-p{9e%f>fw6c35@T5DXkpNo{Rs&B(wRoSB}NSW;S)%E-_Q4HY!|i8c*d z0-$TxCL&ayf~)NhygcSZfv)14f1%d?^=_3cwyECTaO<-f=z$7qMg|S+fm4!Nl$u{sS&*s^)dI@8PWkyIpr&~N zBo7z!voXx(Vwl4)mz`lA55s(h1&j8!~&1Ryp){OVilkK{Or;KYe-T9D}!bkBoP#iA(aKG$jXVAgjk7RFEp8f z9RfAkIWZ?EII|?xT7bcppN(NLs9~~%hhY-KWC4cBj0`-Ud3mWt&N+$2#i_;Y3@aEJ zR58K{o0r)cRxvWj;aAGYzy=8)21N!A1||kZhB5{w1}0EHk%57Mi9wb@j)9S(f`Ng7 zje(J&l7WGNm4T6gm7$7(iJ_W-fx!)|nt_2!YdZs@miAT#_KjeDH4F?4d<@JC3=Fai zEDUlCoDA{|wG0dlVhl_S3=CWhbqw_kAixE-iIJfJWHKWIHvgV1|F~> z4!aq6Bel0N@M~{l5Y^tsAfdH|L0WqogZwrIC6>Jm8j;Mq88jk=w6-(o1n*$b-_Bs_ ztF?uJU1ukQ1rx&o2Hp*DM+q^oFfcGEGjKAfFo-g!G8i$agB_*-u?Oxj2ZknwW(GzE zBL+T(7KT;^CYTeOz)oyqXlGyshd?I-8(6C$$U^O%40cQmzBrU zo54L&XB&g3&Nc=wEuC!)-rE`cw=)ET+{DZP3Mh!1bQ!oA^ceUV^cf@>43XSq2zQeq zLkB}A11OZ#pl<47U|`^2VEn@%$;%}@}jwT+=@J3}eRN+xhf zAX^DBmWN>q!&I=prh!eH4o{3T7#J94Lam?0z|63aVG+YphGpR7#mKOnVI{+A21x*W CvnAXB literal 0 HcmV?d00001 diff --git a/target/classes/net/javaguides/springboot/web/MainController.class b/target/classes/net/javaguides/springboot/web/MainController.class new file mode 100644 index 0000000000000000000000000000000000000000..12fc613a987ad33fbb6dbba6f8dbf9bd1a029a3e GIT binary patch literal 699 zcmX^0Z`VEs1_l!b87>AU24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00S4h9ZJ2G*SX^vpaC1};Vh*37(=)CzV69!3V8ywnnXkoNS_%#_q({o;b6 z%)IoZ{QMIA^3)`K-^9#3=lr~qqWqkk)FMU(7U%qwR7M7VpUk{eztY^K)S{5Yq?}Yn z1|gsPQY7V_sf-spa`a*93{W?*6f0cHk9P{c7XGVn4mFz7QdGB7eQFtBQE zXJFjOz`(%7z{kMAzy=m%XW(aGVBi6>Ss4Tv1Q{3@7#TPigcz8>nsuR?nT6OlplRhs z(#j0gD$KyZz{kMIAi}`NAR5iUSj-^Cz{ntu#W+rM;{=E@PJ)4nK@#i`DF%>bAYVu` GFaQ7tgO)G= literal 0 HcmV?d00001 diff --git a/target/classes/net/javaguides/springboot/web/UserRegistrationController.class b/target/classes/net/javaguides/springboot/web/UserRegistrationController.class new file mode 100644 index 0000000000000000000000000000000000000000..2498ebad6b0769b32c54a26909c31121d5532095 GIT binary patch literal 1811 zcmX^0Z`VEs1_l!bQ!WN324;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3U>ywnnXke2k)%#_q({o;b6%)IoZ{QMIA^3){# z(Bjmhpw#rt;*z4olFa-(=lr~qqWqkk)FMU(?$YAaqTtk`vdrXEMh1N!+$I%66oE~H zYOrQ!;A3Pk#jOWqdrC<@SP!xbTuSn}7P8F-42+{Voy%pk(fAj-oa#vsnf zpo`mVEbd`sU@1;4OJ!t;*TCZuJdU!~#G@}aKP5E>>=kPc21!N+xuVpR%%arf5-WXV zAJ`X{CMTyB7c(*#;d2ER=UZ!rF*2|?=clAHGVuFk=B4_T<|d^Ug(N2Bq%txH`Q#@j z=7c2{WrFxnL6(w?%wk3cD?H8yc^7vIux4Zs@J%hr$WIAKEK1BxElDjZW@Hcsr3$nN zV`Q+@z!y9qdvL_HH6w#$P-$LCW^QU&W^raxPO4*GUVaHUF%~m2Soq`@r9%^K8psjl z`9;~_l$(^9m!h8tSF7&}iUP-ylA_F{(vnnbMh4ch#GKMpMg|s;gBck_iZk-dk=^Z< zUzE$pAfln^1Iiwd92Hyw${p5>3?@X|>z-QTn^;hgnU`+O$RG@f?bISrs5&Mm=a=S{ zFfw@Ki)?&hgVkyL5IZ3G)ukk#k-?lm6ypwhQ=+{YkY9}CPbJhSgQpLaxZ?`WFD*(= zb;|@LQF%~^AO}C9q|pO~KO=)SR<{(Fq!y*-msA#{>LYYmlaerkQVUB{ksZ&Ak|!Ay z88{f27#J8B8JIvtCIbTl3j-qqD}xjR6N5AZ1A`j_6Ih;0YdZs@miAT#_Kge-3``6% z3=9l>49pA+3?d9H45AF23}Otj3=9ln5Y-HF4Dt*hzy&sykwJlhfq|8gfg5ayEe!11I~jzS7{Y}l5GI1E zB?bl+25tsbu&EGl^Fd7o1&s~^$SF{7>o71dfSe7oN{@koL7#yER6Qa2fr-HY>~%x1 WIw1xo1|tRr24j#HqZt^B8B74<`1kn$ literal 0 HcmV?d00001 diff --git a/target/classes/net/javaguides/springboot/web/dto/UserRegistrationDto.class b/target/classes/net/javaguides/springboot/web/dto/UserRegistrationDto.class new file mode 100644 index 0000000000000000000000000000000000000000..d6c944408a4705a26faf928035fab19a837646a4 GIT binary patch literal 1498 zcmX^0Z`VEs1_l!bO)dr|24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3V!ywnnXke2k)%#_q({o;b6%)IoZ{QMIA^3){# zl#+b?(Bjmhpw#rt;*z4olFa-(my&!&2F|q1qT&+2#N1Ry1|c7i0T4TbOF;UqLALPm zFz|z{;K)gYs00ZL@-PU21X)va6Ekx_A|gBtq975Dg2dwD^8BI{Mg|t={FGEi27aH+ zyi~u^+@#c^ki?`Muub{Ni8*13MVTNzRFI`4BeR&1!Q6)|uUIoOcxzyKfIJb+Fh&Le z-_(+f{FH#iqQuCs z7+4sXKBf@v-WMo>azU}O+uU|=w2U}RuqU|?X?+RnhZ5v)v{ zfq?;(W*Hbb8CV#&86+4O7B@q^LyTlF)}D)b&~+P zo0PyNqPs~2yPE{i-K5IE%Af`|0n<&O1j-1GM^;8~{4p}9Vs(=+x|=k>CZfAZ4ZE9= eQX(Yov>8|#bigKHx(Sq7;BJDXCv|Yb(EtE@DdOe; literal 0 HcmV?d00001 diff --git a/target/classes/templates/index.html b/target/classes/templates/index.html new file mode 100644 index 0000000..639fb67 --- /dev/null +++ b/target/classes/templates/index.html @@ -0,0 +1,46 @@ + + + + +Registration and Login App + + + + + + + + +
+
+ +
+

Registration and Login with Spring Boot, Spring Security, + Thymeleaf, Hibernate and MySQL

+ Welcome User +
+ + diff --git a/target/classes/templates/login.html b/target/classes/templates/login.html new file mode 100644 index 0000000..32d0e98 --- /dev/null +++ b/target/classes/templates/login.html @@ -0,0 +1,81 @@ + + + + +Registration and Login App + + + + + + + + + +
+
+
+
+
+ +

User Login Page

+
+ + +
+
Invalid username or + password.
+
+ + +
+
You have been logged out.
+
+ +
+ : + +
+ +
+ : +
+ +
+
+
+ +
+
+
+
+
+ New user? Register + here +
+
+
+
+ + \ No newline at end of file diff --git a/target/classes/templates/registration.html b/target/classes/templates/registration.html new file mode 100644 index 0000000..0833ca9 --- /dev/null +++ b/target/classes/templates/registration.html @@ -0,0 +1,80 @@ + + + + +Registration + + + + + + + +
+
+ +
+
+
+ + +
+
You've successfully registered + to our awesome app!
+
+ +

Registration

+ +
+
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + Already registered? Login + here +
+
+
+
+
+ + \ No newline at end of file diff --git a/target/test-classes/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplicationTests.class b/target/test-classes/net/javaguides/springboot/RegistrationLoginSpringBootSecurityThymeleafApplicationTests.class new file mode 100644 index 0000000000000000000000000000000000000000..f0bf0d4bf3bf04e287b3ea5fa9ea859cfdb913fb GIT binary patch literal 669 zcmX^0Z`VEs1_nC@5iSNM24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00Sb_NbchOoTU5`B=u^wP|f)MEYOf}+g4^rZa!68)gm^vvRtqQsKS{5+rh z^vt|qu$)tVeo1g@a%oX!No7bzWo~LtYGRsWK|xMtGFWLyYH>+1BLjDkFoCPkwS@PFP}5CWsFeWGTtWEM{bg@S%-!tQi@2lJoOQQY%V) z@)J{v85tylO7luGb5p}Ii!+mQQXTX1@=L(ZFJ@$r@yRbr*Uu`=%Pi5)DlNz?NiEV( zEXdRc`OKP;fh#z_v?w{%EfeG$M@m9T4;1i>3}#^aAR(Vtl$e`Zo?n!$4~~P9)Z!9- zsLS;c;SY8Rg8~CP0}}%XfJjybHU>rpP6h@BeFjDbMg|53R;}#}j2jsk7?>Ei7#P6P z3=HfH+zbp1JP-v8JPf=b{S15zYz$0b&DsnMU^xtp+(;T3p&I$2#tMKf5d@P$3@}k) G1_l7ZO0~BD literal 0 HcmV?d00001