├── .github └── workflows │ ├── codeql-analysis.yml │ └── gradle.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── build.gradle ├── docs ├── .gitignore ├── README.md ├── api-doc.html ├── bower.json ├── css │ ├── layout.scss │ ├── print │ │ ├── paper.css │ │ ├── paper.scss │ │ ├── pdf.css │ │ └── pdf.scss │ ├── reset.css │ ├── reveal.css │ ├── reveal.scss │ └── theme │ │ ├── README.md │ │ ├── beige.css │ │ ├── black.css │ │ ├── blood.css │ │ ├── images │ │ └── nt_logo_small.png │ │ ├── league.css │ │ ├── moon.css │ │ ├── night.css │ │ ├── novatec.css │ │ ├── serif.css │ │ ├── simple.css │ │ ├── sky.css │ │ ├── solarized.css │ │ ├── source │ │ ├── beige.scss │ │ ├── black.scss │ │ ├── blood.scss │ │ ├── league.scss │ │ ├── moon.scss │ │ ├── night.scss │ │ ├── novatec.scss │ │ ├── serif.scss │ │ ├── simple.scss │ │ ├── sky.scss │ │ ├── solarized.scss │ │ └── white.scss │ │ ├── template │ │ ├── exposer.scss │ │ ├── mixins.scss │ │ ├── settings.scss │ │ └── theme.scss │ │ └── white.css ├── demo.html ├── dist │ ├── reset.css │ ├── reveal.css │ ├── reveal.esm.js │ ├── reveal.js │ └── theme │ │ ├── beige.css │ │ ├── black.css │ │ ├── blood.css │ │ ├── fonts │ │ ├── league-gothic │ │ │ ├── LICENSE │ │ │ ├── league-gothic.css │ │ │ ├── league-gothic.eot │ │ │ ├── league-gothic.ttf │ │ │ └── league-gothic.woff │ │ └── source-sans-pro │ │ │ ├── LICENSE │ │ │ ├── source-sans-pro-italic.eot │ │ │ ├── source-sans-pro-italic.ttf │ │ │ ├── source-sans-pro-italic.woff │ │ │ ├── source-sans-pro-regular.eot │ │ │ ├── source-sans-pro-regular.ttf │ │ │ ├── source-sans-pro-regular.woff │ │ │ ├── source-sans-pro-semibold.eot │ │ │ ├── source-sans-pro-semibold.ttf │ │ │ ├── source-sans-pro-semibold.woff │ │ │ ├── source-sans-pro-semibolditalic.eot │ │ │ ├── source-sans-pro-semibolditalic.ttf │ │ │ ├── source-sans-pro-semibolditalic.woff │ │ │ └── source-sans-pro.css │ │ ├── league.css │ │ ├── moon.css │ │ ├── night.css │ │ ├── serif.css │ │ ├── simple.css │ │ ├── sky.css │ │ ├── solarized.css │ │ └── white.css ├── gruntfile.js ├── gulpfile.js ├── html5 │ ├── images │ │ ├── authorization_code_1.png │ │ ├── authorization_code_schema.png │ │ ├── automatic_role_mapping.png │ │ ├── demo-architecture.png │ │ ├── devtools_cookies.png │ │ ├── eclipse_gradle.png │ │ ├── entwicklertag-karlsruhe.jpeg │ │ ├── entwicklertag_frankfurt.jpg │ │ ├── favicon.png │ │ ├── feedback_qr_code_entwicklertag_karlsruhe.jpg │ │ ├── flux.png │ │ ├── implicit_schema.png │ │ ├── jwt_generator.png │ │ ├── jwt_generator_result.png │ │ ├── jwt_io.png │ │ ├── jwt_io_decoded.png │ │ ├── keycloak_initial_admin.png │ │ ├── keycloak_logo.png │ │ ├── keycloak_sessions.png │ │ ├── keycloak_workshop.png │ │ ├── library_client.png │ │ ├── loginform.png │ │ ├── logoutform.png │ │ ├── manual_role_mapping.png │ │ ├── mongodb_compass.png │ │ ├── mono.png │ │ ├── novatec_logo_big.png │ │ ├── oauth2_protocol.png │ │ ├── oauth2_roles.png │ │ ├── oauth2_spring_roles.png │ │ ├── oauth2_spring_roles.xml │ │ ├── oauth_roles.png │ │ ├── oidc_roles.png │ │ ├── openid_roles.png │ │ ├── owasp_top_10_2017.png │ │ ├── qr_code_frankfurter_entwicklertag.png │ │ ├── reactor_spring.png │ │ ├── robo3t.png │ │ ├── roles_permissions.png │ │ ├── session_auth.png │ │ ├── spring_io_workshop.jpg │ │ ├── spring_security_new.png │ │ ├── spring_security_old.png │ │ ├── titlelogo.png │ │ ├── token_validation.png │ │ ├── workshop_lab_1.png │ │ ├── workshop_lab_2.png │ │ ├── workshop_lab_3.png │ │ ├── workshop_lab_4.png │ │ ├── workshop_lab_5.png │ │ ├── workshop_lab_6.png │ │ └── workshop_lab_7.png │ └── workshop-tutorial.html ├── images │ ├── OpenID_logo_2.svg.png │ ├── Valet_Ferrari.png │ ├── agile-security-book.jpg │ ├── agile_security_attacks.svg │ ├── andreas_falk.jpg │ ├── asvs_40_levels.png │ ├── asvs_sample.png │ ├── auth_code_attack.png │ ├── authorization_code_1.png │ ├── authorization_code_1.xml │ ├── authorization_code_10.png │ ├── authorization_code_10.xml │ ├── authorization_code_11.png │ ├── authorization_code_11.xml │ ├── authorization_code_12.png │ ├── authorization_code_12.xml │ ├── authorization_code_13.png │ ├── authorization_code_13.xml │ ├── authorization_code_2.png │ ├── authorization_code_2.xml │ ├── authorization_code_3.png │ ├── authorization_code_3.xml │ ├── authorization_code_4.png │ ├── authorization_code_4.xml │ ├── authorization_code_5.png │ ├── authorization_code_5.xml │ ├── authorization_code_6.png │ ├── authorization_code_6.xml │ ├── authorization_code_7.png │ ├── authorization_code_7.xml │ ├── authorization_code_8.png │ ├── authorization_code_8.xml │ ├── authorization_code_9.png │ ├── authorization_code_9.xml │ ├── authorization_code_pkce.png │ ├── authorization_code_pkce.xml │ ├── authorization_code_schema.png │ ├── authorization_code_schema.xml │ ├── automatic_role_mapping.png │ ├── basic_auth.png │ ├── basic_auth.xml │ ├── big_picture_security.png │ ├── choose_appropriate_threading_model.png │ ├── cropped-novatec-favicon-192x192.png │ ├── cropped-novatec-favicon-32x32.png │ ├── demo-architecture.png │ ├── demo-architecture.xml │ ├── devops-handbook.jpg │ ├── devtools_cookies.png │ ├── eclipse_gradle.png │ ├── favicon.png │ ├── flux.png │ ├── group-1962592.png │ ├── implicit_schema.png │ ├── implicit_schema.xml │ ├── iron-glad-java.jpg │ ├── jim_manico_tweet_developer_security.png │ ├── jwt_generator.png │ ├── jwt_generator_result.png │ ├── jwt_io.png │ ├── jwt_io_decoded.png │ ├── keycloak_logo.png │ ├── keycloak_sessions.png │ ├── library_app_api.png │ ├── library_client.png │ ├── loginform.png │ ├── logoutform.png │ ├── manico_tweet_oauth2_not_authentication.png │ ├── manico_xss_local_storage.jpeg │ ├── manual_role_mapping.png │ ├── mono.png │ ├── novatec_agenda_back.png │ ├── novatec_at_glance.png │ ├── novatec_challenges.png │ ├── novatec_final_back.png │ ├── novatec_logo_big.png │ ├── novatec_offices.png │ ├── novatec_offices_back.png │ ├── novatec_separator_back.png │ ├── novatec_title_back.png │ ├── novatec_trainings.png │ ├── oauth.png │ ├── oauth2_in_action.jpg │ ├── oauth2_protocol.png │ ├── oauth2_protocol.xml │ ├── oauth2_roles.png │ ├── oauth2_roles.xml │ ├── oauth2_spring_roles.png │ ├── oauth2_spring_roles.xml │ ├── oauth_implicit_grant_attacks_d_fett.png │ ├── oauth_roles.png │ ├── oidc-map-2014.png │ ├── oidc_roles.png │ ├── oidc_roles.xml │ ├── openid_roles.png │ ├── openredirector_spring_security.png │ ├── osw2019picture.jpg │ ├── owasp-logo.png │ ├── owasp_logo.jpg │ ├── owasp_top_10_2017.png │ ├── owasp_top_10_2017_changes.png │ ├── owasp_top_10_2017_risks.png │ ├── owasp_top_10_focus.png │ ├── owasp_top_10_focus.xml │ ├── profile.png │ ├── publishersubscriber_backpressure.png │ ├── questions.png │ ├── reactive-spring-book.png │ ├── reactive_datastores.png │ ├── reactor.png │ ├── reactor_spring.png │ ├── robo3t.png │ ├── roles_permissions.png │ ├── security_headers_andreasfalk_de.png │ ├── server_web.png │ ├── server_web.xml │ ├── servlet_container_thread_pool.png │ ├── servlet_reactive_stacks.png │ ├── session_auth.png │ ├── session_auth.xml │ ├── software-quality-maslow.png │ ├── spa.png │ ├── spa.xml │ ├── spring-logo.png │ ├── spring_io_logo.png │ ├── spring_io_workshop.jpg │ ├── spring_security_5_2.png │ ├── spring_security_authentication.png │ ├── spring_security_authentication.xml │ ├── spring_security_authentication_reactive.png │ ├── spring_security_authentication_reactive.xml │ ├── spring_security_new.png │ ├── spring_security_new.xml │ ├── spring_security_old.png │ ├── spring_security_old.xml │ ├── spring_security_overview.png │ ├── spring_security_overview.xml │ ├── steps-388914_1920.jpg │ ├── threat-modeling-book.jpg │ ├── token_validation.png │ ├── token_validation.xml │ ├── twitter.png │ ├── webflux_eventloop.png │ ├── why_not_use_implicit_grant.png │ ├── workshop_lab_1.png │ ├── workshop_lab_1.xml │ ├── workshop_lab_2.png │ ├── workshop_lab_2.xml │ ├── workshop_lab_3.png │ ├── workshop_lab_3.xml │ ├── workshop_lab_4.png │ ├── workshop_lab_4.xml │ ├── workshop_lab_5.png │ ├── workshop_lab_5.xml │ ├── workshop_lab_6.png │ ├── workshop_lab_6.xml │ ├── workshop_lab_7.png │ └── workshop_lab_7.xml ├── index.html ├── js │ ├── components │ │ └── playback.js │ ├── config.js │ ├── controllers │ │ ├── autoanimate.js │ │ ├── backgrounds.js │ │ ├── controls.js │ │ ├── focus.js │ │ ├── fragments.js │ │ ├── keyboard.js │ │ ├── location.js │ │ ├── notes.js │ │ ├── overview.js │ │ ├── plugins.js │ │ ├── pointer.js │ │ ├── print.js │ │ ├── progress.js │ │ ├── slidecontent.js │ │ ├── slidenumber.js │ │ └── touch.js │ ├── index.js │ ├── reveal.js │ ├── reveal.min.js │ └── utils │ │ ├── color.js │ │ ├── constants.js │ │ ├── device.js │ │ ├── loader.js │ │ └── util.js ├── lib │ ├── css │ │ ├── monokai.css │ │ └── zenburn.css │ ├── font │ │ ├── league-gothic │ │ │ ├── LICENSE │ │ │ ├── league-gothic.css │ │ │ ├── league-gothic.eot │ │ │ ├── league-gothic.ttf │ │ │ └── league-gothic.woff │ │ └── source-sans-pro │ │ │ ├── LICENSE │ │ │ ├── source-sans-pro-italic.eot │ │ │ ├── source-sans-pro-italic.ttf │ │ │ ├── source-sans-pro-italic.woff │ │ │ ├── source-sans-pro-regular.eot │ │ │ ├── source-sans-pro-regular.ttf │ │ │ ├── source-sans-pro-regular.woff │ │ │ ├── source-sans-pro-semibold.eot │ │ │ ├── source-sans-pro-semibold.ttf │ │ │ ├── source-sans-pro-semibold.woff │ │ │ ├── source-sans-pro-semibolditalic.eot │ │ │ ├── source-sans-pro-semibolditalic.ttf │ │ │ ├── source-sans-pro-semibolditalic.woff │ │ │ └── source-sans-pro.css │ └── js │ │ ├── classList.js │ │ ├── head.min.js │ │ ├── html5shiv.js │ │ └── promise.js ├── package-lock.json ├── package.json ├── pdf │ └── workshop-tutorial.pdf ├── plugin │ ├── elapsed-time-bar │ │ └── elapsed-time-bar.js │ ├── highlight │ │ ├── highlight.esm.js │ │ ├── highlight.js │ │ ├── monokai.css │ │ ├── plugin.js │ │ └── zenburn.css │ ├── markdown │ │ ├── example.html │ │ ├── example.md │ │ ├── markdown.esm.js │ │ ├── markdown.js │ │ ├── marked.js │ │ └── plugin.js │ ├── math │ │ ├── katex.js │ │ ├── math.esm.js │ │ ├── math.js │ │ ├── mathjax2.js │ │ ├── mathjax3.js │ │ └── plugin.js │ ├── multiplex │ │ ├── client.js │ │ ├── index.js │ │ ├── master.js │ │ └── package.json │ ├── notes-server │ │ ├── client.js │ │ ├── index.js │ │ └── notes.html │ ├── notes │ │ ├── notes.esm.js │ │ ├── notes.html │ │ ├── notes.js │ │ ├── plugin.js │ │ └── speaker-view.html │ ├── print-pdf │ │ └── print-pdf.js │ ├── search │ │ ├── plugin.js │ │ ├── search.esm.js │ │ └── search.js │ ├── tagcloud │ │ └── tagcloud.js │ ├── zoom-js │ │ └── zoom.js │ └── zoom │ │ ├── plugin.js │ │ ├── zoom.esm.js │ │ └── zoom.js ├── test │ ├── examples │ │ ├── assets │ │ │ ├── beeping.txt │ │ │ ├── beeping.wav │ │ │ ├── image1.png │ │ │ └── image2.png │ │ ├── barebones.html │ │ ├── embedded-media.html │ │ ├── math.html │ │ ├── slide-backgrounds.html │ │ └── slide-transitions.html │ ├── qunit-1.12.0.css │ ├── qunit-1.12.0.js │ ├── qunit-2.5.0.css │ ├── qunit-2.5.0.js │ ├── simple.md │ ├── test-markdown-element-attributes.html │ ├── test-markdown-element-attributes.js │ ├── test-markdown-external.html │ ├── test-markdown-external.js │ ├── test-markdown-options.html │ ├── test-markdown-options.js │ ├── test-markdown-slide-attributes.html │ ├── test-markdown-slide-attributes.js │ ├── test-markdown.html │ ├── test-markdown.js │ ├── test-pdf.html │ ├── test-pdf.js │ ├── test.html │ └── test.js ├── workshop-tutorial.html └── workshop-tutorial.pdf ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── intro-labs ├── README.md ├── auth-code-demo │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── authorizationcode │ │ │ └── client │ │ │ ├── AuthorizationCodeDemo.java │ │ │ ├── config │ │ │ └── WebClientConfiguration.java │ │ │ ├── jwt │ │ │ └── JsonWebToken.java │ │ │ └── web │ │ │ ├── AuthorizationRequestController.java │ │ │ ├── CodeCallbackController.java │ │ │ ├── TokenIntrospectionController.java │ │ │ ├── TokenRequest.java │ │ │ ├── TokenRequestController.java │ │ │ └── TokenResponse.java │ │ └── resources │ │ ├── application.yml │ │ ├── static │ │ ├── css │ │ │ ├── bootstrap-grid.css │ │ │ ├── bootstrap-grid.css.map │ │ │ ├── bootstrap-grid.min.css │ │ │ ├── bootstrap-grid.min.css.map │ │ │ ├── bootstrap-reboot.css │ │ │ ├── bootstrap-reboot.css.map │ │ │ ├── bootstrap-reboot.min.css │ │ │ ├── bootstrap-reboot.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ └── js │ │ │ ├── bootstrap.bundle.js │ │ │ ├── bootstrap.bundle.js.map │ │ │ ├── bootstrap.bundle.min.js │ │ │ ├── bootstrap.bundle.min.js.map │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.js.map │ │ │ ├── bootstrap.min.js │ │ │ ├── bootstrap.min.js.map │ │ │ ├── jquery.min.js │ │ │ └── popper.min.js │ │ └── templates │ │ ├── access-token.html │ │ ├── authcode.html │ │ ├── error.html │ │ ├── init-auth-request.html │ │ └── introspection.html ├── authentication-reactive-demo │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── authentication │ │ │ │ └── demo │ │ │ │ ├── AuthenticationReactiveDemoApplication.java │ │ │ │ ├── DemoRestController.java │ │ │ │ └── ReactiveWebSecurityConfiguration.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── authentication │ │ └── demo │ │ └── AuthenticationReactiveDemoApplicationTests.java ├── authentication-servlet-demo │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── authentication │ │ │ │ └── demo │ │ │ │ ├── AuthenticationServletDemoApplication.java │ │ │ │ ├── DemoRestController.java │ │ │ │ └── WebSecurityConfiguration.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── authentication │ │ └── demo │ │ └── AuthenticationServletDemoApplicationTests.java ├── github-client │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── github │ │ │ ├── GitHubClientApplication.java │ │ │ ├── config │ │ │ └── WebClientConfiguration.java │ │ │ └── restapi │ │ │ ├── GitHubNotification.java │ │ │ ├── GitHubNotificationsController.java │ │ │ ├── GitHubRepository.java │ │ │ ├── GitHubSubject.java │ │ │ └── UserIdController.java │ │ └── resources │ │ ├── application.yml │ │ └── templates │ │ ├── index.html │ │ └── notifications.html ├── migrate-to-reactive │ ├── README.md │ ├── initial-client-application │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── settings.gradle │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── client │ │ │ │ │ ├── InitialClientApplication.java │ │ │ │ │ └── coffee │ │ │ │ │ ├── CoffeeClientRestController.java │ │ │ │ │ ├── CoffeeClientService.java │ │ │ │ │ └── CoffeeResource.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── client │ │ │ └── InitialClientApplicationTests.java │ ├── initial-server-application │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── settings.gradle │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── server │ │ │ │ │ ├── InitialServerApplication.java │ │ │ │ │ └── coffee │ │ │ │ │ ├── CoffeeEntity.java │ │ │ │ │ ├── CoffeeRepository.java │ │ │ │ │ ├── CoffeeResource.java │ │ │ │ │ ├── CoffeeResourceAssembler.java │ │ │ │ │ ├── CoffeeRestController.java │ │ │ │ │ ├── CoffeeService.java │ │ │ │ │ └── DataInitializer.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── server │ │ │ └── InitialServerApplicationTests.java │ ├── reactive-server-application │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── settings.gradle │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── server │ │ │ │ │ ├── ReactiveServerApplication.java │ │ │ │ │ └── coffee │ │ │ │ │ ├── CoffeeEntity.java │ │ │ │ │ ├── CoffeeRepository.java │ │ │ │ │ ├── CoffeeResource.java │ │ │ │ │ ├── CoffeeResourceAssembler.java │ │ │ │ │ ├── CoffeeRestController.java │ │ │ │ │ ├── CoffeeService.java │ │ │ │ │ └── DataInitializer.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── server │ │ │ └── ReactiveServerApplicationTests.java │ └── web-client-application │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle │ │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── settings.gradle │ │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── client │ │ │ │ ├── WebClientApplication.java │ │ │ │ └── coffee │ │ │ │ ├── CoffeeClientRestController.java │ │ │ │ ├── CoffeeClientService.java │ │ │ │ └── CoffeeResource.java │ │ └── resources │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── client │ │ └── WebClientApplicationTests.java └── reactive-playground │ ├── README.md │ ├── build.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ ├── main │ └── java │ │ └── com │ │ └── example │ │ ├── Address.java │ │ ├── Country.java │ │ └── Person.java │ └── test │ └── java │ └── com │ └── example │ └── BasicReactivePlaygroundTest.java ├── lab-1 ├── README.md ├── complete-library-server │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ ├── docs │ │ └── asciidoc │ │ │ └── index.adoc │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── library │ │ │ │ └── server │ │ │ │ ├── DataInitializer.java │ │ │ │ ├── Lab1CompleteLibraryServerApplication.java │ │ │ │ ├── api │ │ │ │ ├── BookResource.java │ │ │ │ ├── BookResourceAssembler.java │ │ │ │ ├── BookRestController.java │ │ │ │ ├── CreateUserResource.java │ │ │ │ ├── ErrorHandler.java │ │ │ │ ├── UserHandler.java │ │ │ │ ├── UserResource.java │ │ │ │ └── UserResourceAssembler.java │ │ │ │ ├── business │ │ │ │ ├── BookService.java │ │ │ │ └── UserService.java │ │ │ │ ├── common │ │ │ │ └── Role.java │ │ │ │ ├── config │ │ │ │ ├── IdGeneratorConfiguration.java │ │ │ │ ├── ModelMapperConfiguration.java │ │ │ │ └── UserRouter.java │ │ │ │ └── dataaccess │ │ │ │ ├── Book.java │ │ │ │ ├── BookRepository.java │ │ │ │ ├── User.java │ │ │ │ └── UserRepository.java │ │ └── resources │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── library │ │ └── server │ │ ├── api │ │ ├── BookApiDocumentationTest.java │ │ └── UserApiDocumentationTest.java │ │ └── dataaccess │ │ ├── BookBuilder.java │ │ └── UserBuilder.java └── initial-library-server │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ ├── docs │ └── asciidoc │ │ └── index.adoc │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── library │ │ │ └── server │ │ │ ├── DataInitializer.java │ │ │ ├── InitialLibraryServerApplication.java │ │ │ ├── api │ │ │ ├── BookResource.java │ │ │ ├── BookResourceAssembler.java │ │ │ ├── BookRestController.java │ │ │ ├── CreateUserResource.java │ │ │ ├── ErrorHandler.java │ │ │ ├── UserHandler.java │ │ │ ├── UserResource.java │ │ │ └── UserResourceAssembler.java │ │ │ ├── business │ │ │ ├── BookService.java │ │ │ └── UserService.java │ │ │ ├── common │ │ │ └── Role.java │ │ │ ├── config │ │ │ ├── IdGeneratorConfiguration.java │ │ │ ├── ModelMapperConfiguration.java │ │ │ └── UserRouter.java │ │ │ └── dataaccess │ │ │ ├── Book.java │ │ │ ├── BookRepository.java │ │ │ ├── User.java │ │ │ └── UserRepository.java │ └── resources │ │ └── application.yml │ └── test │ └── java │ └── com │ └── example │ └── library │ └── server │ ├── api │ ├── BookApiDocumentationTest.java │ └── UserApiDocumentationTest.java │ └── dataaccess │ ├── BookBuilder.java │ └── UserBuilder.java ├── lab-2 ├── README.md └── complete-library-server │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ ├── docs │ └── asciidoc │ │ └── index.adoc │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── library │ │ │ └── server │ │ │ ├── DataInitializer.java │ │ │ ├── Lab2CompleteLibraryServerApplication.java │ │ │ ├── api │ │ │ ├── BookResource.java │ │ │ ├── BookResourceAssembler.java │ │ │ ├── BookRestController.java │ │ │ ├── CreateUserResource.java │ │ │ ├── ErrorHandler.java │ │ │ ├── UserHandler.java │ │ │ ├── UserResource.java │ │ │ └── UserResourceAssembler.java │ │ │ ├── business │ │ │ ├── BookService.java │ │ │ └── UserService.java │ │ │ ├── common │ │ │ └── Role.java │ │ │ ├── config │ │ │ ├── IdGeneratorConfiguration.java │ │ │ ├── ModelMapperConfiguration.java │ │ │ ├── UserRouter.java │ │ │ └── WebSecurityConfiguration.java │ │ │ ├── dataaccess │ │ │ ├── Book.java │ │ │ ├── BookRepository.java │ │ │ ├── User.java │ │ │ └── UserRepository.java │ │ │ ├── filter │ │ │ └── LoggingWebFilter.java │ │ │ └── security │ │ │ ├── LibraryReactiveUserDetailsService.java │ │ │ └── LibraryUser.java │ └── resources │ │ └── application.yml │ └── test │ ├── java │ └── com │ │ └── example │ │ └── library │ │ └── server │ │ ├── api │ │ ├── BookApiDocumentationTest.java │ │ └── UserApiDocumentationTest.java │ │ └── dataaccess │ │ ├── BookBuilder.java │ │ └── UserBuilder.java │ └── resources │ └── application.yml ├── lab-3 ├── README.md └── complete-library-server │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ ├── docs │ └── asciidoc │ │ └── index.adoc │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── library │ │ │ └── server │ │ │ ├── DataInitializer.java │ │ │ ├── Lab3CompleteLibraryServerApplication.java │ │ │ ├── api │ │ │ ├── BookResource.java │ │ │ ├── BookResourceAssembler.java │ │ │ ├── BookRestController.java │ │ │ ├── CreateUserResource.java │ │ │ ├── ErrorHandler.java │ │ │ ├── UserHandler.java │ │ │ ├── UserResource.java │ │ │ └── UserResourceAssembler.java │ │ │ ├── business │ │ │ ├── BookService.java │ │ │ └── UserService.java │ │ │ ├── common │ │ │ └── Role.java │ │ │ ├── config │ │ │ ├── IdGeneratorConfiguration.java │ │ │ ├── ModelMapperConfiguration.java │ │ │ ├── UserRouter.java │ │ │ └── WebSecurityConfiguration.java │ │ │ ├── dataaccess │ │ │ ├── Book.java │ │ │ ├── BookRepository.java │ │ │ ├── User.java │ │ │ └── UserRepository.java │ │ │ ├── filter │ │ │ └── LoggingWebFilter.java │ │ │ └── security │ │ │ ├── LibraryReactiveUserDetailsService.java │ │ │ └── LibraryUser.java │ └── resources │ │ └── application.yml │ └── test │ ├── java │ └── com │ │ └── example │ │ └── library │ │ └── server │ │ ├── api │ │ ├── BookApiDocumentationTest.java │ │ └── UserApiDocumentationTest.java │ │ └── dataaccess │ │ ├── BookBuilder.java │ │ └── UserBuilder.java │ └── resources │ └── application.yml ├── lab-4 ├── README.md └── complete-library-server │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ ├── docs │ └── asciidoc │ │ └── index.adoc │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── library │ │ │ └── server │ │ │ ├── DataInitializer.java │ │ │ ├── Lab4CompleteLibraryServerApplication.java │ │ │ ├── api │ │ │ ├── BookResource.java │ │ │ ├── BookResourceAssembler.java │ │ │ ├── BookRestController.java │ │ │ ├── CreateUserResource.java │ │ │ ├── ErrorHandler.java │ │ │ ├── UserHandler.java │ │ │ ├── UserResource.java │ │ │ └── UserResourceAssembler.java │ │ │ ├── business │ │ │ ├── BookService.java │ │ │ └── UserService.java │ │ │ ├── common │ │ │ └── Role.java │ │ │ ├── config │ │ │ ├── IdGeneratorConfiguration.java │ │ │ ├── ModelMapperConfiguration.java │ │ │ ├── UserRouter.java │ │ │ └── WebSecurityConfiguration.java │ │ │ ├── dataaccess │ │ │ ├── Book.java │ │ │ ├── BookRepository.java │ │ │ ├── User.java │ │ │ └── UserRepository.java │ │ │ ├── filter │ │ │ └── LoggingWebFilter.java │ │ │ └── security │ │ │ ├── LibraryReactiveUserDetailsService.java │ │ │ └── LibraryUser.java │ └── resources │ │ └── application.yml │ └── test │ ├── java │ └── com │ │ └── example │ │ └── library │ │ └── server │ │ ├── api │ │ ├── BookApiAuthenticationTest.java │ │ ├── BookApiDocumentationTest.java │ │ ├── UserApiAuthenticationTest.java │ │ └── UserApiDocumentationTest.java │ │ ├── business │ │ ├── BookServiceAuthorizationTest.java │ │ └── UserServiceAuthorizationTest.java │ │ └── dataaccess │ │ ├── BookBuilder.java │ │ └── UserBuilder.java │ └── resources │ └── application.yml ├── lab-5 ├── README.md ├── complete-resource-server │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ ├── docs │ │ └── asciidoc │ │ │ └── index.adoc │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── library │ │ │ │ └── server │ │ │ │ ├── CompleteResourceServerApplication.java │ │ │ │ ├── DataInitializer.java │ │ │ │ ├── api │ │ │ │ ├── BookResource.java │ │ │ │ ├── BookResourceAssembler.java │ │ │ │ ├── BookRestController.java │ │ │ │ ├── ErrorHandler.java │ │ │ │ ├── UserHandler.java │ │ │ │ ├── UserResource.java │ │ │ │ └── UserResourceAssembler.java │ │ │ │ ├── business │ │ │ │ ├── BookService.java │ │ │ │ └── UserService.java │ │ │ │ ├── common │ │ │ │ └── Role.java │ │ │ │ ├── config │ │ │ │ ├── IdGeneratorConfiguration.java │ │ │ │ ├── LibraryUserJwtAuthenticationConverter.java │ │ │ │ ├── LibraryUserRolesJwtAuthenticationConverter.java │ │ │ │ ├── ModelMapperConfiguration.java │ │ │ │ ├── UserRouter.java │ │ │ │ └── WebSecurityConfiguration.java │ │ │ │ ├── dataaccess │ │ │ │ ├── Book.java │ │ │ │ ├── BookRepository.java │ │ │ │ ├── User.java │ │ │ │ └── UserRepository.java │ │ │ │ ├── filter │ │ │ │ └── LoggingWebFilter.java │ │ │ │ └── security │ │ │ │ ├── LibraryReactiveUserDetailsService.java │ │ │ │ └── LibraryUser.java │ │ └── resources │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── library │ │ └── server │ │ ├── api │ │ ├── BookApiDocumentationTest.java │ │ └── UserApiDocumentationTest.java │ │ ├── business │ │ ├── BookServiceAuthorizationTest.java │ │ └── UserServiceAuthorizationTest.java │ │ └── dataaccess │ │ ├── BookBuilder.java │ │ └── UserBuilder.java └── initial-resource-server │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ ├── docs │ └── asciidoc │ │ └── index.adoc │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── library │ │ │ └── server │ │ │ ├── DataInitializer.java │ │ │ ├── InitialResourceServerApplication.java │ │ │ ├── api │ │ │ ├── BookResource.java │ │ │ ├── BookResourceAssembler.java │ │ │ ├── BookRestController.java │ │ │ ├── ErrorHandler.java │ │ │ ├── UserHandler.java │ │ │ ├── UserResource.java │ │ │ └── UserResourceAssembler.java │ │ │ ├── business │ │ │ ├── BookService.java │ │ │ └── UserService.java │ │ │ ├── common │ │ │ └── Role.java │ │ │ ├── config │ │ │ ├── IdGeneratorConfiguration.java │ │ │ ├── ModelMapperConfiguration.java │ │ │ ├── UserRouter.java │ │ │ └── WebSecurityConfiguration.java │ │ │ ├── dataaccess │ │ │ ├── Book.java │ │ │ ├── BookRepository.java │ │ │ ├── User.java │ │ │ └── UserRepository.java │ │ │ ├── filter │ │ │ └── LoggingWebFilter.java │ │ │ └── security │ │ │ ├── LibraryReactiveUserDetailsService.java │ │ │ └── LibraryUser.java │ └── resources │ │ └── application.yml │ └── test │ └── java │ └── com │ └── example │ └── library │ └── server │ ├── api │ ├── BookApiDocumentationTest.java │ └── UserApiDocumentationTest.java │ ├── business │ ├── BookServiceAuthorizationTest.java │ └── UserServiceAuthorizationTest.java │ └── dataaccess │ ├── BookBuilder.java │ └── UserBuilder.java ├── lab-6 ├── README.md ├── complete-oidc-client │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── oidc │ │ │ └── client │ │ │ ├── CompleteOidcClientApplication.java │ │ │ ├── api │ │ │ ├── BookController.java │ │ │ ├── ErrorHandler.java │ │ │ ├── UserController.java │ │ │ ├── UserInfoRestController.java │ │ │ └── resource │ │ │ │ ├── BookResource.java │ │ │ │ ├── CreateBookResource.java │ │ │ │ ├── UserInfo.java │ │ │ │ └── UserResource.java │ │ │ └── config │ │ │ ├── SecurityConfiguration.java │ │ │ └── WebClientConfiguration.java │ │ └── resources │ │ ├── application.yml │ │ ├── static │ │ ├── css │ │ │ ├── bootstrap-grid.css │ │ │ ├── bootstrap-grid.css.map │ │ │ ├── bootstrap-grid.min.css │ │ │ ├── bootstrap-grid.min.css.map │ │ │ ├── bootstrap-reboot.css │ │ │ ├── bootstrap-reboot.css.map │ │ │ ├── bootstrap-reboot.min.css │ │ │ ├── bootstrap-reboot.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ └── js │ │ │ ├── bootstrap.bundle.js │ │ │ ├── bootstrap.bundle.js.map │ │ │ ├── bootstrap.bundle.min.js │ │ │ ├── bootstrap.bundle.min.js.map │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.js.map │ │ │ ├── bootstrap.min.js │ │ │ ├── bootstrap.min.js.map │ │ │ ├── jquery.min.js │ │ │ └── popper.min.js │ │ └── templates │ │ ├── createbookform.html │ │ ├── error.html │ │ ├── index.html │ │ └── users.html └── initial-oidc-client │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ └── main │ ├── java │ └── com │ │ └── example │ │ └── oidc │ │ └── client │ │ ├── InitialOidcClientApplication.java │ │ ├── api │ │ ├── BookController.java │ │ ├── ErrorHandler.java │ │ ├── UserController.java │ │ ├── UserInfoRestController.java │ │ └── resource │ │ │ ├── BookResource.java │ │ │ ├── CreateBookResource.java │ │ │ ├── UserInfo.java │ │ │ └── UserResource.java │ │ └── config │ │ ├── SecurityConfiguration.java │ │ └── WebClientConfiguration.java │ └── resources │ ├── application.yml │ ├── static │ ├── css │ │ ├── bootstrap-grid.css │ │ ├── bootstrap-grid.css.map │ │ ├── bootstrap-grid.min.css │ │ ├── bootstrap-grid.min.css.map │ │ ├── bootstrap-reboot.css │ │ ├── bootstrap-reboot.css.map │ │ ├── bootstrap-reboot.min.css │ │ ├── bootstrap-reboot.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ └── js │ │ ├── bootstrap.bundle.js │ │ ├── bootstrap.bundle.js.map │ │ ├── bootstrap.bundle.min.js │ │ ├── bootstrap.bundle.min.js.map │ │ ├── bootstrap.js │ │ ├── bootstrap.js.map │ │ ├── bootstrap.min.js │ │ ├── bootstrap.min.js.map │ │ ├── jquery.min.js │ │ └── popper.min.js │ └── templates │ ├── createbookform.html │ ├── error.html │ ├── index.html │ └── users.html ├── settings.gradle ├── setup ├── README.md ├── export_keycloak_realm.bat ├── export_keycloak_realm.sh ├── import_keycloak_realm.bat ├── import_keycloak_realm.sh ├── keycloak_initial_admin.png ├── keycloak_realm_workshop.json ├── keycloak_workshop.png ├── mongodb_compass.png ├── oidc_workshop.postman_collection.json ├── run_keycloak_docker.bat └── run_keycloak_docker.sh └── workshop-docs ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src └── docs ├── asciidoc ├── 10_oauth2_openid_connect.adoc ├── 1_intro.adoc ├── 2_security_intro.adoc ├── 3_reactive_streams.adoc ├── 4_workshop_application.adoc ├── 5_intro_labs.adoc ├── 6_lab1_autoconfiguration.adoc ├── 7_lab2_customize_authentication.adoc ├── 8_lab3_authorization.adoc ├── 9_lab4_testing.adoc ├── images │ ├── authorization_code_1.png │ ├── authorization_code_schema.png │ ├── automatic_role_mapping.png │ ├── demo-architecture.png │ ├── devtools_cookies.png │ ├── eclipse_gradle.png │ ├── favicon.png │ ├── flux.png │ ├── implicit_schema.png │ ├── jwt_generator.png │ ├── jwt_generator_result.png │ ├── jwt_io.png │ ├── jwt_io_decoded.png │ ├── keycloak_initial_admin.png │ ├── keycloak_logo.png │ ├── keycloak_sessions.png │ ├── keycloak_workshop.png │ ├── library_client.png │ ├── loginform.png │ ├── logoutform.png │ ├── manual_role_mapping.png │ ├── mongodb_compass.png │ ├── mono.png │ ├── novatec_logo_big.png │ ├── oauth2_protocol.png │ ├── oauth2_roles.png │ ├── oauth2_spring_roles.png │ ├── oauth2_spring_roles.xml │ ├── oauth_roles.png │ ├── oidc_roles.png │ ├── openid_roles.png │ ├── owasp_top_10_2017.png │ ├── reactor_spring.png │ ├── robo3t.png │ ├── roles_permissions.png │ ├── session_auth.png │ ├── spring_io_workshop.jpg │ ├── spring_security_new.png │ ├── spring_security_old.png │ ├── titlelogo.png │ ├── token_validation.png │ ├── workshop_lab_1.png │ ├── workshop_lab_2.png │ ├── workshop_lab_3.png │ ├── workshop_lab_4.png │ ├── workshop_lab_5.png │ ├── workshop_lab_6.png │ └── workshop_lab_7.png └── workshop-tutorial.adoc └── snippets ├── step-1-default-password-console.adoc ├── step-1-gradle-build.adoc ├── step-1-security-response-header.adoc ├── step-2-data-initializer-old-user.adoc ├── step-2-data-initializer.adoc ├── step-2-default-security-config.adoc ├── step-2-delegating-password-encoder.adoc ├── step-2-library-user-details-password-service.adoc ├── step-2-library-user-details-service.adoc ├── step-2-library-user.adoc ├── step-2-logging-web-filter.adoc ├── step-2-password-encoder-config.adoc ├── step-2-password-encoder.adoc ├── step-2-reactive-user-details-password-service.adoc ├── step-2-security-web-filter-chain.adoc ├── step-2-web-filter-chain-proxy.adoc ├── step-2-web-filter.adoc ├── step-3-authentication-principal.adoc ├── step-3-book-authorization.adoc ├── step-3-csrf-disable.adoc ├── step-3-csrf-error.adoc ├── step-3-permission-evaluator.adoc ├── step-3-spring-security-filter-chain.adoc ├── step-3-user-authorization.adoc ├── step-4-book-authentication-test.adoc ├── step-4-book-authorization-test.adoc ├── step-4-user-authorization-test.adoc ├── step-5-client-properties.adoc ├── step-5-client-security-configuration.adoc ├── step-5-common-oauth2-provider.adoc ├── step-5-google-oauth2-provider-properties.adoc ├── step-5-library-user-jwt-converter.adoc ├── step-5-library-user-roles-jwt-converter.adoc ├── step-5-oauth2-client-book-controller.adoc ├── step-5-oauth2-client-gradle-build.adoc ├── step-5-oauth2-client-properties.adoc ├── step-5-oauth2-client-security-configuration.adoc ├── step-5-oauth2-client-user-info-rest-controller.adoc ├── step-5-oauth2-resource-server-gradle-build.adoc ├── step-5-oauth2-resource-server-properties.adoc ├── step-5-oauth2-resource-server-websecurity.adoc ├── step-5-webclient-configuration.adoc └── step-5-well-known-oidc-config.adoc /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.war 15 | *.ear 16 | *.tar.gz 17 | *.rar 18 | 19 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 20 | hs_err_pid* 21 | 22 | .idea/ 23 | .gradle/ 24 | out/ 25 | build/ 26 | bin/ 27 | .settings/ 28 | *.iml 29 | .project 30 | .classpath 31 | .vscode/ 32 | docs/pdf/images -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | } 3 | 4 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # spring-security-workshops 2 | Overview of spring security workshops 3 | -------------------------------------------------------------------------------- /docs/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reveal.js", 3 | "version": "3.9.2", 4 | "main": [ 5 | "js/reveal.js", 6 | "css/reveal.css" 7 | ], 8 | "homepage": "http://revealjs.com", 9 | "license": "MIT", 10 | "description": "The HTML Presentation Framework", 11 | "authors": [ 12 | "Hakim El Hattab " 13 | ], 14 | "repository": { 15 | "type": "git", 16 | "url": "git://github.com/hakimel/reveal.js.git" 17 | }, 18 | "ignore": [ 19 | "**/.*", 20 | "node_modules", 21 | "bower_components", 22 | "test" 23 | ] 24 | } -------------------------------------------------------------------------------- /docs/css/theme/images/nt_logo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/css/theme/images/nt_logo_small.png -------------------------------------------------------------------------------- /docs/dist/theme/fonts/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /docs/dist/theme/fonts/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('./league-gothic.eot'); 4 | src: url('./league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('./league-gothic.woff') format('woff'), 6 | url('./league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | -------------------------------------------------------------------------------- /docs/dist/theme/fonts/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /docs/dist/theme/fonts/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /docs/dist/theme/fonts/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /docs/html5/images/authorization_code_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/authorization_code_1.png -------------------------------------------------------------------------------- /docs/html5/images/authorization_code_schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/authorization_code_schema.png -------------------------------------------------------------------------------- /docs/html5/images/automatic_role_mapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/automatic_role_mapping.png -------------------------------------------------------------------------------- /docs/html5/images/demo-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/demo-architecture.png -------------------------------------------------------------------------------- /docs/html5/images/devtools_cookies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/devtools_cookies.png -------------------------------------------------------------------------------- /docs/html5/images/eclipse_gradle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/eclipse_gradle.png -------------------------------------------------------------------------------- /docs/html5/images/entwicklertag-karlsruhe.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/entwicklertag-karlsruhe.jpeg -------------------------------------------------------------------------------- /docs/html5/images/entwicklertag_frankfurt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/entwicklertag_frankfurt.jpg -------------------------------------------------------------------------------- /docs/html5/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/favicon.png -------------------------------------------------------------------------------- /docs/html5/images/feedback_qr_code_entwicklertag_karlsruhe.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/feedback_qr_code_entwicklertag_karlsruhe.jpg -------------------------------------------------------------------------------- /docs/html5/images/flux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/flux.png -------------------------------------------------------------------------------- /docs/html5/images/implicit_schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/implicit_schema.png -------------------------------------------------------------------------------- /docs/html5/images/jwt_generator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/jwt_generator.png -------------------------------------------------------------------------------- /docs/html5/images/jwt_generator_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/jwt_generator_result.png -------------------------------------------------------------------------------- /docs/html5/images/jwt_io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/jwt_io.png -------------------------------------------------------------------------------- /docs/html5/images/jwt_io_decoded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/jwt_io_decoded.png -------------------------------------------------------------------------------- /docs/html5/images/keycloak_initial_admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/keycloak_initial_admin.png -------------------------------------------------------------------------------- /docs/html5/images/keycloak_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/keycloak_logo.png -------------------------------------------------------------------------------- /docs/html5/images/keycloak_sessions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/keycloak_sessions.png -------------------------------------------------------------------------------- /docs/html5/images/keycloak_workshop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/keycloak_workshop.png -------------------------------------------------------------------------------- /docs/html5/images/library_client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/library_client.png -------------------------------------------------------------------------------- /docs/html5/images/loginform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/loginform.png -------------------------------------------------------------------------------- /docs/html5/images/logoutform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/logoutform.png -------------------------------------------------------------------------------- /docs/html5/images/manual_role_mapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/manual_role_mapping.png -------------------------------------------------------------------------------- /docs/html5/images/mongodb_compass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/mongodb_compass.png -------------------------------------------------------------------------------- /docs/html5/images/mono.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/mono.png -------------------------------------------------------------------------------- /docs/html5/images/novatec_logo_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/novatec_logo_big.png -------------------------------------------------------------------------------- /docs/html5/images/oauth2_protocol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/oauth2_protocol.png -------------------------------------------------------------------------------- /docs/html5/images/oauth2_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/oauth2_roles.png -------------------------------------------------------------------------------- /docs/html5/images/oauth2_spring_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/oauth2_spring_roles.png -------------------------------------------------------------------------------- /docs/html5/images/oauth_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/oauth_roles.png -------------------------------------------------------------------------------- /docs/html5/images/oidc_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/oidc_roles.png -------------------------------------------------------------------------------- /docs/html5/images/openid_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/openid_roles.png -------------------------------------------------------------------------------- /docs/html5/images/owasp_top_10_2017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/owasp_top_10_2017.png -------------------------------------------------------------------------------- /docs/html5/images/qr_code_frankfurter_entwicklertag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/qr_code_frankfurter_entwicklertag.png -------------------------------------------------------------------------------- /docs/html5/images/reactor_spring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/reactor_spring.png -------------------------------------------------------------------------------- /docs/html5/images/robo3t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/robo3t.png -------------------------------------------------------------------------------- /docs/html5/images/roles_permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/roles_permissions.png -------------------------------------------------------------------------------- /docs/html5/images/session_auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/session_auth.png -------------------------------------------------------------------------------- /docs/html5/images/spring_io_workshop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/spring_io_workshop.jpg -------------------------------------------------------------------------------- /docs/html5/images/spring_security_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/spring_security_new.png -------------------------------------------------------------------------------- /docs/html5/images/spring_security_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/spring_security_old.png -------------------------------------------------------------------------------- /docs/html5/images/titlelogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/titlelogo.png -------------------------------------------------------------------------------- /docs/html5/images/token_validation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/token_validation.png -------------------------------------------------------------------------------- /docs/html5/images/workshop_lab_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/workshop_lab_1.png -------------------------------------------------------------------------------- /docs/html5/images/workshop_lab_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/workshop_lab_2.png -------------------------------------------------------------------------------- /docs/html5/images/workshop_lab_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/workshop_lab_3.png -------------------------------------------------------------------------------- /docs/html5/images/workshop_lab_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/workshop_lab_4.png -------------------------------------------------------------------------------- /docs/html5/images/workshop_lab_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/workshop_lab_5.png -------------------------------------------------------------------------------- /docs/html5/images/workshop_lab_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/workshop_lab_6.png -------------------------------------------------------------------------------- /docs/html5/images/workshop_lab_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/html5/images/workshop_lab_7.png -------------------------------------------------------------------------------- /docs/images/OpenID_logo_2.svg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/OpenID_logo_2.svg.png -------------------------------------------------------------------------------- /docs/images/Valet_Ferrari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/Valet_Ferrari.png -------------------------------------------------------------------------------- /docs/images/agile-security-book.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/agile-security-book.jpg -------------------------------------------------------------------------------- /docs/images/andreas_falk.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/andreas_falk.jpg -------------------------------------------------------------------------------- /docs/images/asvs_40_levels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/asvs_40_levels.png -------------------------------------------------------------------------------- /docs/images/asvs_sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/asvs_sample.png -------------------------------------------------------------------------------- /docs/images/auth_code_attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/auth_code_attack.png -------------------------------------------------------------------------------- /docs/images/authorization_code_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_1.png -------------------------------------------------------------------------------- /docs/images/authorization_code_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_10.png -------------------------------------------------------------------------------- /docs/images/authorization_code_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_11.png -------------------------------------------------------------------------------- /docs/images/authorization_code_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_12.png -------------------------------------------------------------------------------- /docs/images/authorization_code_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_13.png -------------------------------------------------------------------------------- /docs/images/authorization_code_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_2.png -------------------------------------------------------------------------------- /docs/images/authorization_code_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_3.png -------------------------------------------------------------------------------- /docs/images/authorization_code_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_4.png -------------------------------------------------------------------------------- /docs/images/authorization_code_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_5.png -------------------------------------------------------------------------------- /docs/images/authorization_code_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_6.png -------------------------------------------------------------------------------- /docs/images/authorization_code_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_7.png -------------------------------------------------------------------------------- /docs/images/authorization_code_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_8.png -------------------------------------------------------------------------------- /docs/images/authorization_code_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_9.png -------------------------------------------------------------------------------- /docs/images/authorization_code_pkce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_pkce.png -------------------------------------------------------------------------------- /docs/images/authorization_code_schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/authorization_code_schema.png -------------------------------------------------------------------------------- /docs/images/automatic_role_mapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/automatic_role_mapping.png -------------------------------------------------------------------------------- /docs/images/basic_auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/basic_auth.png -------------------------------------------------------------------------------- /docs/images/big_picture_security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/big_picture_security.png -------------------------------------------------------------------------------- /docs/images/choose_appropriate_threading_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/choose_appropriate_threading_model.png -------------------------------------------------------------------------------- /docs/images/cropped-novatec-favicon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/cropped-novatec-favicon-192x192.png -------------------------------------------------------------------------------- /docs/images/cropped-novatec-favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/cropped-novatec-favicon-32x32.png -------------------------------------------------------------------------------- /docs/images/demo-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/demo-architecture.png -------------------------------------------------------------------------------- /docs/images/devops-handbook.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/devops-handbook.jpg -------------------------------------------------------------------------------- /docs/images/devtools_cookies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/devtools_cookies.png -------------------------------------------------------------------------------- /docs/images/eclipse_gradle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/eclipse_gradle.png -------------------------------------------------------------------------------- /docs/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/favicon.png -------------------------------------------------------------------------------- /docs/images/flux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/flux.png -------------------------------------------------------------------------------- /docs/images/group-1962592.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/group-1962592.png -------------------------------------------------------------------------------- /docs/images/implicit_schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/implicit_schema.png -------------------------------------------------------------------------------- /docs/images/iron-glad-java.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/iron-glad-java.jpg -------------------------------------------------------------------------------- /docs/images/jim_manico_tweet_developer_security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/jim_manico_tweet_developer_security.png -------------------------------------------------------------------------------- /docs/images/jwt_generator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/jwt_generator.png -------------------------------------------------------------------------------- /docs/images/jwt_generator_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/jwt_generator_result.png -------------------------------------------------------------------------------- /docs/images/jwt_io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/jwt_io.png -------------------------------------------------------------------------------- /docs/images/jwt_io_decoded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/jwt_io_decoded.png -------------------------------------------------------------------------------- /docs/images/keycloak_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/keycloak_logo.png -------------------------------------------------------------------------------- /docs/images/keycloak_sessions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/keycloak_sessions.png -------------------------------------------------------------------------------- /docs/images/library_app_api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/library_app_api.png -------------------------------------------------------------------------------- /docs/images/library_client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/library_client.png -------------------------------------------------------------------------------- /docs/images/loginform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/loginform.png -------------------------------------------------------------------------------- /docs/images/logoutform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/logoutform.png -------------------------------------------------------------------------------- /docs/images/manico_tweet_oauth2_not_authentication.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/manico_tweet_oauth2_not_authentication.png -------------------------------------------------------------------------------- /docs/images/manico_xss_local_storage.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/manico_xss_local_storage.jpeg -------------------------------------------------------------------------------- /docs/images/manual_role_mapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/manual_role_mapping.png -------------------------------------------------------------------------------- /docs/images/mono.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/mono.png -------------------------------------------------------------------------------- /docs/images/novatec_agenda_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/novatec_agenda_back.png -------------------------------------------------------------------------------- /docs/images/novatec_at_glance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/novatec_at_glance.png -------------------------------------------------------------------------------- /docs/images/novatec_challenges.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/novatec_challenges.png -------------------------------------------------------------------------------- /docs/images/novatec_final_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/novatec_final_back.png -------------------------------------------------------------------------------- /docs/images/novatec_logo_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/novatec_logo_big.png -------------------------------------------------------------------------------- /docs/images/novatec_offices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/novatec_offices.png -------------------------------------------------------------------------------- /docs/images/novatec_offices_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/novatec_offices_back.png -------------------------------------------------------------------------------- /docs/images/novatec_separator_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/novatec_separator_back.png -------------------------------------------------------------------------------- /docs/images/novatec_title_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/novatec_title_back.png -------------------------------------------------------------------------------- /docs/images/novatec_trainings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/novatec_trainings.png -------------------------------------------------------------------------------- /docs/images/oauth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/oauth.png -------------------------------------------------------------------------------- /docs/images/oauth2_in_action.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/oauth2_in_action.jpg -------------------------------------------------------------------------------- /docs/images/oauth2_protocol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/oauth2_protocol.png -------------------------------------------------------------------------------- /docs/images/oauth2_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/oauth2_roles.png -------------------------------------------------------------------------------- /docs/images/oauth2_spring_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/oauth2_spring_roles.png -------------------------------------------------------------------------------- /docs/images/oauth_implicit_grant_attacks_d_fett.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/oauth_implicit_grant_attacks_d_fett.png -------------------------------------------------------------------------------- /docs/images/oauth_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/oauth_roles.png -------------------------------------------------------------------------------- /docs/images/oidc-map-2014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/oidc-map-2014.png -------------------------------------------------------------------------------- /docs/images/oidc_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/oidc_roles.png -------------------------------------------------------------------------------- /docs/images/openid_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/openid_roles.png -------------------------------------------------------------------------------- /docs/images/openredirector_spring_security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/openredirector_spring_security.png -------------------------------------------------------------------------------- /docs/images/osw2019picture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/osw2019picture.jpg -------------------------------------------------------------------------------- /docs/images/owasp-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/owasp-logo.png -------------------------------------------------------------------------------- /docs/images/owasp_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/owasp_logo.jpg -------------------------------------------------------------------------------- /docs/images/owasp_top_10_2017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/owasp_top_10_2017.png -------------------------------------------------------------------------------- /docs/images/owasp_top_10_2017_changes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/owasp_top_10_2017_changes.png -------------------------------------------------------------------------------- /docs/images/owasp_top_10_2017_risks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/owasp_top_10_2017_risks.png -------------------------------------------------------------------------------- /docs/images/owasp_top_10_focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/owasp_top_10_focus.png -------------------------------------------------------------------------------- /docs/images/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/profile.png -------------------------------------------------------------------------------- /docs/images/publishersubscriber_backpressure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/publishersubscriber_backpressure.png -------------------------------------------------------------------------------- /docs/images/questions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/questions.png -------------------------------------------------------------------------------- /docs/images/reactive-spring-book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/reactive-spring-book.png -------------------------------------------------------------------------------- /docs/images/reactive_datastores.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/reactive_datastores.png -------------------------------------------------------------------------------- /docs/images/reactor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/reactor.png -------------------------------------------------------------------------------- /docs/images/reactor_spring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/reactor_spring.png -------------------------------------------------------------------------------- /docs/images/robo3t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/robo3t.png -------------------------------------------------------------------------------- /docs/images/roles_permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/roles_permissions.png -------------------------------------------------------------------------------- /docs/images/security_headers_andreasfalk_de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/security_headers_andreasfalk_de.png -------------------------------------------------------------------------------- /docs/images/server_web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/server_web.png -------------------------------------------------------------------------------- /docs/images/servlet_container_thread_pool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/servlet_container_thread_pool.png -------------------------------------------------------------------------------- /docs/images/servlet_reactive_stacks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/servlet_reactive_stacks.png -------------------------------------------------------------------------------- /docs/images/session_auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/session_auth.png -------------------------------------------------------------------------------- /docs/images/software-quality-maslow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/software-quality-maslow.png -------------------------------------------------------------------------------- /docs/images/spa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/spa.png -------------------------------------------------------------------------------- /docs/images/spring-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/spring-logo.png -------------------------------------------------------------------------------- /docs/images/spring_io_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/spring_io_logo.png -------------------------------------------------------------------------------- /docs/images/spring_io_workshop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/spring_io_workshop.jpg -------------------------------------------------------------------------------- /docs/images/spring_security_5_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/spring_security_5_2.png -------------------------------------------------------------------------------- /docs/images/spring_security_authentication.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/spring_security_authentication.png -------------------------------------------------------------------------------- /docs/images/spring_security_authentication_reactive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/spring_security_authentication_reactive.png -------------------------------------------------------------------------------- /docs/images/spring_security_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/spring_security_new.png -------------------------------------------------------------------------------- /docs/images/spring_security_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/spring_security_old.png -------------------------------------------------------------------------------- /docs/images/spring_security_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/spring_security_overview.png -------------------------------------------------------------------------------- /docs/images/steps-388914_1920.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/steps-388914_1920.jpg -------------------------------------------------------------------------------- /docs/images/threat-modeling-book.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/threat-modeling-book.jpg -------------------------------------------------------------------------------- /docs/images/token_validation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/token_validation.png -------------------------------------------------------------------------------- /docs/images/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/twitter.png -------------------------------------------------------------------------------- /docs/images/webflux_eventloop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/webflux_eventloop.png -------------------------------------------------------------------------------- /docs/images/why_not_use_implicit_grant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/why_not_use_implicit_grant.png -------------------------------------------------------------------------------- /docs/images/workshop_lab_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/workshop_lab_1.png -------------------------------------------------------------------------------- /docs/images/workshop_lab_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/workshop_lab_2.png -------------------------------------------------------------------------------- /docs/images/workshop_lab_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/workshop_lab_3.png -------------------------------------------------------------------------------- /docs/images/workshop_lab_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/workshop_lab_4.png -------------------------------------------------------------------------------- /docs/images/workshop_lab_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/workshop_lab_5.png -------------------------------------------------------------------------------- /docs/images/workshop_lab_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/workshop_lab_6.png -------------------------------------------------------------------------------- /docs/images/workshop_lab_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/images/workshop_lab_7.png -------------------------------------------------------------------------------- /docs/js/utils/constants.js: -------------------------------------------------------------------------------- 1 | 2 | export const SLIDES_SELECTOR = '.slides section'; 3 | export const HORIZONTAL_SLIDES_SELECTOR = '.slides>section'; 4 | export const VERTICAL_SLIDES_SELECTOR = '.slides>section.present>section'; 5 | 6 | // Methods that may not be invoked via the postMessage API 7 | export const POST_MESSAGE_METHOD_BLACKLIST = /registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener/; 8 | 9 | // Regex for retrieving the fragment style from a class attribute 10 | export const FRAGMENT_STYLE_REGEX = /fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/; -------------------------------------------------------------------------------- /docs/js/utils/device.js: -------------------------------------------------------------------------------- 1 | const UA = navigator.userAgent; 2 | const testElement = document.createElement( 'div' ); 3 | 4 | export const isMobile = /(iphone|ipod|ipad|android)/gi.test( UA ) || 5 | ( navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1 ); // iPadOS 6 | 7 | export const isChrome = /chrome/i.test( UA ) && !/edge/i.test( UA ); 8 | 9 | export const isAndroid = /android/gi.test( UA ); 10 | 11 | // Flags if we should use zoom instead of transform to scale 12 | // up slides. Zoom produces crisper results but has a lot of 13 | // xbrowser quirks so we only use it in whitelisted browsers. 14 | export const supportsZoom = 'zoom' in testElement.style && !isMobile && 15 | ( isChrome || /Version\/[\d\.]+.*Safari/.test( UA ) ); -------------------------------------------------------------------------------- /docs/lib/font/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /docs/lib/font/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('league-gothic.eot'); 4 | src: url('league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('league-gothic.woff') format('woff'), 6 | url('league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } -------------------------------------------------------------------------------- /docs/lib/font/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /docs/lib/font/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /docs/lib/font/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /docs/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /docs/lib/js/html5shiv.js: -------------------------------------------------------------------------------- 1 | document.createElement('header'); 2 | document.createElement('nav'); 3 | document.createElement('section'); 4 | document.createElement('article'); 5 | document.createElement('aside'); 6 | document.createElement('footer'); 7 | document.createElement('hgroup'); -------------------------------------------------------------------------------- /docs/pdf/workshop-tutorial.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/pdf/workshop-tutorial.pdf -------------------------------------------------------------------------------- /docs/plugin/markdown/example.md: -------------------------------------------------------------------------------- 1 | # Markdown Demo 2 | 3 | 4 | 5 | ## External 1.1 6 | 7 | Content 1.1 8 | 9 | Note: This will only appear in the speaker notes window. 10 | 11 | 12 | ## External 1.2 13 | 14 | Content 1.2 15 | 16 | 17 | 18 | ## External 2 19 | 20 | Content 2.1 21 | 22 | 23 | 24 | ## External 3.1 25 | 26 | Content 3.1 27 | 28 | 29 | ## External 3.2 30 | 31 | Content 3.2 32 | 33 | 34 | ## External 3.3 35 | 36 | ![External Image](https://s3.amazonaws.com/static.slid.es/logo/v2/slides-symbol-512x512.png) 37 | -------------------------------------------------------------------------------- /docs/plugin/math/plugin.js: -------------------------------------------------------------------------------- 1 | import {KaTeX} from "./katex"; 2 | import {MathJax2} from "./mathjax2"; 3 | import {MathJax3} from "./mathjax3"; 4 | 5 | const defaultTypesetter = MathJax2; 6 | 7 | /*! 8 | * This plugin is a wrapper for the MathJax2, 9 | * MathJax3 and KaTeX typesetter plugins. 10 | */ 11 | export default Plugin = Object.assign( defaultTypesetter(), { 12 | KaTeX, 13 | MathJax2, 14 | MathJax3 15 | } ); -------------------------------------------------------------------------------- /docs/plugin/multiplex/client.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var multiplex = Reveal.getConfig().multiplex; 3 | var socketId = multiplex.id; 4 | var socket = io.connect(multiplex.url); 5 | 6 | socket.on(multiplex.id, function(data) { 7 | // ignore data from sockets that aren't ours 8 | if (data.socketId !== socketId) { return; } 9 | if( window.location.host === 'localhost:1947' ) return; 10 | 11 | Reveal.setState(data.state); 12 | }); 13 | }()); 14 | -------------------------------------------------------------------------------- /docs/plugin/multiplex/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reveal-js-multiplex", 3 | "version": "1.0.0", 4 | "description": "reveal.js multiplex server", 5 | "homepage": "http://revealjs.com", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "engines": { 10 | "node": "~4.1.1" 11 | }, 12 | "dependencies": { 13 | "express": "~4.13.3", 14 | "grunt-cli": "~0.1.13", 15 | "mustache": "~2.2.1", 16 | "socket.io": "~1.3.7" 17 | }, 18 | "license": "MIT" 19 | } 20 | -------------------------------------------------------------------------------- /docs/test/examples/assets/beeping.txt: -------------------------------------------------------------------------------- 1 | Source: https://freesound.org/people/fennelliott/sounds/379419/ 2 | License: CC0 (public domain) -------------------------------------------------------------------------------- /docs/test/examples/assets/beeping.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/test/examples/assets/beeping.wav -------------------------------------------------------------------------------- /docs/test/examples/assets/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/test/examples/assets/image1.png -------------------------------------------------------------------------------- /docs/test/examples/assets/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/test/examples/assets/image2.png -------------------------------------------------------------------------------- /docs/test/simple.md: -------------------------------------------------------------------------------- 1 | ## Slide 1.1 2 | 3 | ```js 4 | var a = 1; 5 | ``` 6 | 7 | 8 | ## Slide 1.2 9 | 10 | 11 | 12 | ## Slide 2 13 | -------------------------------------------------------------------------------- /docs/test/test-markdown-external.js: -------------------------------------------------------------------------------- 1 | Reveal.addEventListener( 'ready', function() { 2 | 3 | QUnit.module( 'Markdown' ); 4 | 5 | QUnit.test( 'Vertical separator', function( assert ) { 6 | assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' ); 7 | }); 8 | 9 | QUnit.test( 'Horizontal separator', function( assert ) { 10 | assert.strictEqual( document.querySelectorAll( '.reveal .slides>section' ).length, 2, 'found two slides' ); 11 | }); 12 | 13 | QUnit.test( 'Language highlighter', function( assert ) { 14 | assert.strictEqual( document.querySelectorAll( '.hljs-keyword' ).length, 1, 'got rendered highlight tag.' ); 15 | assert.strictEqual( document.querySelector( '.hljs-keyword' ).innerHTML, 'var', 'the same keyword: var.' ); 16 | }); 17 | 18 | } ); 19 | 20 | Reveal.initialize(); 21 | -------------------------------------------------------------------------------- /docs/test/test-markdown-options.js: -------------------------------------------------------------------------------- 1 | Reveal.addEventListener( 'ready', function() { 2 | 3 | QUnit.module( 'Markdown' ); 4 | 5 | QUnit.test( 'Options are set', function( assert ) { 6 | assert.strictEqual( marked.defaults.smartypants, true ); 7 | }); 8 | 9 | QUnit.test( 'Smart quotes are activated', function( assert ) { 10 | var text = document.querySelector( '.reveal .slides>section>p' ).textContent; 11 | 12 | assert.strictEqual( /['"]/.test( text ), false ); 13 | assert.strictEqual( /[“”‘’]/.test( text ), true ); 14 | }); 15 | 16 | } ); 17 | 18 | Reveal.initialize({ 19 | dependencies: [ 20 | { src: '../plugin/markdown/marked.js' }, 21 | // Test loading JS files with query strings 22 | { src: '../plugin/markdown/markdown.js?query=string' }, 23 | ], 24 | markdown: { 25 | smartypants: true 26 | } 27 | }); 28 | -------------------------------------------------------------------------------- /docs/test/test-markdown.js: -------------------------------------------------------------------------------- 1 | Reveal.addEventListener( 'ready', function() { 2 | 3 | QUnit.module( 'Markdown' ); 4 | 5 | QUnit.test( 'Vertical separator', function( assert ) { 6 | assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' ); 7 | }); 8 | 9 | } ); 10 | 11 | Reveal.initialize(); 12 | -------------------------------------------------------------------------------- /docs/test/test-pdf.js: -------------------------------------------------------------------------------- 1 | Reveal.addEventListener( 'ready', function() { 2 | 3 | // Only one test for now, we're mainly ensuring that there 4 | // are no execution errors when running PDF mode 5 | 6 | QUnit.test( 'Reveal.isReady', function( assert ) { 7 | assert.strictEqual( Reveal.isReady(), true, 'returns true' ); 8 | }); 9 | 10 | } ); 11 | 12 | Reveal.initialize({ pdf: true }); 13 | -------------------------------------------------------------------------------- /docs/workshop-tutorial.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/docs/workshop-tutorial.pdf -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue May 01 13:21:16 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /intro-labs/auth-code-demo/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | /build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | 6 | ### STS ### 7 | .apt_generated 8 | .classpath 9 | .factorypath 10 | .project 11 | .settings 12 | .springBeans 13 | .sts4-cache 14 | 15 | ### IntelliJ IDEA ### 16 | .idea 17 | *.iws 18 | *.iml 19 | *.ipr 20 | /out/ 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | 29 | ### VS Code ### 30 | .vscode/ 31 | -------------------------------------------------------------------------------- /intro-labs/auth-code-demo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/intro-labs/auth-code-demo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /intro-labs/auth-code-demo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /intro-labs/auth-code-demo/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | } 5 | } 6 | rootProject.name = 'auth-code-demo' 7 | -------------------------------------------------------------------------------- /intro-labs/auth-code-demo/src/main/java/com/example/authorizationcode/client/AuthorizationCodeDemo.java: -------------------------------------------------------------------------------- 1 | package com.example.authorizationcode.client; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class AuthorizationCodeDemo { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(AuthorizationCodeDemo.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /intro-labs/auth-code-demo/src/main/java/com/example/authorizationcode/client/config/WebClientConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.authorizationcode.client.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.reactive.function.client.WebClient; 6 | 7 | @Configuration 8 | public class WebClientConfiguration { 9 | 10 | @Bean 11 | WebClient webClient() { 12 | return WebClient.builder().build(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /intro-labs/auth-code-demo/src/main/java/com/example/authorizationcode/client/web/TokenRequest.java: -------------------------------------------------------------------------------- 1 | package com.example.authorizationcode.client.web; 2 | 3 | public class TokenRequest { 4 | 5 | private String code; 6 | private String state; 7 | 8 | public String getCode() { 9 | return code; 10 | } 11 | 12 | public void setCode(String code) { 13 | this.code = code; 14 | } 15 | 16 | public String getState() { 17 | return state; 18 | } 19 | 20 | public void setState(String state) { 21 | this.state = state; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /intro-labs/authentication-reactive-demo/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | /build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | 6 | ### STS ### 7 | .apt_generated 8 | .classpath 9 | .factorypath 10 | .project 11 | .settings 12 | .springBeans 13 | .sts4-cache 14 | 15 | ### IntelliJ IDEA ### 16 | .idea 17 | *.iws 18 | *.iml 19 | *.ipr 20 | /out/ 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | 29 | ### VS Code ### 30 | .vscode/ 31 | -------------------------------------------------------------------------------- /intro-labs/authentication-reactive-demo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/intro-labs/authentication-reactive-demo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /intro-labs/authentication-reactive-demo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /intro-labs/authentication-reactive-demo/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | } 5 | } 6 | rootProject.name = 'authentication-reactive-demo' 7 | -------------------------------------------------------------------------------- /intro-labs/authentication-reactive-demo/src/main/java/com/example/authentication/demo/AuthenticationReactiveDemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.authentication.demo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class AuthenticationReactiveDemoApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(AuthenticationReactiveDemoApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /intro-labs/authentication-reactive-demo/src/main/java/com/example/authentication/demo/DemoRestController.java: -------------------------------------------------------------------------------- 1 | package com.example.authentication.demo; 2 | 3 | import org.springframework.web.bind.annotation.GetMapping; 4 | import org.springframework.web.bind.annotation.RestController; 5 | 6 | @RestController 7 | public class DemoRestController { 8 | 9 | @GetMapping("/") 10 | public String hello() { 11 | return "it works!"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /intro-labs/authentication-reactive-demo/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.security.user.password=secret 2 | 3 | management.endpoints.web.exposure.include=* 4 | -------------------------------------------------------------------------------- /intro-labs/authentication-reactive-demo/src/test/java/com/example/authentication/demo/AuthenticationReactiveDemoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.authentication.demo; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.junit.jupiter.api.extension.ExtendWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit.jupiter.SpringExtension; 7 | import org.springframework.test.context.junit4.SpringRunner; 8 | 9 | @ExtendWith(SpringExtension.class) 10 | @SpringBootTest 11 | public class AuthenticationReactiveDemoApplicationTests { 12 | 13 | @Test 14 | public void contextLoads() { 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /intro-labs/authentication-servlet-demo/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | /build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | 6 | ### STS ### 7 | .apt_generated 8 | .classpath 9 | .factorypath 10 | .project 11 | .settings 12 | .springBeans 13 | .sts4-cache 14 | 15 | ### IntelliJ IDEA ### 16 | .idea 17 | *.iws 18 | *.iml 19 | *.ipr 20 | /out/ 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | 29 | ### VS Code ### 30 | .vscode/ 31 | -------------------------------------------------------------------------------- /intro-labs/authentication-servlet-demo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/intro-labs/authentication-servlet-demo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /intro-labs/authentication-servlet-demo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /intro-labs/authentication-servlet-demo/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | } 5 | } 6 | rootProject.name = 'authentication-servlet-demo' 7 | -------------------------------------------------------------------------------- /intro-labs/authentication-servlet-demo/src/main/java/com/example/authentication/demo/AuthenticationServletDemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.authentication.demo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class AuthenticationServletDemoApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(AuthenticationServletDemoApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /intro-labs/authentication-servlet-demo/src/main/java/com/example/authentication/demo/DemoRestController.java: -------------------------------------------------------------------------------- 1 | package com.example.authentication.demo; 2 | 3 | import org.springframework.web.bind.annotation.GetMapping; 4 | import org.springframework.web.bind.annotation.RestController; 5 | 6 | @RestController 7 | public class DemoRestController { 8 | 9 | @GetMapping("/") 10 | public String hello() { 11 | return "it works!"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /intro-labs/authentication-servlet-demo/src/main/java/com/example/authentication/demo/WebSecurityConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.authentication.demo; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 5 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 6 | 7 | @Configuration 8 | public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { 9 | 10 | @Override 11 | protected void configure(HttpSecurity http) throws Exception { 12 | http.authorizeRequests() 13 | .anyRequest() 14 | .authenticated() 15 | .and() 16 | .httpBasic(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /intro-labs/authentication-servlet-demo/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.security.user.password=secret 2 | 3 | management.endpoints.web.exposure.include=* 4 | -------------------------------------------------------------------------------- /intro-labs/authentication-servlet-demo/src/test/java/com/example/authentication/demo/AuthenticationServletDemoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.authentication.demo; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.junit.jupiter.api.extension.ExtendWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit.jupiter.SpringExtension; 7 | 8 | @ExtendWith(SpringExtension.class) 9 | @SpringBootTest 10 | public class AuthenticationServletDemoApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /intro-labs/github-client/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | /build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | 6 | ### STS ### 7 | .apt_generated 8 | .classpath 9 | .factorypath 10 | .project 11 | .settings 12 | .springBeans 13 | .sts4-cache 14 | 15 | ### IntelliJ IDEA ### 16 | .idea 17 | *.iws 18 | *.iml 19 | *.ipr 20 | /out/ 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | 29 | ### VS Code ### 30 | .vscode/ 31 | bin/ 32 | 33 | client_secrets.txt 34 | -------------------------------------------------------------------------------- /intro-labs/github-client/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/intro-labs/github-client/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /intro-labs/github-client/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /intro-labs/github-client/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | } 5 | } 6 | rootProject.name = 'github-client' 7 | -------------------------------------------------------------------------------- /intro-labs/github-client/src/main/java/com/example/github/GitHubClientApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.github; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class GitHubClientApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(GitHubClientApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /intro-labs/github-client/src/main/java/com/example/github/restapi/GitHubRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.github.restapi; 2 | 3 | public class GitHubRepository { 4 | private String id; 5 | private String name; 6 | private String fullName; 7 | 8 | public String getId() { 9 | return id; 10 | } 11 | 12 | public String getFullName() { 13 | return fullName; 14 | } 15 | 16 | public void setFull_name(String fullName) { 17 | this.fullName = fullName; 18 | } 19 | 20 | public String getName() { 21 | return name; 22 | } 23 | 24 | public void setName(String name) { 25 | this.name = name; 26 | } 27 | 28 | public void setId(String id) { 29 | this.id = id; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /intro-labs/github-client/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | thymeleaf: 3 | cache: false 4 | security: 5 | oauth2: 6 | client: 7 | registration: 8 | github: 9 | client-id: 10 | client-secret: 11 | scope: 12 | - read:user 13 | - notifications 14 | redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}' 15 | github: 16 | base: 17 | url: https://api.github.com/ 18 | 19 | logging: 20 | level: 21 | root: INFO 22 | org.springframework.security: DEBUG 23 | 24 | server: 25 | port: 9090 -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/README.md: -------------------------------------------------------------------------------- 1 | # Migration Path To Reactive 2 | 3 | These applications show how to migrate a blocking servlet based client/server application to the corresponding 4 | reactive variants. 5 | 6 | You find the following applications: 7 | 8 | * [initial-server-application](initial-server-application): This is the initial servlet based Spring MVC server application to migrate to the reactive world. 9 | * [reactive-server-application](reactive-server-application): This is the migrated application using the reactive Spring WebFlux stack. 10 | * [initial-client-application](initial-client-application): This is the initial client application using a blocking _RestTemplate_ to access the server 11 | * [web-client-application](web-client-application): This is the migrated client application using the reactive _WebClient_ to access the server 12 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-client-application/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | 17 | ### IntelliJ IDEA ### 18 | .idea 19 | *.iws 20 | *.iml 21 | *.ipr 22 | out/ 23 | !**/src/main/**/out/ 24 | !**/src/test/**/out/ 25 | 26 | ### NetBeans ### 27 | /nbproject/private/ 28 | /nbbuild/ 29 | /dist/ 30 | /nbdist/ 31 | /.nb-gradle/ 32 | 33 | ### VS Code ### 34 | .vscode/ 35 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-client-application/README.md: -------------------------------------------------------------------------------- 1 | # Initial Client Application 2 | 3 | This is the initial client application using a _RestTemplate_ to retrieve all coffees from the server application. 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-client-application/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.6.2' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.example' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | dependencies { 16 | implementation 'org.springframework.boot:spring-boot-starter-web' 17 | developmentOnly 'org.springframework.boot:spring-boot-devtools' 18 | testImplementation('org.springframework.boot:spring-boot-starter-test') { 19 | exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' 20 | } 21 | } 22 | 23 | test { 24 | useJUnitPlatform() 25 | } 26 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-client-application/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/intro-labs/migrate-to-reactive/initial-client-application/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-client-application/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-client-application/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'initial-client-application' 2 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-client-application/src/main/java/com/example/client/InitialClientApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.client; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class InitialClientApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(InitialClientApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-client-application/src/main/java/com/example/client/coffee/CoffeeResource.java: -------------------------------------------------------------------------------- 1 | package com.example.client.coffee; 2 | 3 | import java.util.UUID; 4 | 5 | public class CoffeeResource { 6 | private UUID id; 7 | private String name; 8 | 9 | public void setId(UUID id) { 10 | this.id = id; 11 | } 12 | 13 | public void setName(String name) { 14 | this.name = name; 15 | } 16 | 17 | public UUID getId() { 18 | return id; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | 25 | @Override 26 | public String toString() { 27 | return "Coffee{" + "id=" + id + ", name='" + name + '\'' + '}'; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-client-application/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8080 3 | error: 4 | include-stacktrace: never 5 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-client-application/src/test/java/com/example/client/InitialClientApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.client; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class InitialClientApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | 17 | ### IntelliJ IDEA ### 18 | .idea 19 | *.iws 20 | *.iml 21 | *.ipr 22 | out/ 23 | !**/src/main/**/out/ 24 | !**/src/test/**/out/ 25 | 26 | ### NetBeans ### 27 | /nbproject/private/ 28 | /nbbuild/ 29 | /dist/ 30 | /nbdist/ 31 | /.nb-gradle/ 32 | 33 | ### VS Code ### 34 | .vscode/ 35 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/README.md: -------------------------------------------------------------------------------- 1 | # Initial Server Application 2 | 3 | This is the initial Spring MVC application using the blocking servlet stack. 4 | 5 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/intro-labs/migrate-to-reactive/initial-server-application/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'initial-server-application' 2 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/src/main/java/com/example/server/InitialServerApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.server; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class InitialServerApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(InitialServerApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/src/main/java/com/example/server/coffee/CoffeeRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.server.coffee; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import java.util.UUID; 6 | 7 | public interface CoffeeRepository extends JpaRepository {} 8 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/src/main/java/com/example/server/coffee/CoffeeResource.java: -------------------------------------------------------------------------------- 1 | package com.example.server.coffee; 2 | 3 | import java.util.UUID; 4 | 5 | public class CoffeeResource { 6 | private final UUID id; 7 | private final String name; 8 | 9 | public CoffeeResource(UUID id, String name) { 10 | this.id = id; 11 | this.name = name; 12 | } 13 | 14 | public UUID getId() { 15 | return id; 16 | } 17 | 18 | public String getName() { 19 | return name; 20 | } 21 | 22 | @Override 23 | public String toString() { 24 | return "Coffee{" + "id=" + id + ", name='" + name + '\'' + '}'; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/src/main/java/com/example/server/coffee/CoffeeResourceAssembler.java: -------------------------------------------------------------------------------- 1 | package com.example.server.coffee; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import java.util.Collection; 6 | import java.util.stream.Collectors; 7 | 8 | @Component 9 | public class CoffeeResourceAssembler { 10 | 11 | public CoffeeResource toModel(CoffeeEntity entity) { 12 | return new CoffeeResource(entity.getId(), entity.getName()); 13 | } 14 | 15 | public Collection toCollectionModel(Collection entities) { 16 | return entities.stream().map(this::toModel).collect(Collectors.toList()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/src/main/java/com/example/server/coffee/CoffeeService.java: -------------------------------------------------------------------------------- 1 | package com.example.server.coffee; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | import java.util.Collection; 6 | import java.util.Optional; 7 | import java.util.UUID; 8 | 9 | @Service 10 | public class CoffeeService { 11 | 12 | private final CoffeeRepository coffeeRepository; 13 | 14 | public CoffeeService(CoffeeRepository coffeeRepository) { 15 | this.coffeeRepository = coffeeRepository; 16 | } 17 | 18 | public Collection findAll() { 19 | return coffeeRepository.findAll(); 20 | } 21 | 22 | public Optional findOne(UUID id) { 23 | return coffeeRepository.findById(id); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 9090 3 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/initial-server-application/src/test/java/com/example/server/InitialServerApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.server; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class InitialServerApplicationTests { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | 17 | ### IntelliJ IDEA ### 18 | .idea 19 | *.iws 20 | *.iml 21 | *.ipr 22 | out/ 23 | !**/src/main/**/out/ 24 | !**/src/test/**/out/ 25 | 26 | ### NetBeans ### 27 | /nbproject/private/ 28 | /nbbuild/ 29 | /dist/ 30 | /nbdist/ 31 | /.nb-gradle/ 32 | 33 | ### VS Code ### 34 | .vscode/ 35 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/README.md: -------------------------------------------------------------------------------- 1 | # Reactive Server Application 2 | 3 | This is the migrated reactive server application using the Spring WebFlux stack with MongoDB, 4 | 5 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/intro-labs/migrate-to-reactive/reactive-server-application/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'reactive-server-application' 2 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/src/main/java/com/example/server/ReactiveServerApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.server; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import reactor.blockhound.BlockHound; 6 | import reactor.tools.agent.ReactorDebugAgent; 7 | 8 | @SpringBootApplication 9 | public class ReactiveServerApplication { 10 | 11 | public static void main(String[] args) { 12 | // Do not activate both, Blockhound and ReactorDebugAgent on Java 8: 13 | // https://github.com/reactor/BlockHound/issues/70 14 | 15 | BlockHound.install(); 16 | ReactorDebugAgent.init(); 17 | 18 | SpringApplication.run(ReactiveServerApplication.class, args); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/src/main/java/com/example/server/coffee/CoffeeRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.server.coffee; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | 5 | import java.util.UUID; 6 | 7 | public interface CoffeeRepository extends ReactiveMongoRepository {} 8 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/src/main/java/com/example/server/coffee/CoffeeResource.java: -------------------------------------------------------------------------------- 1 | package com.example.server.coffee; 2 | 3 | import java.util.UUID; 4 | 5 | public class CoffeeResource { 6 | private final UUID id; 7 | private final String name; 8 | 9 | public CoffeeResource(UUID id, String name) { 10 | this.id = id; 11 | this.name = name; 12 | } 13 | 14 | public UUID getId() { 15 | return id; 16 | } 17 | 18 | public String getName() { 19 | return name; 20 | } 21 | 22 | @Override 23 | public String toString() { 24 | return "Coffee{" + "id=" + id + ", name='" + name + '\'' + '}'; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/src/main/java/com/example/server/coffee/CoffeeResourceAssembler.java: -------------------------------------------------------------------------------- 1 | package com.example.server.coffee; 2 | 3 | import org.springframework.stereotype.Component; 4 | import reactor.core.publisher.Flux; 5 | 6 | @Component 7 | public class CoffeeResourceAssembler { 8 | 9 | public CoffeeResource toModel(CoffeeEntity entity) { 10 | return new CoffeeResource(entity.getId(), entity.getName()); 11 | } 12 | 13 | public Flux toCollectionModel(Flux entities) { 14 | return entities.map(this::toModel); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/src/main/java/com/example/server/coffee/CoffeeService.java: -------------------------------------------------------------------------------- 1 | package com.example.server.coffee; 2 | 3 | import org.springframework.stereotype.Service; 4 | import reactor.core.publisher.Flux; 5 | import reactor.core.publisher.Mono; 6 | 7 | import java.util.UUID; 8 | 9 | @Service 10 | public class CoffeeService { 11 | 12 | private final CoffeeRepository coffeeRepository; 13 | 14 | public CoffeeService(CoffeeRepository coffeeRepository) { 15 | this.coffeeRepository = coffeeRepository; 16 | } 17 | 18 | public Flux findAll() { 19 | return coffeeRepository.findAll(); 20 | } 21 | 22 | public Mono findOne(UUID id) { 23 | return coffeeRepository.findById(id); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 9090 3 | error: 4 | include-stacktrace: never 5 | spring: 6 | mongodb: 7 | embedded: 8 | version: '4.0.12' -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/reactive-server-application/src/test/java/com/example/server/ReactiveServerApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.server; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ReactiveServerApplicationTests { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | 17 | ### IntelliJ IDEA ### 18 | .idea 19 | *.iws 20 | *.iml 21 | *.ipr 22 | out/ 23 | !**/src/main/**/out/ 24 | !**/src/test/**/out/ 25 | 26 | ### NetBeans ### 27 | /nbproject/private/ 28 | /nbbuild/ 29 | /dist/ 30 | /nbdist/ 31 | /.nb-gradle/ 32 | 33 | ### VS Code ### 34 | .vscode/ 35 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/README.md: -------------------------------------------------------------------------------- 1 | # Web Client Application 2 | 3 | This application uses the reactive web client to retrieve all coffees from the server application. 4 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.6.2' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.example' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | dependencies { 16 | implementation 'org.springframework.boot:spring-boot-starter-web' 17 | implementation 'org.springframework.boot:spring-boot-starter-webflux' 18 | developmentOnly 'org.springframework.boot:spring-boot-devtools' 19 | testImplementation('org.springframework.boot:spring-boot-starter-test') { 20 | exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' 21 | } 22 | } 23 | 24 | test { 25 | useJUnitPlatform() 26 | } 27 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/intro-labs/migrate-to-reactive/web-client-application/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'web-client-application' 2 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/src/main/java/com/example/client/WebClientApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.client; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class WebClientApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(WebClientApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/src/main/java/com/example/client/coffee/CoffeeClientRestController.java: -------------------------------------------------------------------------------- 1 | package com.example.client.coffee; 2 | 3 | import org.springframework.web.bind.annotation.GetMapping; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | import org.springframework.web.bind.annotation.RestController; 6 | import reactor.core.publisher.Flux; 7 | 8 | @RestController 9 | @RequestMapping("/coffees") 10 | public class CoffeeClientRestController { 11 | 12 | private final CoffeeClientService coffeeClientService; 13 | 14 | public CoffeeClientRestController(CoffeeClientService coffeeClientService) { 15 | this.coffeeClientService = coffeeClientService; 16 | } 17 | 18 | @GetMapping 19 | Flux allCoffees() { 20 | return coffeeClientService.allCoffees(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/src/main/java/com/example/client/coffee/CoffeeResource.java: -------------------------------------------------------------------------------- 1 | package com.example.client.coffee; 2 | 3 | import java.util.UUID; 4 | 5 | public class CoffeeResource { 6 | private UUID id; 7 | private String name; 8 | 9 | public void setId(UUID id) { 10 | this.id = id; 11 | } 12 | 13 | public void setName(String name) { 14 | this.name = name; 15 | } 16 | 17 | public UUID getId() { 18 | return id; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | 25 | @Override 26 | public String toString() { 27 | return "Coffee{" + "id=" + id + ", name='" + name + '\'' + '}'; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8080 3 | error: 4 | include-stacktrace: never 5 | -------------------------------------------------------------------------------- /intro-labs/migrate-to-reactive/web-client-application/src/test/java/com/example/client/WebClientApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.client; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class WebClientApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /intro-labs/reactive-playground/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5.1 Workshop 2 | 3 | ## Reactive Playground 4 | 5 | This contains a starting point to play around with the reactive stuff. 6 | 7 | Just execute and add tests to classes _*ReactivePlayground_ to learn the reactive streams api. 8 | -------------------------------------------------------------------------------- /intro-labs/reactive-playground/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/intro-labs/reactive-playground/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /intro-labs/reactive-playground/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 6 | -------------------------------------------------------------------------------- /intro-labs/reactive-playground/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | } 5 | } 6 | rootProject.name = 'reactive-playground' 7 | -------------------------------------------------------------------------------- /intro-labs/reactive-playground/src/main/java/com/example/Country.java: -------------------------------------------------------------------------------- 1 | package com.example; 2 | 3 | public enum Country { 4 | GERMANY, 5 | AUSTRIA 6 | } 7 | -------------------------------------------------------------------------------- /lab-1/README.md: -------------------------------------------------------------------------------- 1 | # Reactive Spring Security 5 Workshop 2 | 3 | ## Lab 1: Auto configured security 4 | 5 | This contains the completed and initial code of the reactive web application for lab 1 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | /out/ 20 | 21 | ### NetBeans ### 22 | /nbproject/private/ 23 | /build/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ -------------------------------------------------------------------------------- /lab-1/complete-library-server/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 01 - Authentication (Auto-Configuration) 4 | 5 | This is the completed code of the reactive web application for lab 1 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/lab-1/complete-library-server/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lab-1/complete-library-server/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue May 01 13:21:16 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'lab1-complete-library-server' 2 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/src/main/java/com/example/library/server/Lab1CompleteLibraryServerApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Lab1CompleteLibraryServerApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Lab1CompleteLibraryServerApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/src/main/java/com/example/library/server/api/CreateUserResource.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.api; 2 | 3 | import com.example.library.server.common.Role; 4 | 5 | import java.util.List; 6 | import java.util.UUID; 7 | 8 | public class CreateUserResource extends UserResource { 9 | 10 | private String password; 11 | 12 | public CreateUserResource() {} 13 | 14 | public CreateUserResource( 15 | UUID id, String email, String password, String firstName, String lastName, List roles) { 16 | super(id, email, firstName, lastName, roles); 17 | this.password = password; 18 | } 19 | 20 | public String getPassword() { 21 | return password; 22 | } 23 | 24 | public void setPassword(String password) { 25 | this.password = password; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/src/main/java/com/example/library/server/common/Role.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.common; 2 | 3 | public enum Role { 4 | LIBRARY_USER, 5 | 6 | LIBRARY_CURATOR, 7 | 8 | LIBRARY_ADMIN 9 | } 10 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/src/main/java/com/example/library/server/config/IdGeneratorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.util.IdGenerator; 6 | import org.springframework.util.JdkIdGenerator; 7 | 8 | @Configuration 9 | public class IdGeneratorConfiguration { 10 | 11 | @Bean 12 | public IdGenerator idGenerator() { 13 | return new JdkIdGenerator(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/src/main/java/com/example/library/server/config/ModelMapperConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.modelmapper.convention.MatchingStrategies; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class ModelMapperConfiguration { 10 | 11 | @Bean 12 | public ModelMapper modelMapper() { 13 | ModelMapper modelMapper = new ModelMapper(); 14 | modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); 15 | return modelMapper; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/src/main/java/com/example/library/server/dataaccess/BookRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | 5 | import java.util.UUID; 6 | 7 | public interface BookRepository extends ReactiveMongoRepository {} 8 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/src/main/java/com/example/library/server/dataaccess/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | import reactor.core.publisher.Mono; 5 | 6 | import java.util.UUID; 7 | 8 | public interface UserRepository extends ReactiveMongoRepository { 9 | 10 | Mono findOneByEmail(String email); 11 | } 12 | -------------------------------------------------------------------------------- /lab-1/complete-library-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | management: 2 | endpoints: 3 | web: 4 | exposure: 5 | include: '*' 6 | endpoint: 7 | health: 8 | show-details: always 9 | 10 | spring: 11 | data: 12 | mongodb: 13 | port: 40495 14 | jackson: 15 | date-format: com.fasterxml.jackson.databind.util.StdDateFormat 16 | default-property-inclusion: non_null 17 | security: 18 | user: 19 | password: secret 20 | mongodb: 21 | embedded: 22 | version: '4.0.12' 23 | server: 24 | error: 25 | include-stacktrace: never 26 | port: 9091 27 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | /out/ 20 | 21 | ### NetBeans ### 22 | /nbproject/private/ 23 | /build/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ -------------------------------------------------------------------------------- /lab-1/initial-library-server/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## Initial application 4 | 5 | This is the initial absolutely unsecured reactive web application. 6 | 7 | This application deals with books and users. 8 | 9 | A standard user can borrow or return borrowed books, a curator user can add or remove books 10 | and an admin user can show, add or remove users. 11 | 12 | Please start into the workshop with this initial application. 13 | 14 | You find the accompanying workshop tutorial [here](https://andifalk.github.io/reactive-spring-security-5-workshop/workshop-tutorial.html) 15 | 16 | If you have already read all introductory sections of the tutorial you can directly 17 | start with the [first step in the tutorial](https://andifalk.github.io/reactive-spring-security-5-workshop/workshop-tutorial.html#_lab_1_auto_configuration) 18 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/lab-1/initial-library-server/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lab-1/initial-library-server/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue May 01 13:21:16 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'lab1-initial-library-server' 2 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/src/main/java/com/example/library/server/InitialLibraryServerApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class InitialLibraryServerApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(InitialLibraryServerApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/src/main/java/com/example/library/server/api/CreateUserResource.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.api; 2 | 3 | import com.example.library.server.common.Role; 4 | 5 | import java.util.List; 6 | import java.util.UUID; 7 | 8 | public class CreateUserResource extends UserResource { 9 | 10 | private String password; 11 | 12 | public CreateUserResource() {} 13 | 14 | public CreateUserResource( 15 | UUID id, String email, String password, String firstName, String lastName, List roles) { 16 | super(id, email, firstName, lastName, roles); 17 | this.password = password; 18 | } 19 | 20 | public String getPassword() { 21 | return password; 22 | } 23 | 24 | public void setPassword(String password) { 25 | this.password = password; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/src/main/java/com/example/library/server/common/Role.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.common; 2 | 3 | public enum Role { 4 | LIBRARY_USER, 5 | 6 | LIBRARY_CURATOR, 7 | 8 | LIBRARY_ADMIN 9 | } 10 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/src/main/java/com/example/library/server/config/IdGeneratorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.util.IdGenerator; 6 | import org.springframework.util.JdkIdGenerator; 7 | 8 | @Configuration 9 | public class IdGeneratorConfiguration { 10 | 11 | @Bean 12 | public IdGenerator idGenerator() { 13 | return new JdkIdGenerator(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/src/main/java/com/example/library/server/config/ModelMapperConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.modelmapper.convention.MatchingStrategies; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class ModelMapperConfiguration { 10 | 11 | @Bean 12 | public ModelMapper modelMapper() { 13 | ModelMapper modelMapper = new ModelMapper(); 14 | modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); 15 | return modelMapper; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/src/main/java/com/example/library/server/dataaccess/BookRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | 5 | import java.util.UUID; 6 | 7 | public interface BookRepository extends ReactiveMongoRepository {} 8 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/src/main/java/com/example/library/server/dataaccess/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | import reactor.core.publisher.Mono; 5 | 6 | import java.util.UUID; 7 | 8 | public interface UserRepository extends ReactiveMongoRepository { 9 | 10 | Mono findOneByEmail(String email); 11 | } 12 | -------------------------------------------------------------------------------- /lab-1/initial-library-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | management: 2 | endpoints: 3 | web: 4 | exposure: 5 | include: '*' 6 | endpoint: 7 | health: 8 | show-details: always 9 | 10 | spring: 11 | data: 12 | mongodb: 13 | port: 40495 14 | jackson: 15 | date-format: com.fasterxml.jackson.databind.util.StdDateFormat 16 | default-property-inclusion: non_null 17 | mongodb: 18 | embedded: 19 | version: '4.0.12' 20 | server: 21 | error: 22 | include-stacktrace: never 23 | port: 9091 24 | -------------------------------------------------------------------------------- /lab-2/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 02 - Customized Authentication 4 | 5 | This contains the completed and initial code of the reactive web application for lab 2 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | /out/ 20 | 21 | ### NetBeans ### 22 | /nbproject/private/ 23 | /build/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ -------------------------------------------------------------------------------- /lab-2/complete-library-server/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 02 - Customized Authentication 4 | 5 | This is the completed code of the reactive web application for lab 2 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/lab-2/complete-library-server/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lab-2/complete-library-server/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue May 01 13:21:16 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'lab2-complete-library-server' 2 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/main/java/com/example/library/server/Lab2CompleteLibraryServerApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Lab2CompleteLibraryServerApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Lab2CompleteLibraryServerApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/main/java/com/example/library/server/api/CreateUserResource.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.api; 2 | 3 | import com.example.library.server.common.Role; 4 | 5 | import java.util.List; 6 | import java.util.UUID; 7 | 8 | public class CreateUserResource extends UserResource { 9 | 10 | private String password; 11 | 12 | public CreateUserResource() {} 13 | 14 | public CreateUserResource( 15 | UUID id, String email, String password, String firstName, String lastName, List roles) { 16 | super(id, email, firstName, lastName, roles); 17 | this.password = password; 18 | } 19 | 20 | public String getPassword() { 21 | return password; 22 | } 23 | 24 | public void setPassword(String password) { 25 | this.password = password; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/main/java/com/example/library/server/common/Role.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.common; 2 | 3 | public enum Role { 4 | LIBRARY_USER, 5 | 6 | LIBRARY_CURATOR, 7 | 8 | LIBRARY_ADMIN 9 | } 10 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/main/java/com/example/library/server/config/IdGeneratorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.util.IdGenerator; 6 | import org.springframework.util.JdkIdGenerator; 7 | 8 | @Configuration 9 | public class IdGeneratorConfiguration { 10 | 11 | @Bean 12 | public IdGenerator idGenerator() { 13 | return new JdkIdGenerator(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/main/java/com/example/library/server/config/ModelMapperConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.modelmapper.convention.MatchingStrategies; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class ModelMapperConfiguration { 10 | 11 | @Bean 12 | public ModelMapper modelMapper() { 13 | ModelMapper modelMapper = new ModelMapper(); 14 | modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); 15 | return modelMapper; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/main/java/com/example/library/server/config/WebSecurityConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; 5 | import org.springframework.security.crypto.factory.PasswordEncoderFactories; 6 | import org.springframework.security.crypto.password.PasswordEncoder; 7 | 8 | @EnableWebFluxSecurity 9 | public class WebSecurityConfiguration { 10 | 11 | @Bean 12 | public PasswordEncoder passwordEncoder() { 13 | return PasswordEncoderFactories.createDelegatingPasswordEncoder(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/main/java/com/example/library/server/dataaccess/BookRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | 5 | import java.util.UUID; 6 | 7 | public interface BookRepository extends ReactiveMongoRepository {} 8 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/main/java/com/example/library/server/dataaccess/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | import reactor.core.publisher.Mono; 5 | 6 | import java.util.UUID; 7 | 8 | public interface UserRepository extends ReactiveMongoRepository { 9 | 10 | Mono findOneByEmail(String email); 11 | } 12 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/main/java/com/example/library/server/filter/LoggingWebFilter.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.filter; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.stereotype.Component; 6 | import org.springframework.web.server.ServerWebExchange; 7 | import org.springframework.web.server.WebFilter; 8 | import org.springframework.web.server.WebFilterChain; 9 | import reactor.core.publisher.Mono; 10 | 11 | @Component 12 | public class LoggingWebFilter implements WebFilter { 13 | 14 | private static Logger LOGGER = LoggerFactory.getLogger(LoggingWebFilter.class); 15 | 16 | @Override 17 | public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { 18 | LOGGER.info("Request {} called", exchange.getRequest().getPath().value()); 19 | return chain.filter(exchange); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | management: 2 | endpoints: 3 | web: 4 | exposure: 5 | include: '*' 6 | endpoint: 7 | health: 8 | show-details: always 9 | 10 | spring: 11 | data: 12 | mongodb: 13 | port: 40495 14 | jackson: 15 | date-format: com.fasterxml.jackson.databind.util.StdDateFormat 16 | default-property-inclusion: non_null 17 | mongodb: 18 | embedded: 19 | version: '4.0.12' 20 | server: 21 | error: 22 | include-stacktrace: never 23 | port: 9091 24 | -------------------------------------------------------------------------------- /lab-2/complete-library-server/src/test/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | security: 3 | user: 4 | password: secret 5 | -------------------------------------------------------------------------------- /lab-3/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 03 - Authorization 4 | 5 | This contains the completed and initial code of the reactive web application for lab 3 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | /out/ 20 | 21 | ### NetBeans ### 22 | /nbproject/private/ 23 | /build/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ -------------------------------------------------------------------------------- /lab-3/complete-library-server/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 03 - Authorization 4 | 5 | This is the completed code of the reactive web application for lab 3 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/lab-3/complete-library-server/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lab-3/complete-library-server/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue May 01 13:21:16 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'lab3-complete-library-server' 2 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/src/main/java/com/example/library/server/Lab3CompleteLibraryServerApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Lab3CompleteLibraryServerApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Lab3CompleteLibraryServerApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/src/main/java/com/example/library/server/api/CreateUserResource.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.api; 2 | 3 | import com.example.library.server.common.Role; 4 | 5 | import java.util.List; 6 | import java.util.UUID; 7 | 8 | public class CreateUserResource extends UserResource { 9 | 10 | private String password; 11 | 12 | public CreateUserResource() {} 13 | 14 | public CreateUserResource( 15 | UUID id, String email, String password, String firstName, String lastName, List roles) { 16 | super(id, email, firstName, lastName, roles); 17 | this.password = password; 18 | } 19 | 20 | public String getPassword() { 21 | return password; 22 | } 23 | 24 | public void setPassword(String password) { 25 | this.password = password; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/src/main/java/com/example/library/server/common/Role.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.common; 2 | 3 | public enum Role { 4 | LIBRARY_USER, 5 | 6 | LIBRARY_CURATOR, 7 | 8 | LIBRARY_ADMIN 9 | } 10 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/src/main/java/com/example/library/server/config/IdGeneratorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.util.IdGenerator; 6 | import org.springframework.util.JdkIdGenerator; 7 | 8 | @Configuration 9 | public class IdGeneratorConfiguration { 10 | 11 | @Bean 12 | public IdGenerator idGenerator() { 13 | return new JdkIdGenerator(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/src/main/java/com/example/library/server/config/ModelMapperConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.modelmapper.convention.MatchingStrategies; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class ModelMapperConfiguration { 10 | 11 | @Bean 12 | public ModelMapper modelMapper() { 13 | ModelMapper modelMapper = new ModelMapper(); 14 | modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); 15 | return modelMapper; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/src/main/java/com/example/library/server/dataaccess/BookRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | 5 | import java.util.UUID; 6 | 7 | public interface BookRepository extends ReactiveMongoRepository {} 8 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/src/main/java/com/example/library/server/dataaccess/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | import reactor.core.publisher.Mono; 5 | 6 | import java.util.UUID; 7 | 8 | public interface UserRepository extends ReactiveMongoRepository { 9 | 10 | Mono findOneByEmail(String email); 11 | } 12 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/src/main/java/com/example/library/server/filter/LoggingWebFilter.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.filter; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.stereotype.Component; 6 | import org.springframework.web.server.ServerWebExchange; 7 | import org.springframework.web.server.WebFilter; 8 | import org.springframework.web.server.WebFilterChain; 9 | import reactor.core.publisher.Mono; 10 | 11 | @Component 12 | public class LoggingWebFilter implements WebFilter { 13 | 14 | private static Logger LOGGER = LoggerFactory.getLogger(LoggingWebFilter.class); 15 | 16 | @Override 17 | public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { 18 | LOGGER.info("Request {} called", exchange.getRequest().getPath().value()); 19 | return chain.filter(exchange); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | management: 2 | endpoints: 3 | web: 4 | exposure: 5 | include: '*' 6 | endpoint: 7 | health: 8 | show-details: always 9 | 10 | spring: 11 | data: 12 | mongodb: 13 | port: 40495 14 | jackson: 15 | date-format: com.fasterxml.jackson.databind.util.StdDateFormat 16 | default-property-inclusion: non_null 17 | mongodb: 18 | embedded: 19 | version: '4.0.12' 20 | server: 21 | error: 22 | include-stacktrace: never 23 | port: 9091 24 | -------------------------------------------------------------------------------- /lab-3/complete-library-server/src/test/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | security: 3 | user: 4 | password: secret 5 | -------------------------------------------------------------------------------- /lab-4/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 04 - Security Testing 4 | 5 | This contains the completed and initial code of the reactive web application for lab 4 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | /out/ 20 | 21 | ### NetBeans ### 22 | /nbproject/private/ 23 | /build/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ -------------------------------------------------------------------------------- /lab-4/complete-library-server/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 04 - Security Testing 4 | 5 | This is the completed code of the reactive web application for lab 4 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/lab-4/complete-library-server/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lab-4/complete-library-server/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue May 01 13:21:16 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'lab4-complete-library-server' 2 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/src/main/java/com/example/library/server/Lab4CompleteLibraryServerApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Lab4CompleteLibraryServerApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Lab4CompleteLibraryServerApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/src/main/java/com/example/library/server/api/CreateUserResource.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.api; 2 | 3 | import com.example.library.server.common.Role; 4 | 5 | import java.util.List; 6 | import java.util.UUID; 7 | 8 | public class CreateUserResource extends UserResource { 9 | 10 | private String password; 11 | 12 | public CreateUserResource() {} 13 | 14 | public CreateUserResource( 15 | UUID id, String email, String password, String firstName, String lastName, List roles) { 16 | super(id, email, firstName, lastName, roles); 17 | this.password = password; 18 | } 19 | 20 | public String getPassword() { 21 | return password; 22 | } 23 | 24 | public void setPassword(String password) { 25 | this.password = password; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/src/main/java/com/example/library/server/common/Role.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.common; 2 | 3 | public enum Role { 4 | LIBRARY_USER, 5 | 6 | LIBRARY_CURATOR, 7 | 8 | LIBRARY_ADMIN 9 | } 10 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/src/main/java/com/example/library/server/config/IdGeneratorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.util.IdGenerator; 6 | import org.springframework.util.JdkIdGenerator; 7 | 8 | @Configuration 9 | public class IdGeneratorConfiguration { 10 | 11 | @Bean 12 | public IdGenerator idGenerator() { 13 | return new JdkIdGenerator(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/src/main/java/com/example/library/server/config/ModelMapperConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.modelmapper.convention.MatchingStrategies; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class ModelMapperConfiguration { 10 | 11 | @Bean 12 | public ModelMapper modelMapper() { 13 | ModelMapper modelMapper = new ModelMapper(); 14 | modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); 15 | return modelMapper; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/src/main/java/com/example/library/server/dataaccess/BookRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | 5 | import java.util.UUID; 6 | 7 | public interface BookRepository extends ReactiveMongoRepository {} 8 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/src/main/java/com/example/library/server/dataaccess/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | import reactor.core.publisher.Mono; 5 | 6 | import java.util.UUID; 7 | 8 | public interface UserRepository extends ReactiveMongoRepository { 9 | 10 | Mono findOneByEmail(String email); 11 | } 12 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/src/main/java/com/example/library/server/filter/LoggingWebFilter.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.filter; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.stereotype.Component; 6 | import org.springframework.web.server.ServerWebExchange; 7 | import org.springframework.web.server.WebFilter; 8 | import org.springframework.web.server.WebFilterChain; 9 | import reactor.core.publisher.Mono; 10 | 11 | @Component 12 | public class LoggingWebFilter implements WebFilter { 13 | 14 | private static Logger LOGGER = LoggerFactory.getLogger(LoggingWebFilter.class); 15 | 16 | @Override 17 | public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { 18 | LOGGER.info("Request {} called", exchange.getRequest().getPath().value()); 19 | return chain.filter(exchange); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | management: 2 | endpoints: 3 | web: 4 | exposure: 5 | include: '*' 6 | endpoint: 7 | health: 8 | show-details: always 9 | 10 | spring: 11 | data: 12 | mongodb: 13 | port: 40495 14 | jackson: 15 | date-format: com.fasterxml.jackson.databind.util.StdDateFormat 16 | default-property-inclusion: non_null 17 | mongodb: 18 | embedded: 19 | version: '4.0.12' 20 | server: 21 | error: 22 | include-stacktrace: never 23 | port: 9091 24 | -------------------------------------------------------------------------------- /lab-4/complete-library-server/src/test/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | security: 3 | user: 4 | password: secret -------------------------------------------------------------------------------- /lab-5/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 05 - OAuth2/OpenID Connect Resource Server 4 | 5 | This contains the completed and initial code of the reactive web application for lab 5 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | /out/ 20 | 21 | ### NetBeans ### 22 | /nbproject/private/ 23 | /build/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ -------------------------------------------------------------------------------- /lab-5/complete-resource-server/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 05 - OAuth2/OpenID Connect Resource Server 4 | 5 | This is the completed code of the resource server for lab 5 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/lab-5/complete-resource-server/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lab-5/complete-resource-server/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue May 01 13:21:16 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'lab-5-complete-resource-server' 2 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/src/main/java/com/example/library/server/CompleteResourceServerApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CompleteResourceServerApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CompleteResourceServerApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/src/main/java/com/example/library/server/common/Role.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.common; 2 | 3 | public enum Role { 4 | LIBRARY_USER, 5 | 6 | LIBRARY_CURATOR, 7 | 8 | LIBRARY_ADMIN 9 | } 10 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/src/main/java/com/example/library/server/config/IdGeneratorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.util.IdGenerator; 6 | import org.springframework.util.JdkIdGenerator; 7 | 8 | @Configuration 9 | public class IdGeneratorConfiguration { 10 | 11 | @Bean 12 | public IdGenerator idGenerator() { 13 | return new JdkIdGenerator(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/src/main/java/com/example/library/server/config/ModelMapperConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.modelmapper.convention.MatchingStrategies; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class ModelMapperConfiguration { 10 | 11 | @Bean 12 | public ModelMapper modelMapper() { 13 | ModelMapper modelMapper = new ModelMapper(); 14 | modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); 15 | return modelMapper; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/src/main/java/com/example/library/server/dataaccess/BookRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | 5 | import java.util.UUID; 6 | 7 | public interface BookRepository extends ReactiveMongoRepository {} 8 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/src/main/java/com/example/library/server/dataaccess/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | import reactor.core.publisher.Mono; 5 | 6 | import java.util.UUID; 7 | 8 | public interface UserRepository extends ReactiveMongoRepository { 9 | 10 | Mono findOneByEmail(String email); 11 | } 12 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/src/main/java/com/example/library/server/filter/LoggingWebFilter.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.filter; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.stereotype.Component; 6 | import org.springframework.web.server.ServerWebExchange; 7 | import org.springframework.web.server.WebFilter; 8 | import org.springframework.web.server.WebFilterChain; 9 | import reactor.core.publisher.Mono; 10 | 11 | @Component 12 | public class LoggingWebFilter implements WebFilter { 13 | 14 | private static Logger LOGGER = LoggerFactory.getLogger(LoggingWebFilter.class); 15 | 16 | @Override 17 | public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { 18 | LOGGER.info("Request {} called", exchange.getRequest().getPath().value()); 19 | return chain.filter(exchange); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lab-5/complete-resource-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | management: 2 | endpoints: 3 | web: 4 | exposure: 5 | include: '*' 6 | endpoint: 7 | health: 8 | show-details: always 9 | 10 | spring: 11 | data: 12 | mongodb: 13 | port: 40495 14 | jackson: 15 | date-format: com.fasterxml.jackson.databind.util.StdDateFormat 16 | default-property-inclusion: non_null 17 | mongodb: 18 | embedded: 19 | version: '4.0.12' 20 | security: 21 | oauth2: 22 | resourceserver: 23 | jwt: 24 | issuer-uri: http://localhost:8080/auth/realms/workshop 25 | server: 26 | error: 27 | include-stacktrace: never 28 | port: 9091 29 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | /out/ 20 | 21 | ### NetBeans ### 22 | /nbproject/private/ 23 | /build/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ -------------------------------------------------------------------------------- /lab-5/initial-resource-server/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 05 - OAuth2/OpenID Connect Resource Server 4 | 5 | This is the completed code of the initially unsecured reactive web application (similar to the one in first step of the workshop). 6 | 7 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/lab-5/initial-resource-server/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lab-5/initial-resource-server/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue May 01 13:21:16 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'lab5-initial-resource-server' 2 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/src/main/java/com/example/library/server/InitialResourceServerApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class InitialResourceServerApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(InitialResourceServerApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/src/main/java/com/example/library/server/common/Role.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.common; 2 | 3 | public enum Role { 4 | LIBRARY_USER, 5 | 6 | LIBRARY_CURATOR, 7 | 8 | LIBRARY_ADMIN 9 | } 10 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/src/main/java/com/example/library/server/config/IdGeneratorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.util.IdGenerator; 6 | import org.springframework.util.JdkIdGenerator; 7 | 8 | @Configuration 9 | public class IdGeneratorConfiguration { 10 | 11 | @Bean 12 | public IdGenerator idGenerator() { 13 | return new JdkIdGenerator(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/src/main/java/com/example/library/server/config/ModelMapperConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.config; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.modelmapper.convention.MatchingStrategies; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class ModelMapperConfiguration { 10 | 11 | @Bean 12 | public ModelMapper modelMapper() { 13 | ModelMapper modelMapper = new ModelMapper(); 14 | modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); 15 | return modelMapper; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/src/main/java/com/example/library/server/dataaccess/BookRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | 5 | import java.util.UUID; 6 | 7 | public interface BookRepository extends ReactiveMongoRepository {} 8 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/src/main/java/com/example/library/server/dataaccess/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.dataaccess; 2 | 3 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 4 | import reactor.core.publisher.Mono; 5 | 6 | import java.util.UUID; 7 | 8 | public interface UserRepository extends ReactiveMongoRepository { 9 | 10 | Mono findOneByEmail(String email); 11 | } 12 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/src/main/java/com/example/library/server/filter/LoggingWebFilter.java: -------------------------------------------------------------------------------- 1 | package com.example.library.server.filter; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.stereotype.Component; 6 | import org.springframework.web.server.ServerWebExchange; 7 | import org.springframework.web.server.WebFilter; 8 | import org.springframework.web.server.WebFilterChain; 9 | import reactor.core.publisher.Mono; 10 | 11 | @Component 12 | public class LoggingWebFilter implements WebFilter { 13 | 14 | private static Logger LOGGER = LoggerFactory.getLogger(LoggingWebFilter.class); 15 | 16 | @Override 17 | public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { 18 | LOGGER.info("Request {} called", exchange.getRequest().getPath().value()); 19 | return chain.filter(exchange); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lab-5/initial-resource-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | management: 2 | endpoints: 3 | web: 4 | exposure: 5 | include: '*' 6 | endpoint: 7 | health: 8 | show-details: always 9 | 10 | spring: 11 | data: 12 | mongodb: 13 | port: 40495 14 | jackson: 15 | date-format: com.fasterxml.jackson.databind.util.StdDateFormat 16 | default-property-inclusion: non_null 17 | mongodb: 18 | embedded: 19 | version: '4.0.12' 20 | server: 21 | error: 22 | include-stacktrace: never 23 | port: 9091 24 | -------------------------------------------------------------------------------- /lab-6/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 06 - OAuth2/OpenID Connect Client 4 | 5 | This contains the completed and initial code of the OIDC client for lab 5 of the workshop. 6 | -------------------------------------------------------------------------------- /lab-6/complete-oidc-client/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | /out/ 20 | 21 | ### NetBeans ### 22 | /nbproject/private/ 23 | /build/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ -------------------------------------------------------------------------------- /lab-6/complete-oidc-client/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 06 - OAuth2/OpenID Connect Client 4 | 5 | This is the completed code of the OIDC client for lab 5 of the workshop. 6 | 7 | -------------------------------------------------------------------------------- /lab-6/complete-oidc-client/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/lab-6/complete-oidc-client/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lab-6/complete-oidc-client/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 06 12:27:20 CET 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /lab-6/complete-oidc-client/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'lab6-complete-oidc-client' 2 | -------------------------------------------------------------------------------- /lab-6/complete-oidc-client/src/main/java/com/example/oidc/client/CompleteOidcClientApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.oidc.client; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CompleteOidcClientApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CompleteOidcClientApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lab-6/complete-oidc-client/src/main/java/com/example/oidc/client/api/UserInfoRestController.java: -------------------------------------------------------------------------------- 1 | package com.example.oidc.client.api; 2 | 3 | import org.springframework.security.core.annotation.AuthenticationPrincipal; 4 | import org.springframework.security.oauth2.core.user.OAuth2User; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | import reactor.core.publisher.Mono; 8 | 9 | import java.util.Map; 10 | 11 | @RestController 12 | public class UserInfoRestController { 13 | 14 | @GetMapping("/userinfo") 15 | Mono> userInfo(@AuthenticationPrincipal OAuth2User oauth2User) { 16 | return Mono.just(oauth2User.getAttributes()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lab-6/complete-oidc-client/src/main/java/com/example/oidc/client/config/SecurityConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.oidc.client.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; 6 | import org.springframework.security.config.web.server.ServerHttpSecurity; 7 | import org.springframework.security.web.server.SecurityWebFilterChain; 8 | 9 | @EnableWebFluxSecurity 10 | @Configuration 11 | public class SecurityConfiguration { 12 | 13 | @Bean 14 | SecurityWebFilterChain configure(ServerHttpSecurity http) { 15 | http.authorizeExchange().anyExchange().authenticated().and().oauth2Client().and().oauth2Login(); 16 | return http.build(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lab-6/complete-oidc-client/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 9090 3 | error: 4 | include-stacktrace: never 5 | 6 | spring: 7 | thymeleaf: 8 | cache: false 9 | security: 10 | oauth2: 11 | client: 12 | registration: 13 | keycloak: 14 | client-id: 'library-client' 15 | client-secret: '9584640c-3804-4dcd-997b-93593cfb9ea7' 16 | authorizationGrantType: authorization_code 17 | redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}' 18 | scope: openid 19 | provider: 20 | keycloak: 21 | issuerUri: http://localhost:8080/auth/realms/workshop 22 | user-name-attribute: name 23 | 24 | library: 25 | server: http://localhost:9091 26 | -------------------------------------------------------------------------------- /lab-6/initial-oidc-client/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | /out/ 20 | 21 | ### NetBeans ### 22 | /nbproject/private/ 23 | /build/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ -------------------------------------------------------------------------------- /lab-6/initial-oidc-client/README.md: -------------------------------------------------------------------------------- 1 | # Spring Security 5 Workshop 2 | 3 | ## 06 - OAuth2/OpenID Connect Client 4 | 5 | This is the initial code of the OIDC client for lab 5 of the workshop. 6 | 7 | -------------------------------------------------------------------------------- /lab-6/initial-oidc-client/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/lab-6/initial-oidc-client/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lab-6/initial-oidc-client/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 06 12:27:20 CET 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /lab-6/initial-oidc-client/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'lab6-initial-oidc-client' 2 | -------------------------------------------------------------------------------- /lab-6/initial-oidc-client/src/main/java/com/example/oidc/client/InitialOidcClientApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.oidc.client; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class InitialOidcClientApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(InitialOidcClientApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lab-6/initial-oidc-client/src/main/java/com/example/oidc/client/api/UserInfoRestController.java: -------------------------------------------------------------------------------- 1 | package com.example.oidc.client.api; 2 | 3 | import org.springframework.web.bind.annotation.GetMapping; 4 | import org.springframework.web.bind.annotation.RestController; 5 | import reactor.core.publisher.Mono; 6 | 7 | import java.util.Map; 8 | 9 | @RestController 10 | public class UserInfoRestController { 11 | 12 | @GetMapping("/userinfo") 13 | Mono> userInfo() { 14 | return Mono.empty(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lab-6/initial-oidc-client/src/main/java/com/example/oidc/client/config/SecurityConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.oidc.client.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; 6 | import org.springframework.security.config.web.server.ServerHttpSecurity; 7 | import org.springframework.security.web.server.SecurityWebFilterChain; 8 | 9 | @EnableWebFluxSecurity 10 | @Configuration 11 | public class SecurityConfiguration { 12 | 13 | @Bean 14 | SecurityWebFilterChain configure(ServerHttpSecurity http) { 15 | http.authorizeExchange().anyExchange().authenticated(); 16 | return http.build(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lab-6/initial-oidc-client/src/main/java/com/example/oidc/client/config/WebClientConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.example.oidc.client.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.reactive.function.client.WebClient; 6 | 7 | @Configuration 8 | public class WebClientConfiguration { 9 | 10 | @Bean 11 | WebClient webClient() { 12 | return WebClient.builder().build(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lab-6/initial-oidc-client/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 9090 3 | error: 4 | include-stacktrace: never 5 | 6 | spring: 7 | thymeleaf: 8 | cache: false 9 | security: 10 | user: 11 | password: secret 12 | 13 | library: 14 | server: http://localhost:9091 15 | 16 | -------------------------------------------------------------------------------- /setup/export_keycloak_realm.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | setlocal 4 | 5 | rem replace this with your own installation directory of keycloak 6 | set KEYCLOAK_HOME=C:\keycloak-11.0.1 7 | 8 | %KEYCLOAK_HOME%\bin\standalone.bat -Dkeycloak.migration.action=export -Dkeycloak.migration.realmName=workshop -Dkeycloak.migration.provider=singleFile -Dkeycloak.migration.file=keycloak_realm_workshop.json 9 | -------------------------------------------------------------------------------- /setup/export_keycloak_realm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # replace this with your own installation directory of keycloak 4 | export KEYCLOAK_HOME=/home/afa/development/keycloak-11.0.1 5 | 6 | $KEYCLOAK_HOME/bin/standalone.sh -Dkeycloak.migration.action=export \ 7 | -Dkeycloak.migration.realmName=workshop -Dkeycloak.migration.provider=singleFile \ 8 | -Dkeycloak.migration.file=./keycloak_realm_workshop.json 9 | -------------------------------------------------------------------------------- /setup/import_keycloak_realm.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | setlocal 4 | 5 | rem replace this with your own installation directory of keycloak 6 | set KEYCLOAK_HOME=C:\keycloak-11.0.1 7 | 8 | %KEYCLOAK_HOME%\bin\standalone.bat -Dkeycloak.migration.action=import -Dkeycloak.migration.realmName=workshop -Dkeycloak.migration.provider=singleFile -Dkeycloak.migration.file=keycloak_realm_workshop.json -Dkeycloak.migration.strategy=OVERWRITE_EXISTING 9 | -------------------------------------------------------------------------------- /setup/import_keycloak_realm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # replace this with your own installation directory of keycloak 4 | export KEYCLOAK_HOME=/home/afa/development/keycloak-11.0.1 5 | 6 | $KEYCLOAK_HOME/bin/standalone.sh -Dkeycloak.migration.action=import \ 7 | -Dkeycloak.migration.realmName=workshop \ 8 | -Dkeycloak.migration.provider=singleFile -Dkeycloak.migration.file=./keycloak_realm_workshop.json \ 9 | -Dkeycloak.migration.strategy=OVERWRITE_EXISTING 10 | -------------------------------------------------------------------------------- /setup/keycloak_initial_admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/setup/keycloak_initial_admin.png -------------------------------------------------------------------------------- /setup/keycloak_workshop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/setup/keycloak_workshop.png -------------------------------------------------------------------------------- /setup/mongodb_compass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/setup/mongodb_compass.png -------------------------------------------------------------------------------- /setup/run_keycloak_docker.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | setlocal 4 | 5 | rem replace this config with your own directory 6 | set WORKSHOP_HOME=C:\reactive-spring-security-5-workshop\setup 7 | 8 | docker run --rm -p 8080:8080 -e DB_VENDOR=h2 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e KEYCLOAK_IMPORT=/tmp/keycloak_realm_workshop.json -v %WORKSHOP_HOME%\keycloak_realm_workshop.json:/tmp/keycloak_realm_workshop.json jboss/keycloak:11.0.1 9 | -------------------------------------------------------------------------------- /setup/run_keycloak_docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # replace this config with your own directory 4 | export WORKSHOP_HOME=/home/afa/development/localgit/reactive-spring-security-5-workshop/setup 5 | 6 | docker run --rm -p 8080:8080 -e DB_VENDOR=h2 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin \ 7 | -e KEYCLOAK_IMPORT=/tmp/keycloak_realm_workshop.json \ 8 | -v $WORKSHOP_HOME/keycloak_realm_workshop.json:/tmp/keycloak_realm_workshop.json jboss/keycloak:11.0.1 9 | -------------------------------------------------------------------------------- /workshop-docs/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /workshop-docs/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue May 01 20:07:50 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 7 | -------------------------------------------------------------------------------- /workshop-docs/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'spring-security5-workshop-doc' 2 | 3 | 4 | -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/authorization_code_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/authorization_code_1.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/authorization_code_schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/authorization_code_schema.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/automatic_role_mapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/automatic_role_mapping.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/demo-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/demo-architecture.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/devtools_cookies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/devtools_cookies.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/eclipse_gradle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/eclipse_gradle.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/favicon.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/flux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/flux.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/implicit_schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/implicit_schema.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/jwt_generator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/jwt_generator.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/jwt_generator_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/jwt_generator_result.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/jwt_io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/jwt_io.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/jwt_io_decoded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/jwt_io_decoded.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/keycloak_initial_admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/keycloak_initial_admin.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/keycloak_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/keycloak_logo.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/keycloak_sessions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/keycloak_sessions.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/keycloak_workshop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/keycloak_workshop.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/library_client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/library_client.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/loginform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/loginform.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/logoutform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/logoutform.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/manual_role_mapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/manual_role_mapping.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/mongodb_compass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/mongodb_compass.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/mono.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/mono.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/novatec_logo_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/novatec_logo_big.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/oauth2_protocol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/oauth2_protocol.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/oauth2_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/oauth2_roles.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/oauth2_spring_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/oauth2_spring_roles.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/oauth_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/oauth_roles.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/oidc_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/oidc_roles.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/openid_roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/openid_roles.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/owasp_top_10_2017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/owasp_top_10_2017.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/reactor_spring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/reactor_spring.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/robo3t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/robo3t.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/roles_permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/roles_permissions.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/session_auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/session_auth.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/spring_io_workshop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/spring_io_workshop.jpg -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/spring_security_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/spring_security_new.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/spring_security_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/spring_security_old.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/titlelogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/titlelogo.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/token_validation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/token_validation.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/workshop_lab_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/workshop_lab_1.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/workshop_lab_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/workshop_lab_2.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/workshop_lab_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/workshop_lab_3.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/workshop_lab_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/workshop_lab_4.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/workshop_lab_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/workshop_lab_5.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/workshop_lab_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/workshop_lab_6.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/asciidoc/images/workshop_lab_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andifalk/reactive-spring-security-5-workshop/5112556dc1148d049c09a82a53e8abedc02e97ad/workshop-docs/src/docs/asciidoc/images/workshop_lab_7.png -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-1-default-password-console.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | INFO 18465 --- [ restartedMain] ctiveUserDetailsServiceAutoConfiguration : 4 | 5 | Using default security password: ded10c78-0b2f-4ae8-89fe-c267f9a29e1d 6 | ---- -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-1-gradle-build.adoc: -------------------------------------------------------------------------------- 1 | [source,groovy,options="nowrap"] 2 | ---- 3 | dependencies { 4 | ... 5 | implementation('org.springframework.boot:spring-boot-starter-security') # <1> 6 | ... 7 | testImplementation('org.springframework.security:spring-security-test') # <2> 8 | } 9 | ---- 10 | <1> The spring boot starter for spring security 11 | <2> Adds testing support for spring security -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-1-security-response-header.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | Cache-Control: no-cache, no-store, max-age=0, must-revalidate 4 | Expires: 0 5 | Pragma: no-cache 6 | Referrer-Policy: no-referrer 7 | X-Content-Type-Options: nosniff 8 | X-Frame-Options: DENY 9 | X-XSS-Protection: 1 ; mode=block 10 | ---- -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-2-default-security-config.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | @Configuration 4 | class WebFluxSecurityConfiguration { 5 | ... 6 | 7 | /** 8 | * The default {@link ServerHttpSecurity} configuration. 9 | * @param http 10 | * @return 11 | */ 12 | private SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { 13 | http 14 | .authorizeExchange() 15 | .anyExchange().authenticated(); 16 | 17 | if (isOAuth2Present && OAuth2ClasspathGuard.shouldConfigure(this.context)) { 18 | OAuth2ClasspathGuard.configure(this.context, http); 19 | } else { 20 | http 21 | .httpBasic().and() 22 | .formLogin(); 23 | } 24 | 25 | SecurityWebFilterChain result = http.build(); 26 | return result; 27 | } 28 | 29 | ... 30 | } 31 | ---- -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-2-password-encoder-config.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | package com.example.library.server.config; 4 | 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; 7 | import org.springframework.security.crypto.factory.PasswordEncoderFactories; 8 | import org.springframework.security.crypto.password.PasswordEncoder; 9 | 10 | @EnableWebFluxSecurity # <1> 11 | public class WebSecurityConfiguration { 12 | 13 | @Bean 14 | public PasswordEncoder passwordEncoder() { 15 | return PasswordEncoderFactories.createDelegatingPasswordEncoder(); # <2> 16 | } 17 | 18 | } 19 | ---- 20 | <1> This auto-configures the SecurityWebFilterChain 21 | <2> This adds the new delegating password encoder introduced in spring security 5 -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-2-password-encoder.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | package org.springframework.security.crypto.password; 4 | 5 | public interface PasswordEncoder { 6 | 7 | String encode(CharSequence rawPassword); # <1> 8 | 9 | boolean matches(CharSequence rawPassword, String encodedPassword); # <2> 10 | } 11 | ---- 12 | <1> Encrypts the given cleartext password 13 | <2> Validates the given cleartext password with the encrypted one (without revealing the unencrypted one) 14 | -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-2-reactive-user-details-password-service.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | package org.springframework.security.core.userdetails; 4 | 5 | import reactor.core.publisher.Mono; 6 | 7 | public interface ReactiveUserDetailsPasswordService { 8 | 9 | /** 10 | * Modify the specified user's password. This should change the user's password in the 11 | * persistent user repository (datbase, LDAP etc). 12 | * 13 | * @param user the user to modify the password for 14 | * @param newPassword the password to change to 15 | * @return the updated UserDetails with the new password 16 | */ 17 | Mono updatePassword(UserDetails user, String newPassword); 18 | } 19 | ---- 20 | -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-2-security-web-filter-chain.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | /** 4 | * Defines a filter chain which is capable of being matched against a {@link ServerWebExchange} in order to decide 5 | * whether it applies to that request. 6 | * 7 | * @author Rob Winch 8 | * @since 5.0 9 | */ 10 | public interface SecurityWebFilterChain { 11 | 12 | /** 13 | * Determines if this {@link SecurityWebFilterChain} matches the provided {@link ServerWebExchange} 14 | * @param exchange the {@link ServerWebExchange} 15 | * @return true if it matches, else false 16 | */ 17 | Mono matches(ServerWebExchange exchange); 18 | 19 | /** 20 | * The {@link WebFilter} to use 21 | * @return 22 | */ 23 | Flux getWebFilters(); 24 | } 25 | ---- 26 | 27 | -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-2-web-filter.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | public interface WebFilter { 4 | 5 | /** 6 | * Process the Web request and (optionally) delegate to the next 7 | * {@code WebFilter} through the given {@link WebFilterChain}. 8 | * @param exchange the current server exchange 9 | * @param chain provides a way to delegate to the next filter 10 | * @return {@code Mono} to indicate when request processing is complete 11 | */ 12 | Mono filter(ServerWebExchange exchange, WebFilterChain chain); 13 | 14 | } 15 | ---- -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-3-csrf-disable.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | ... 4 | @Bean 5 | public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { 6 | return http 7 | .csrf().disable() # <1> 8 | .authorizeExchange() 9 | .matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() 10 | ... 11 | ---- 12 | 13 | <1> Add this line to disable CSRF. 14 | -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-3-csrf-error.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | POST http://localhost:8080/books 4 | 5 | HTTP/1.1 403 Forbidden 6 | transfer-encoding: chunked 7 | Content-Type: text/plain 8 | Cache-Control: no-cache, no-store, max-age=0, must-revalidate 9 | Pragma: no-cache 10 | Expires: 0 11 | X-Content-Type-Options: nosniff 12 | X-Frame-Options: DENY 13 | X-XSS-Protection: 1 ; mode=block 14 | 15 | No CSRF Token has been associated to this client 16 | 17 | Response code: 403 (Forbidden) 18 | ---- 19 | -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-3-permission-evaluator.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | package org.springframework.security.access; 4 | 5 | ... 6 | public interface PermissionEvaluator extends AopInfrastructureBean { 7 | 8 | boolean hasPermission(Authentication authentication, Object targetDomainObject, 9 | Object permission); 10 | 11 | boolean hasPermission(Authentication authentication, Serializable targetId, 12 | String targetType, Object permission); 13 | } 14 | ---- 15 | -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-5-google-oauth2-provider-properties.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | spring: 4 | security: 5 | oauth2: 6 | client: 7 | registration: 8 | google-login: # <1> 9 | provider: google # <2> 10 | client-id: google-client-id 11 | client-secret: google-client-secret 12 | ---- 13 | <1> The registration id is set to _google-login_ 14 | <2> The provider is set to the predefined _google_ client which points to _CommonOAuth2Provider.GOOGLE_ 15 | 16 | -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-5-oauth2-client-gradle-build.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | dependencies { 4 | ... 5 | implementation('org.springframework.boot:spring-boot-starter-oauth2-client') <1> 6 | ... 7 | } 8 | ---- 9 | <1> Spring Boot starter for OAuth2 client including core OAuth2/OIDC client and JOSE (Javascript Object Signing and Encryption) 10 | framework to support for example JSON Web Token (JWT) 11 | 12 | -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-5-oauth2-resource-server-gradle-build.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | dependencies { 4 | ... 5 | implementation('org.springframework.boot:spring-boot-starter-oauth2-resource-server') # <1> 6 | testImplementation('org.springframework.security:spring-security-test') # <2> 7 | ... 8 | } 9 | ---- 10 | <1> This contains all code to build an OAuth 2.0/OIDC resource server (incl. support for JOSE (Javascript Object Signing and Encryption) 11 | <2> Testing support for spring security 12 | 13 | -------------------------------------------------------------------------------- /workshop-docs/src/docs/snippets/step-5-oauth2-resource-server-properties.adoc: -------------------------------------------------------------------------------- 1 | [source,options="nowrap"] 2 | ---- 3 | spring: 4 | security: 5 | oauth2: 6 | resourceserver: 7 | jwt: 8 | issuer-uri: http://localhost:8080/auth/realms/workshop # <1> 9 | ---- 10 | <1> The issuer url is used to look up the well known configuration page to get all required configuration settings to set up a resource server 11 | 12 | --------------------------------------------------------------------------------