{"id":19316595,"url":"https://github.com/wisskirchenj/account-reactive","last_synced_at":"2026-01-12T07:42:04.839Z","repository":{"id":51601638,"uuid":"518057298","full_name":"wisskirchenj/account-reactive","owner":"wisskirchenj","description":"Reactive Spring Webflux backend with functional usage to implement a simple account service","archived":false,"fork":false,"pushed_at":"2024-06-09T20:40:45.000Z","size":312,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-02T08:28:10.802Z","etag":null,"topics":["java19","native-image","project-reactor","r2dbc-h2","spring-boot","webflux","webflux-functional","webflux-security"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wisskirchenj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-07-26T12:43:23.000Z","updated_at":"2023-07-23T23:15:30.000Z","dependencies_parsed_at":"2023-02-18T08:40:21.161Z","dependency_job_id":"2be3a283-d411-46a1-9e2f-4093b5bff713","html_url":"https://github.com/wisskirchenj/account-reactive","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wisskirchenj/account-reactive","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisskirchenj%2Faccount-reactive","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisskirchenj%2Faccount-reactive/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisskirchenj%2Faccount-reactive/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisskirchenj%2Faccount-reactive/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wisskirchenj","download_url":"https://codeload.github.com/wisskirchenj/account-reactive/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisskirchenj%2Faccount-reactive/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28336664,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T06:09:07.588Z","status":"ssl_error","status_checked_at":"2026-01-12T06:05:18.301Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java19","native-image","project-reactor","r2dbc-h2","spring-boot","webflux","webflux-functional","webflux-security"],"created_at":"2024-11-10T01:11:57.927Z","updated_at":"2026-01-12T07:42:04.825Z","avatar_url":"https://github.com/wisskirchenj.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IDEA EDU Course ...\n\nImplemented in the Java \u003cb\u003eBackend Developer\u003c/b\u003e Track of hyperskill.org's JetBrain Academy.\u003cbr\u003e\nhttps://hyperskill.org/projects/217\n\nProject goal (or rather my interpretation of it) is to implement a reactive Spring webflux application with functional endpoints\nusing Basic Auth Spring security eventually on HTTPS-protocol.\n\nPurpose of doing this project, is further practising Spring boot and security applications - experimenting with the reactive \nSpring webflux using functional Spring 5 routing/handler techniques. Also, with this project the Java Backend Developer track\nshould be completed, as only 1 or 2 applied topics are still missing to fulfill the 95% hurdle :-)\n\n## Program description\n\nThe application will represent a simple account service with user authentication, different authorization roles\nand some business logic endpoints accessing employee payroll data in a database.\n\nCurrently implemented endpoints:\n\n\u003e \u003cb\u003ePOST /api/auth/signup (unauthenticated)\u003c/b\u003e. -\u003e receives a signup JSON to register a user. Returns a response without the password\nbut with an id, which the user is stored under in the database. If the requested user exists already, a 400 informative error\nis returned.\nThe request JSON looks as:\u003cpre\u003e\n{\n    \"name\": \"Toni\",\n    \"lastname\": \"Seeler\",\n    \"email\": \"toni.seeler@xyz.de\",\n    \"password\": \"123456\"\n}\u003c/pre\u003e\n\n\u003e \u003cb\u003ePOST /api/auth/changepass (authenticated)\u003c/b\u003e. -\u003e receives a Json with newPassword, which is validated on length and checked\nagainst a collection of breached passwords (This breach check is also done on signup and for every authenticated endpoint!)\nIf the password further differs from the previous one, an informative success Json is returned.\n\n\u003e \u003cb\u003ePOST /api/acct/payments (authorized - Role ACCOUNTANT)\u003c/b\u003e. -\u003e receives a Json array of SalaryRecords as :\u003cpre\u003e\n{\n    \"employee\": \"p.s@acme.COM\",\n    \"period\": \"01-2022\",\n    \"salary\": 515050\n}\u003c/pre\u003e\nSalary in Cents for a given period. The list may contain records for different employees, but no duplicates\nregarding employee and period. Further, the employees must all be registered and no previous sales record\nmust exist in the database for an employee - month combi.\n\n\u003e \u003cb\u003ePUT /api/acct/payments (authorized - Role ACCOUNTANT)\u003c/b\u003e. -\u003e receives one Json object as above via POST, but the employee\nperiod must in this case be existent in the database to get updated.\n\n\u003e \u003cb\u003eGET /api/empl/payment (authorized - Roles USER \u0026 ACCOUNTANT - with request query parameter \"period\")\u003c/b\u003e -\u003e gives an authenticated user\naccess to his payroll data - either all when leaving out the period-parameter - or for the parameterized month.\n\n\u003e \u003cb\u003eGET /api/admin/user (authorized - Role ADMINISTRATOR)\u003c/b\u003e -\u003e list all user data records with id, roles\nand name, email information.\n\n\u003e \u003cb\u003eDELETE /api/admin/user (authorized - Role ADMINISTRATOR - with path parameter \"email\")\u003c/b\u003e -\u003e delete the specified\nuser together with all her roles and salary information. Admin cannot delete himself from the system.\n\n\u003e \u003cb\u003ePUT /api/admin/user/role (authorized - Role ADMINISTRATOR)\u003c/b\u003e -\u003e toggles (Grant/Revoke) a role to\na specified user - consumes Json RoleToggleRequest:\u003cpre\u003e\n{\n    \"user\": \"p.s@acme.COM\",\n    \"role\": \"ACCOUNTANT\",   (or \"USER\"; \"ADMINISTRATOR\" is not allowed to grant or remove) \n    \"operation\": \"Grant\"    (or \"REMOVE\")\n}\u003c/pre\u003e It is also not allowed to assign \"USER\" or \"ACCOUNTANT\" to the \"ADMINISTRATOR\", nor is it allowed\nto delete the last role remaining from a user.\n\n\n\u003e \u003cb\u003ePUT /api/admin/user/access (authorized - Role ADMINISTRATOR)\u003c/b\u003e -\u003e locks or unlocks a user - \nconsumes Json LockUserToggleRequest:\u003cpre\u003e\n{\n    \"user\": \"p.s@acme.COM\",\n    \"operation\": \"lock\"    (or \"unlock\")\n}\u003c/pre\u003e It is not allowed to lock the \"ADMINISTRATOR\".\n\n\n\u003e \u003cb\u003eGET /api/security/events (authorized - Role AUDITOR)\u003c/b\u003e -\u003e list all recorded security events for failed\nor unathorized logins, all admin activities, signups, change passwords and brute force locking after 5 failed attempts.\nand name, email information.\n\n## Project was completed on 26.08.22.\n\n## Repository Contents\n\nSources for all project tasks (7 stages) with tests and configurations.\n\n## Progress\n\n26.07.22 Project started. IDEA-setup and first repo.\n\n26.07.22 Stage 1 completed - signup (functional) endpoint offered reactively with (JPA-)validated Request-DTO.\n\n01.08.22 Stage 2 completed - setup of WebFluxSecurity, R2DBC-data base connected and initialized via scripts using\nSpring properties, signup data are saved, authenticated endpoints (all but signup).\n\n06.08.22 Stage 3 completed - custom authentication manager to include breached passwords check in login authentication,\nchange password functionality, Mono-zipWith and Tuple2 used..\n\n10.08.22 Stage 4 completed - domain logic endpoints /api/acct/payments and /api/empl/payment added / adapted to\nfull functionality. Flux publishers used and many interisting reactor operators.\n\n16.08.22 Stage 5 completed - authorization role concept and admin endpoints added. Used .then() Publisher-operator\nfor Mono\u003cVoid\u003e returning delete-repo methods.\n\n24.08.22 Stage 6 completed - persistent security logging implemented, save login failures and programtically lock a\nuser after 5 failed login attempts, reset failedLogins on successful login. Implement admin lock/unlock user endpoint.\nnew AUDITOR role authorizing new endpoint /api/security/events.\n\n26.08.22 Final Stage 7 completed - switch to https-communication (i.e. TLS) with self-generated certificate via keytool\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwisskirchenj%2Faccount-reactive","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwisskirchenj%2Faccount-reactive","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwisskirchenj%2Faccount-reactive/lists"}