From 1b2cf960af4e9a40792ef6816e57a883ab215acb Mon Sep 17 00:00:00 2001 From: eugenp Date: Thu, 25 Jul 2013 00:06:35 +0300 Subject: [PATCH] initial work on the rest template tutorial project --- spring-security-rest-template/.classpath | 31 +++ ...e.wst.jsdt.core.javascriptValidator.launch | 7 + spring-security-rest-template/.gitignore | 13 + spring-security-rest-template/.project | 42 +++ .../.settings/.jsdtscope | 5 + .../.settings/org.eclipse.jdt.core.prefs | 95 +++++++ .../.settings/org.eclipse.jdt.ui.prefs | 55 ++++ .../.settings/org.eclipse.m2e.core.prefs | 4 + .../.settings/org.eclipse.m2e.wtp.prefs | 2 + .../org.eclipse.wst.common.component | 10 + ....eclipse.wst.common.project.facet.core.xml | 5 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .../org.eclipse.wst.jsdt.ui.superType.name | 1 + .../org.eclipse.wst.validation.prefs | 14 + .../org.eclipse.wst.ws.service.policy.prefs | 2 + spring-security-rest-template/.springBeans | 14 + spring-security-rest-template/README.md | 7 + spring-security-rest-template/pom.xml | 242 ++++++++++++++++++ .../security/AuthenticationFacade.java | 21 ++ .../CustomAuthenticationProvider.java | 45 ++++ .../security/IAuthenticationFacade.java | 9 + ...uestAwareAuthenticationSuccessHandler.java | 48 ++++ .../RestAuthenticationEntryPoint.java | 23 ++ .../baeldung/spring/SecSecurityConfig.java | 16 ++ .../java/org/baeldung/spring/WebConfig.java | 31 +++ .../web/controller/FooController.java | 31 +++ .../web/controller/SecurityController1.java | 39 +++ .../web/controller/SecurityController2.java | 25 ++ .../web/controller/SecurityController3.java | 27 ++ .../web/controller/SecurityController4.java | 28 ++ .../web/controller/SecurityController5.java | 30 +++ .../main/java/org/baeldung/web/dto/Foo.java | 14 + .../src/main/resources/logback.xml | 20 ++ .../src/main/resources/webSecurityConfig.xml | 20 ++ .../src/main/webapp/WEB-INF/api-servlet.xml | 6 + .../src/main/webapp/WEB-INF/web.xml | 51 ++++ .../src/test/resources/.gitignore | 13 + 37 files changed, 1047 insertions(+) create mode 100644 spring-security-rest-template/.classpath create mode 100644 spring-security-rest-template/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch create mode 100644 spring-security-rest-template/.gitignore create mode 100644 spring-security-rest-template/.project create mode 100644 spring-security-rest-template/.settings/.jsdtscope create mode 100644 spring-security-rest-template/.settings/org.eclipse.jdt.core.prefs create mode 100644 spring-security-rest-template/.settings/org.eclipse.jdt.ui.prefs create mode 100644 spring-security-rest-template/.settings/org.eclipse.m2e.core.prefs create mode 100644 spring-security-rest-template/.settings/org.eclipse.m2e.wtp.prefs create mode 100644 spring-security-rest-template/.settings/org.eclipse.wst.common.component create mode 100644 spring-security-rest-template/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 spring-security-rest-template/.settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 spring-security-rest-template/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 spring-security-rest-template/.settings/org.eclipse.wst.validation.prefs create mode 100644 spring-security-rest-template/.settings/org.eclipse.wst.ws.service.policy.prefs create mode 100644 spring-security-rest-template/.springBeans create mode 100644 spring-security-rest-template/README.md create mode 100644 spring-security-rest-template/pom.xml create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/security/AuthenticationFacade.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/security/CustomAuthenticationProvider.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/security/IAuthenticationFacade.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/spring/SecSecurityConfig.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/spring/WebConfig.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/web/controller/FooController.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController1.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController2.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController3.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController4.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController5.java create mode 100644 spring-security-rest-template/src/main/java/org/baeldung/web/dto/Foo.java create mode 100644 spring-security-rest-template/src/main/resources/logback.xml create mode 100644 spring-security-rest-template/src/main/resources/webSecurityConfig.xml create mode 100644 spring-security-rest-template/src/main/webapp/WEB-INF/api-servlet.xml create mode 100644 spring-security-rest-template/src/main/webapp/WEB-INF/web.xml create mode 100644 spring-security-rest-template/src/test/resources/.gitignore diff --git a/spring-security-rest-template/.classpath b/spring-security-rest-template/.classpath new file mode 100644 index 0000000000..5dea193677 --- /dev/null +++ b/spring-security-rest-template/.classpath @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-security-rest-template/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch b/spring-security-rest-template/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch new file mode 100644 index 0000000000..627021fb96 --- /dev/null +++ b/spring-security-rest-template/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch @@ -0,0 +1,7 @@ + + + + + + + diff --git a/spring-security-rest-template/.gitignore b/spring-security-rest-template/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-security-rest-template/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-security-rest-template/.project b/spring-security-rest-template/.project new file mode 100644 index 0000000000..1e6360f7e2 --- /dev/null +++ b/spring-security-rest-template/.project @@ -0,0 +1,42 @@ + + + spring-security-rest-template + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.springframework.ide.eclipse.core.springbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.springframework.ide.eclipse.core.springnature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + + diff --git a/spring-security-rest-template/.settings/.jsdtscope b/spring-security-rest-template/.settings/.jsdtscope new file mode 100644 index 0000000000..7b3f0c8b9f --- /dev/null +++ b/spring-security-rest-template/.settings/.jsdtscope @@ -0,0 +1,5 @@ + + + + + diff --git a/spring-security-rest-template/.settings/org.eclipse.jdt.core.prefs b/spring-security-rest-template/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..df81356514 --- /dev/null +++ b/spring-security-rest-template/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,95 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=error +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.localVariableHiding=error +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/spring-security-rest-template/.settings/org.eclipse.jdt.ui.prefs b/spring-security-rest-template/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000000..471e9b0d81 --- /dev/null +++ b/spring-security-rest-template/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,55 @@ +#Sat Jan 21 23:04:06 EET 2012 +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=true +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.correct_indentation=true +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=true +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=true +sp_cleanup.make_private_fields_final=false +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=true +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=true +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=true +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=true +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=true +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=true +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/spring-security-rest-template/.settings/org.eclipse.m2e.core.prefs b/spring-security-rest-template/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000..f897a7f1cb --- /dev/null +++ b/spring-security-rest-template/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/spring-security-rest-template/.settings/org.eclipse.m2e.wtp.prefs b/spring-security-rest-template/.settings/org.eclipse.m2e.wtp.prefs new file mode 100644 index 0000000000..ef86089622 --- /dev/null +++ b/spring-security-rest-template/.settings/org.eclipse.m2e.wtp.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.m2e.wtp.enabledProjectSpecificPrefs=false diff --git a/spring-security-rest-template/.settings/org.eclipse.wst.common.component b/spring-security-rest-template/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000000..d81a71a7eb --- /dev/null +++ b/spring-security-rest-template/.settings/org.eclipse.wst.common.component @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/spring-security-rest-template/.settings/org.eclipse.wst.common.project.facet.core.xml b/spring-security-rest-template/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000000..b46bc511b9 --- /dev/null +++ b/spring-security-rest-template/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/spring-security-rest-template/.settings/org.eclipse.wst.jsdt.ui.superType.container b/spring-security-rest-template/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000000..3bd5d0a480 --- /dev/null +++ b/spring-security-rest-template/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/spring-security-rest-template/.settings/org.eclipse.wst.jsdt.ui.superType.name b/spring-security-rest-template/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000000..05bd71b6ec --- /dev/null +++ b/spring-security-rest-template/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/spring-security-rest-template/.settings/org.eclipse.wst.validation.prefs b/spring-security-rest-template/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000000..cacf5451ae --- /dev/null +++ b/spring-security-rest-template/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,14 @@ +DELEGATES_PREFERENCE=delegateValidatorList +USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator; +USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator; +USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationfalseversion1.2.303.v201202090300 +eclipse.preferences.version=1 +override=true +suspend=false +vals/org.eclipse.jst.jsf.ui.JSFAppConfigValidator/global=FF01 +vals/org.eclipse.jst.jsp.core.JSPBatchValidator/global=FF01 +vals/org.eclipse.jst.jsp.core.JSPContentValidator/global=FF01 +vals/org.eclipse.jst.jsp.core.TLDValidator/global=FF01 +vals/org.eclipse.wst.dtd.core.dtdDTDValidator/global=FF01 +vals/org.eclipse.wst.jsdt.web.core.JsBatchValidator/global=TF02 +vf.version=3 diff --git a/spring-security-rest-template/.settings/org.eclipse.wst.ws.service.policy.prefs b/spring-security-rest-template/.settings/org.eclipse.wst.ws.service.policy.prefs new file mode 100644 index 0000000000..9cfcabe16f --- /dev/null +++ b/spring-security-rest-template/.settings/org.eclipse.wst.ws.service.policy.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.wst.ws.service.policy.projectEnabled=false diff --git a/spring-security-rest-template/.springBeans b/spring-security-rest-template/.springBeans new file mode 100644 index 0000000000..a79097f40d --- /dev/null +++ b/spring-security-rest-template/.springBeans @@ -0,0 +1,14 @@ + + + 1 + + + + + + + src/main/webapp/WEB-INF/api-servlet.xml + + + + diff --git a/spring-security-rest-template/README.md b/spring-security-rest-template/README.md new file mode 100644 index 0000000000..3ec8cf92c7 --- /dev/null +++ b/spring-security-rest-template/README.md @@ -0,0 +1,7 @@ +========= + +## Spring Security for REST Example Project + + +### Relevant Articles: +- [Spring Security Authentication Provider](http://www.baeldung.com/spring-security-authentication-provider) diff --git a/spring-security-rest-template/pom.xml b/spring-security-rest-template/pom.xml new file mode 100644 index 0000000000..51fb1db96d --- /dev/null +++ b/spring-security-rest-template/pom.xml @@ -0,0 +1,242 @@ + + 4.0.0 + org.baeldung + spring-security-rest-template + 0.1-SNAPSHOT + + spring-security-rest-template + war + + + + + + + org.springframework.security + spring-security-web + ${org.springframework.security.version} + + + org.springframework.security + spring-security-config + ${org.springframework.security.version} + + + + + + org.springframework + spring-core + ${org.springframework.version} + + + org.springframework + spring-context + ${org.springframework.version} + + + org.springframework + spring-jdbc + ${org.springframework.version} + + + org.springframework + spring-beans + ${org.springframework.version} + + + org.springframework + spring-aop + ${org.springframework.version} + + + org.springframework + spring-tx + ${org.springframework.version} + + + org.springframework + spring-expression + ${org.springframework.version} + + + + org.springframework + spring-web + ${org.springframework.version} + + + org.springframework + spring-webmvc + ${org.springframework.version} + + + + org.springframework + spring-oxm + ${org.springframework.version} + + + + + + com.fasterxml.jackson.core + jackson-databind + 2.2.2 + + + + + + javax.servlet + javax.servlet-api + 3.0.1 + provided + + + + javax.servlet + jstl + 1.2 + runtime + + + + + + com.google.guava + guava + ${guava.version} + + + + + + junit + junit-dep + ${junit.version} + test + + + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + + + + org.mockito + mockito-core + ${mockito.version} + test + + + + + + spring-security-rest-template + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.7 + 1.7 + true + source + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + + + + + + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + jetty8x + embedded + + + + + + + 8082 + + + + + + + + + + + + 3.2.3.RELEASE + 3.1.4.RELEASE + + + 4.2.2.Final + 5.1.25 + + + 1.7.5 + 1.0.11 + + + 5.0.1.Final + + + 14.0.1 + 3.1 + + + 1.3 + 4.11 + 1.9.5 + + 4.2.4 + 4.2.5 + + 1.8.1 + 1.8.9 + + + 1.4.2 + 2.15 + + + \ No newline at end of file diff --git a/spring-security-rest-template/src/main/java/org/baeldung/security/AuthenticationFacade.java b/spring-security-rest-template/src/main/java/org/baeldung/security/AuthenticationFacade.java new file mode 100644 index 0000000000..5a3c77b070 --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/security/AuthenticationFacade.java @@ -0,0 +1,21 @@ +package org.baeldung.security; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +@Component +public class AuthenticationFacade implements IAuthenticationFacade { + + public AuthenticationFacade() { + super(); + } + + // API + + @Override + public final Authentication getAuthentication() { + return SecurityContextHolder.getContext().getAuthentication(); + } + +} diff --git a/spring-security-rest-template/src/main/java/org/baeldung/security/CustomAuthenticationProvider.java b/spring-security-rest-template/src/main/java/org/baeldung/security/CustomAuthenticationProvider.java new file mode 100644 index 0000000000..4b9b3e8ee9 --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/security/CustomAuthenticationProvider.java @@ -0,0 +1,45 @@ +package org.baeldung.security; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +@Component +public class CustomAuthenticationProvider implements AuthenticationProvider { + + public CustomAuthenticationProvider() { + super(); + } + + // API + + @Override + public Authentication authenticate(final Authentication authentication) throws AuthenticationException { + final String name = authentication.getName(); + final String password = authentication.getCredentials().toString(); + if (name.equals("admin") && password.equals("system")) { + final List grantedAuths = new ArrayList<>(); + grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER")); + final UserDetails principal = new User(name, password, grantedAuths); + final Authentication auth = new UsernamePasswordAuthenticationToken(principal, password, grantedAuths); + return auth; + } else { + return null; + } + } + + @Override + public boolean supports(final Class authentication) { + return authentication.equals(UsernamePasswordAuthenticationToken.class); + } + +} diff --git a/spring-security-rest-template/src/main/java/org/baeldung/security/IAuthenticationFacade.java b/spring-security-rest-template/src/main/java/org/baeldung/security/IAuthenticationFacade.java new file mode 100644 index 0000000000..d1223e41cf --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/security/IAuthenticationFacade.java @@ -0,0 +1,9 @@ +package org.baeldung.security; + +import org.springframework.security.core.Authentication; + +public interface IAuthenticationFacade { + + Authentication getAuthentication(); + +} \ No newline at end of file diff --git a/spring-security-rest-template/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/spring-security-rest-template/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java new file mode 100644 index 0000000000..698052fa2b --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java @@ -0,0 +1,48 @@ +package org.baeldung.security; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; +import org.springframework.security.web.savedrequest.HttpSessionRequestCache; +import org.springframework.security.web.savedrequest.RequestCache; +import org.springframework.security.web.savedrequest.SavedRequest; +import org.springframework.util.StringUtils; + +public class MySavedRequestAwareAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { + + private RequestCache requestCache = new HttpSessionRequestCache(); + + @Override + public void onAuthenticationSuccess(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) throws ServletException, IOException { + final SavedRequest savedRequest = requestCache.getRequest(request, response); + + if (savedRequest == null) { + super.onAuthenticationSuccess(request, response, authentication); + + return; + } + final String targetUrlParameter = getTargetUrlParameter(); + if (isAlwaysUseDefaultTargetUrl() || (targetUrlParameter != null && StringUtils.hasText(request.getParameter(targetUrlParameter)))) { + requestCache.removeRequest(request, response); + super.onAuthenticationSuccess(request, response, authentication); + + return; + } + + clearAuthenticationAttributes(request); + + // Use the DefaultSavedRequest URL + // final String targetUrl = savedRequest.getRedirectUrl(); + // logger.debug("Redirecting to DefaultSavedRequest Url: " + targetUrl); + // getRedirectStrategy().sendRedirect(request, response, targetUrl); + } + + public void setRequestCache(final RequestCache requestCache) { + this.requestCache = requestCache; + } +} diff --git a/spring-security-rest-template/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java b/spring-security-rest-template/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java new file mode 100644 index 0000000000..77aa32ff97 --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java @@ -0,0 +1,23 @@ +package org.baeldung.security; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +/** + * The Entry Point will not redirect to any sort of Login - it will return the 401 + */ +@Component +public final class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { + + @Override + public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + } + +} \ No newline at end of file diff --git a/spring-security-rest-template/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/spring-security-rest-template/src/main/java/org/baeldung/spring/SecSecurityConfig.java new file mode 100644 index 0000000000..4ce80dab9f --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/spring/SecSecurityConfig.java @@ -0,0 +1,16 @@ +package org.baeldung.spring; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; + +@Configuration +@ImportResource({ "classpath:webSecurityConfig.xml" }) +@ComponentScan("org.baeldung.security") +public class SecSecurityConfig { + + public SecSecurityConfig() { + super(); + } + +} diff --git a/spring-security-rest-template/src/main/java/org/baeldung/spring/WebConfig.java b/spring-security-rest-template/src/main/java/org/baeldung/spring/WebConfig.java new file mode 100644 index 0000000000..8c3d677af6 --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/spring/WebConfig.java @@ -0,0 +1,31 @@ +package org.baeldung.spring; + +import java.util.List; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +@EnableWebMvc +@ComponentScan("org.baeldung.web") +public class WebConfig extends WebMvcConfigurerAdapter { + + public WebConfig() { + super(); + } + + // beans + + @Override + public void configureMessageConverters(final List> converters) { + super.configureMessageConverters(converters); + converters.add(new MappingJackson2HttpMessageConverter()); + } + + // + +} \ No newline at end of file diff --git a/spring-security-rest-template/src/main/java/org/baeldung/web/controller/FooController.java b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/FooController.java new file mode 100644 index 0000000000..ff5a00fd95 --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/FooController.java @@ -0,0 +1,31 @@ +package org.baeldung.web.controller; + +import org.baeldung.web.dto.Foo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping(value = "/foo") +public class FooController { + + @Autowired + private ApplicationEventPublisher eventPublisher; + + public FooController() { + super(); + } + + // API + + @RequestMapping(value = "/{id}", method = RequestMethod.GET) + @ResponseBody + public Foo findOne(@PathVariable("id") final Long id) { + return new Foo(); + } + +} diff --git a/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController1.java b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController1.java new file mode 100644 index 0000000000..d06f15af93 --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController1.java @@ -0,0 +1,39 @@ +package org.baeldung.web.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class SecurityController1 { + + @Autowired + private ApplicationEventPublisher eventPublisher; + + public SecurityController1() { + super(); + } + + // API + + @RequestMapping(value = "/username1", method = RequestMethod.GET) + @ResponseBody + public String currentUserName() { + final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (!(authentication instanceof AnonymousAuthenticationToken)) { + final String currentPrincipalName = authentication.getName(); + System.out.println("Authentication: " + authentication); + System.out.println("Principal: " + authentication.getPrincipal()); + return currentPrincipalName; + } + + return null; + } + +} diff --git a/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController2.java b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController2.java new file mode 100644 index 0000000000..ac02738d0c --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController2.java @@ -0,0 +1,25 @@ +package org.baeldung.web.controller; + +import java.security.Principal; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class SecurityController2 { + + public SecurityController2() { + super(); + } + + // API + + @RequestMapping(value = "/username2", method = RequestMethod.GET) + @ResponseBody + public String currentUserNameSimple(final Principal principal) { + return principal.getName(); + } + +} diff --git a/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController3.java b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController3.java new file mode 100644 index 0000000000..fb207b43dd --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController3.java @@ -0,0 +1,27 @@ +package org.baeldung.web.controller; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class SecurityController3 { + + public SecurityController3() { + super(); + } + + // API + + @RequestMapping(value = "/username3", method = RequestMethod.GET) + @ResponseBody + public String currentUserNameSimple(final Authentication authentication) { + UserDetails userDetails = (UserDetails) authentication.getPrincipal(); + System.out.println("Retrieved user with authorities: " + userDetails.getAuthorities()); + return authentication.getName(); + } + +} diff --git a/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController4.java b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController4.java new file mode 100644 index 0000000000..0434cc5fdc --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController4.java @@ -0,0 +1,28 @@ +package org.baeldung.web.controller; + +import java.security.Principal; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class SecurityController4 { + + public SecurityController4() { + super(); + } + + // API + + @RequestMapping(value = "/username4", method = RequestMethod.GET) + @ResponseBody + public String currentUserNameSimple(final HttpServletRequest request) { + final Principal principal = request.getUserPrincipal(); + return principal.getName(); + } + +} diff --git a/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController5.java b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController5.java new file mode 100644 index 0000000000..e1a0c35cc6 --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/web/controller/SecurityController5.java @@ -0,0 +1,30 @@ +package org.baeldung.web.controller; + +import org.baeldung.security.IAuthenticationFacade; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class SecurityController5 { + + @Autowired + private IAuthenticationFacade authenticationFacade; + + public SecurityController5() { + super(); + } + + // API + + @RequestMapping(value = "/username5", method = RequestMethod.GET) + @ResponseBody + public String currentUserNameSimple() { + final Authentication authentication = authenticationFacade.getAuthentication(); + return authentication.getName(); + } + +} diff --git a/spring-security-rest-template/src/main/java/org/baeldung/web/dto/Foo.java b/spring-security-rest-template/src/main/java/org/baeldung/web/dto/Foo.java new file mode 100644 index 0000000000..09c1dac933 --- /dev/null +++ b/spring-security-rest-template/src/main/java/org/baeldung/web/dto/Foo.java @@ -0,0 +1,14 @@ +package org.baeldung.web.dto; + +import java.io.Serializable; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +public class Foo implements Serializable { + + public Foo() { + super(); + } + +} diff --git a/spring-security-rest-template/src/main/resources/logback.xml b/spring-security-rest-template/src/main/resources/logback.xml new file mode 100644 index 0000000000..1146dade63 --- /dev/null +++ b/spring-security-rest-template/src/main/resources/logback.xml @@ -0,0 +1,20 @@ + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-security-rest-template/src/main/resources/webSecurityConfig.xml b/spring-security-rest-template/src/main/resources/webSecurityConfig.xml new file mode 100644 index 0000000000..3766574f34 --- /dev/null +++ b/spring-security-rest-template/src/main/resources/webSecurityConfig.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-security-rest-template/src/main/webapp/WEB-INF/api-servlet.xml b/spring-security-rest-template/src/main/webapp/WEB-INF/api-servlet.xml new file mode 100644 index 0000000000..5463820874 --- /dev/null +++ b/spring-security-rest-template/src/main/webapp/WEB-INF/api-servlet.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/spring-security-rest-template/src/main/webapp/WEB-INF/web.xml b/spring-security-rest-template/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..372688c8d8 --- /dev/null +++ b/spring-security-rest-template/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,51 @@ + + + + Spring Security Custom Application + + + + contextClass + + org.springframework.web.context.support.AnnotationConfigWebApplicationContext + + + + contextConfigLocation + org.baeldung.spring + + + + org.springframework.web.context.ContextLoaderListener + + + + + api + org.springframework.web.servlet.DispatcherServlet + 1 + + + api + /api/* + + + + + + springSecurityFilterChain + org.springframework.web.filter.DelegatingFilterProxy + + + springSecurityFilterChain + /* + + + + + + + \ No newline at end of file diff --git a/spring-security-rest-template/src/test/resources/.gitignore b/spring-security-rest-template/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-security-rest-template/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file