diff --git a/README.md b/README.md index 39d2482..a1783b5 100644 --- a/README.md +++ b/README.md @@ -16,24 +16,30 @@ Through this webapp you can launch and control your scheduled job. The UI Consol Open the [Project Roadmap](https://github.com/fabioformosa/quartz-manager/projects) to take a look at the plan of Quartz Manager. Currently this project might be useful to look how to import Quartz Library in a spring boot application. For this purpose, browse the folder `quartz-manager-parent/quartz-manager-api`. We're just working to create a library, from project `quartz-manager-parent/quartz-manager-api`, to be imported in your spring boot where you have your job to be scheduled. -The project `quartz-manager-parent/quartz-manager-web` is an example of how-to: - * import the library - * set the application.yml - * add secure layer + +Take a loot to the project [Quartz-Manager Demo](https://github.com/fabioformosa/quartz-manager-demo), it is an example of how-to: + * import the quartz-manager-api library in your webapp + * include the quartz-manager frontend (angular based) through a webjar + * set properties into the application.yml + * add a secure layer to allow the API only to logged users * schedule a custom job (a dummy `hello world`) + + **NB: In few days, we'll release the library jar of quartz-manager into the maven central repo.** + +Next steps in the roadmap are: +* to add a persistent layer to save all job setup. +* to add a complete setup UI panel for quartz, in term of cronjobs and multiple jobs. +* to add CI/CD pipeline to ease the deploy pulling a docker container. +* Enabling adapters for integrations: kafka, etc. ## PROJECT STRUCTURE * **quartz-parent/quartz-manager-api** is the library that can be imported in webapp to have the quartz-manager API. -* **quartz-parent/quartz-manager-web** is an example of webapp that imports quartz-manager-api. It adds a secure layer and a custom job to be scheduled. +* **quartz-parent/quartz-manager-webjar** is a maven module to build and package the angular frontend in a webjar. +* **quartz-parent/quartz-manager-security** is ther library that can be imported in a webapp to have a security layer (login) over the quartz-manager API. +* **quartz-parent/quartz-manager-web-showcase** is an example of webapp that imports quartz-manager-api. Useful to develop the frontend started locally with the webpack dev server. * **quartz-frontend** is the angular app that interacts with the Quartz Manager API. -Next steps in the roadmap are: -* to simplify the customization of the job through plugins -* to add CI/CD pipeline to ease the deploy pulling a docker container -* to add a complete setup UI panel for quartz, in term of cronjobs and multiple jobs -* to add a persistent layer to save all job logs. - -## QUICK START +## HOW-TO CONTRIBUTE **[requirements]** Make sure you have installed * [Java 8](https://java.com/download/) or greater * [Maven](https://maven.apache.org/) diff --git a/quartz-manager-frontend/angular.json b/quartz-manager-frontend/angular.json index ce967bd..7ebabad 100644 --- a/quartz-manager-frontend/angular.json +++ b/quartz-manager-frontend/angular.json @@ -12,7 +12,7 @@ "builder": "@angular-devkit/build-angular:browser", "options": { "aot": true, - "outputPath": "../server/src/main/resources/static", + "outputPath": "dist", "index": "src/index.html", "main": "src/main.ts", "tsConfig": "src/tsconfig.app.json", diff --git a/quartz-manager-frontend/package.json b/quartz-manager-frontend/package.json index 8e7cf69..d416c60 100644 --- a/quartz-manager-frontend/package.json +++ b/quartz-manager-frontend/package.json @@ -5,7 +5,7 @@ "scripts": { "ng": "ng", "start": "ng serve --proxy-config proxy.conf.json", - "build": "ng build", + "build": "ng build --prod", "test": "jest", "lint": "ng lint", "e2e": "ng e2e" diff --git a/quartz-manager-frontend/src/app/app.module.ts b/quartz-manager-frontend/src/app/app.module.ts index 90e0d34..5274d28 100644 --- a/quartz-manager-frontend/src/app/app.module.ts +++ b/quartz-manager-frontend/src/app/app.module.ts @@ -45,15 +45,19 @@ import { SchedulerService, ConfigService, ProgressWebsocketService, - LogsWebsocketService + LogsWebsocketService, + getHtmlBaseUrl } from './services'; import { ChangePasswordComponent } from './views/change-password/change-password.component'; import { ForbiddenComponent } from './views/forbidden/forbidden.component'; +import { APP_BASE_HREF } from '@angular/common'; +import { environment } from '../environments/environment'; export function initUserFactory(userService: UserService) { return () => userService.jsessionInitUser(); } + // const stompConfig: StompConfig = { // // Which server? // url: 'ws://localhost:8080/quartz-manager/progress', @@ -131,6 +135,16 @@ export function jwtOptionsFactory(apiService: ApiService) { FlexLayoutModule ], providers: [ + { + provide: APP_BASE_HREF, + useValue: getHtmlBaseUrl() + }, + { + 'provide': APP_INITIALIZER, + 'useFactory': initUserFactory, + 'deps': [UserService], + 'multi': true + }, LoginGuard, GuestGuard, AdminGuard, @@ -141,13 +155,7 @@ export function jwtOptionsFactory(apiService: ApiService) { ApiService, UserService, ConfigService, - MatIconRegistry, - { - 'provide': APP_INITIALIZER, - 'useFactory': initUserFactory, - 'deps': [UserService], - 'multi': true - } + MatIconRegistry // StompService, // ServerSocket // { diff --git a/quartz-manager-frontend/src/app/services/api.service.ts b/quartz-manager-frontend/src/app/services/api.service.ts index d89a780..c7fde7c 100644 --- a/quartz-manager-frontend/src/app/services/api.service.ts +++ b/quartz-manager-frontend/src/app/services/api.service.ts @@ -53,9 +53,6 @@ export class ApiService { if (args) options['params'] = serialize(args); - // if(this.jwtToken) - // options.headers = options.headers.set('Authorization', `Bearer ${this.jwtToken}`); - return this.http.get(path, options) .pipe(catchError(this.checkError.bind(this))); } @@ -78,9 +75,6 @@ export class ApiService { withCredentials: true } - // if(this.jwtToken) - // options.headers = options.headers.append('Authorization', `Bearer ${this.jwtToken}`); - const req = new HttpRequest(method, path, body, options); return this.http.request(req) diff --git a/quartz-manager-frontend/src/app/services/config.service.ts b/quartz-manager-frontend/src/app/services/config.service.ts index 28ad1f5..9294bec 100644 --- a/quartz-manager-frontend/src/app/services/config.service.ts +++ b/quartz-manager-frontend/src/app/services/config.service.ts @@ -1,9 +1,30 @@ import { Injectable } from '@angular/core'; +import { environment } from '../../environments/environment'; + + +const WEBJAR_PATH = '/quartz-manager-ui/'; + +export function getHtmlBaseUrl(){ + const baseUrl = getBaseUrl() || '/'; + return environment.production ? getBaseUrl() + WEBJAR_PATH: '/'; + } + +export function getBaseUrl(){ + if(environment.production){ + let contextPath: string = window.location.pathname.split('/')[1] || ''; + if(contextPath && ('/' + contextPath + '/') === WEBJAR_PATH) + return ''; + if(contextPath) + contextPath = '/' + contextPath; + return contextPath; + } + return ''; +} @Injectable() export class ConfigService { - private _api_url = '/quartz-manager/api' + private _api_url = getBaseUrl() + '/quartz-manager/api' private _refresh_token_url = this._api_url + '/refresh'; diff --git a/quartz-manager-frontend/src/app/services/logs.websocket.service.ts b/quartz-manager-frontend/src/app/services/logs.websocket.service.ts index fe2cd06..989269c 100644 --- a/quartz-manager-frontend/src/app/services/logs.websocket.service.ts +++ b/quartz-manager-frontend/src/app/services/logs.websocket.service.ts @@ -1,12 +1,12 @@ -import { Injectable, OnInit } from '@angular/core'; -import { WebsocketService, ApiService } from '.'; +import { Injectable } from '@angular/core'; +import { WebsocketService, ApiService, getBaseUrl } from '.'; import { SocketOption } from '../model/SocketOption.model'; @Injectable() export class LogsWebsocketService extends WebsocketService { constructor(private apiService: ApiService){ - super(new SocketOption('/quartz-manager/logs', '/topic/logs', apiService.getToken)) + super(new SocketOption( getBaseUrl() +'/quartz-manager/logs', '/topic/logs', apiService.getToken)) } } \ No newline at end of file diff --git a/quartz-manager-frontend/src/app/services/progress.websocket.service.ts b/quartz-manager-frontend/src/app/services/progress.websocket.service.ts index 173428b..f81c627 100644 --- a/quartz-manager-frontend/src/app/services/progress.websocket.service.ts +++ b/quartz-manager-frontend/src/app/services/progress.websocket.service.ts @@ -1,12 +1,12 @@ -import { Injectable, OnInit } from '@angular/core'; -import { WebsocketService, ApiService } from '.'; +import { Injectable } from '@angular/core'; +import { WebsocketService, ApiService, getBaseUrl } from '.'; import { SocketOption } from '../model/SocketOption.model'; @Injectable() export class ProgressWebsocketService extends WebsocketService { constructor(private apiService: ApiService){ - super(new SocketOption('/quartz-manager/progress', '/topic/progress', apiService.getToken)) + super(new SocketOption(getBaseUrl() + '/quartz-manager/progress', '/topic/progress', apiService.getToken)) } } \ No newline at end of file diff --git a/quartz-manager-frontend/src/app/services/scheduler.service.ts b/quartz-manager-frontend/src/app/services/scheduler.service.ts index f2b351b..a4b4251 100644 --- a/quartz-manager-frontend/src/app/services/scheduler.service.ts +++ b/quartz-manager-frontend/src/app/services/scheduler.service.ts @@ -1,4 +1,5 @@ import { Injectable } from '@angular/core'; +import { getBaseUrl } from '.'; import { ApiService } from './api.service'; @Injectable() @@ -9,30 +10,30 @@ export class SchedulerService { ) { } startScheduler = () => { - return this.apiService.get('/quartz-manager/scheduler/run') + return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/run') } stopScheduler = () => { - return this.apiService.get('/quartz-manager/scheduler/stop') + return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/stop') } pauseScheduler = () => { - return this.apiService.get('/quartz-manager/scheduler/pause') + return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/pause') } resumeScheduler = () => { - return this.apiService.get('/quartz-manager/scheduler/resume') + return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/resume') } getStatus = () => { - return this.apiService.get('/quartz-manager/scheduler') + return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler') } getConfig = () => { - return this.apiService.get('/quartz-manager/scheduler/config') + return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/config') } updateConfig = (config: Object) => { - return this.apiService.post('/quartz-manager/scheduler/config', config) + return this.apiService.post(getBaseUrl() + '/quartz-manager/scheduler/config', config) } } diff --git a/quartz-manager-frontend/src/index.html b/quartz-manager-frontend/src/index.html index 8b9f67a..bd33166 100644 --- a/quartz-manager-frontend/src/index.html +++ b/quartz-manager-frontend/src/index.html @@ -3,7 +3,6 @@ Quartz Manager - diff --git a/quartz-manager-parent/.gitignore b/quartz-manager-parent/.gitignore index 0c2b833..d6593c5 100644 --- a/quartz-manager-parent/.gitignore +++ b/quartz-manager-parent/.gitignore @@ -1,2 +1,5 @@ -/.settings/ +/**/.settings/ /.project +/**/target +.classpath +.project diff --git a/quartz-manager-parent/pom.xml b/quartz-manager-parent/pom.xml index 8ff19a3..57c3d5f 100644 --- a/quartz-manager-parent/pom.xml +++ b/quartz-manager-parent/pom.xml @@ -17,7 +17,9 @@ quartz-manager-api - quartz-manager-web + quartz-manager-ui-webjar + quartz-manager-security + quartz-manager-web-showcase @@ -27,6 +29,16 @@ quartz-manager-api 2.2.2-SNAPSHOT + + it.fabioformosa.quartz-manager + quartz-manager-security + 2.2.2-SNAPSHOT + + + it.fabioformosa.quartz-manager + quartz-manager-ui-webjar + 2.2.2-SNAPSHOT + diff --git a/quartz-manager-parent/quartz-manager-api/pom.xml b/quartz-manager-parent/quartz-manager-api/pom.xml index 83df094..dc931ef 100644 --- a/quartz-manager-parent/quartz-manager-api/pom.xml +++ b/quartz-manager-parent/quartz-manager-api/pom.xml @@ -38,6 +38,10 @@ org.springframework.boot spring-boot-starter-websocket + + + org.springframework.security + spring-security-core org.springframework.boot diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java b/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java similarity index 76% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java rename to quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java index 5df6496..5e431ea 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java +++ b/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java @@ -1,16 +1,26 @@ package it.fabioformosa.quartzmanager.controllers; import org.springframework.http.MediaType; -import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/quartz-manager/api", produces = MediaType.APPLICATION_JSON_VALUE) public class UserController { + + @GetMapping("/whoami") + public @ResponseBody Object user() { + SecurityContext context = SecurityContextHolder.getContext(); + if(context != null && context.getAuthentication() != null) + return context.getAuthentication().getPrincipal(); + return "\"NO_AUTH\""; + } + /** * JWT Temporary disabled * @@ -54,20 +64,4 @@ public class UserController { // return ResponseEntity.accepted().body(result); // } - /* - * We are not using userService.findByUsername here(we could), so it is good that we are making - * sure that the user has role "ROLE_USER" to access this endpoint. - */ - // @RequestMapping("/whoami") - // // @PreAuthorize("hasRole('USER')") - // public User user() { - // return (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - // } - - @GetMapping("/whoami") - @PreAuthorize("isAuthenticated()") - public Object user() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } - } diff --git a/quartz-manager-parent/quartz-manager-security/pom.xml b/quartz-manager-parent/quartz-manager-security/pom.xml new file mode 100644 index 0000000..d8945a3 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-security/pom.xml @@ -0,0 +1,57 @@ + + 4.0.0 + + it.fabioformosa.quartz-manager + quartz-manager-parent + 2.2.2-SNAPSHOT + + + quartz-manager-security + + Quartz Manager Security + Security Layer for Quartz Manager + + https://github.com/fabioformosa/quartz-manager + + ${basedir}/../.. + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-configuration-processor + true + + + io.jsonwebtoken + jjwt + 0.9.0 + + + org.apache.commons + commons-lang3 + + + org.projectlombok + lombok + provided + + + javax.servlet + javax.servlet-api + provided + + + + \ No newline at end of file diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/WebSecurityConfigJWT.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/configuration/WebSecurityConfigJWT.java similarity index 93% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/WebSecurityConfigJWT.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/configuration/WebSecurityConfigJWT.java index c3e2d8c..c5bcb07 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/WebSecurityConfigJWT.java +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/configuration/WebSecurityConfigJWT.java @@ -1,4 +1,4 @@ -package it.fabioformosa.quartzmanager.configuration; +package it.fabioformosa.quartzmanager.security.configuration; import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -27,8 +27,8 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import com.fasterxml.jackson.databind.ObjectMapper; -import it.fabioformosa.quartzmanager.configuration.properties.InMemoryAccountProperties; -import it.fabioformosa.quartzmanager.configuration.properties.JwtSecurityProperties; +import it.fabioformosa.quartzmanager.security.configuration.properties.InMemoryAccountProperties; +import it.fabioformosa.quartzmanager.security.configuration.properties.JwtSecurityProperties; import it.fabioformosa.quartzmanager.security.helpers.LoginConfigurer; import it.fabioformosa.quartzmanager.security.helpers.impl.AuthenticationFailureHandler; import it.fabioformosa.quartzmanager.security.helpers.impl.AuthenticationSuccessHandler; @@ -56,10 +56,12 @@ public class WebSecurityConfigJWT extends WebSecurityConfigurerAdapter { private static final String LOGIN_PATH = "/quartz-manager/api/login"; private static final String LOGOUT_PATH = "/quartz-manager/api/logout"; - @Value("${server.servlet.context-path}") + private static final String WEBJAR_PATH = "/quartz-manager-ui"; + + @Value("${server.servlet.context-path:/}") private String contextPath; - @Value("${app.name}") + @Value("${app.name:quartz-manager}") private String APP_NAME; @Value("${quartz-manager.security.login-model.form-login-enabled}") @@ -105,7 +107,7 @@ public class WebSecurityConfigJWT extends WebSecurityConfigurerAdapter { public void configure(WebSecurity web) throws Exception { web.ignoring()// .antMatchers(HttpMethod.GET, PATTERNS_SWAGGER_UI) // - .antMatchers(HttpMethod.GET,"/css/**", "/js/**", "/img/**", "/lib/**"); + .antMatchers(HttpMethod.GET, WEBJAR_PATH + "/css/**", WEBJAR_PATH + "/js/**", WEBJAR_PATH + "/img/**", WEBJAR_PATH + "/lib/**", WEBJAR_PATH + "/assets/**"); } private void configureInMemoryAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/properties/InMemoryAccountProperties.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/configuration/properties/InMemoryAccountProperties.java similarity index 89% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/properties/InMemoryAccountProperties.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/configuration/properties/InMemoryAccountProperties.java index a6905ba..279a079 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/properties/InMemoryAccountProperties.java +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/configuration/properties/InMemoryAccountProperties.java @@ -1,4 +1,4 @@ -package it.fabioformosa.quartzmanager.configuration.properties; +package it.fabioformosa.quartzmanager.security.configuration.properties; import lombok.Getter; import lombok.Setter; diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/properties/JwtSecurityProperties.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/configuration/properties/JwtSecurityProperties.java similarity index 90% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/properties/JwtSecurityProperties.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/configuration/properties/JwtSecurityProperties.java index e33baba..1afec00 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/properties/JwtSecurityProperties.java +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/configuration/properties/JwtSecurityProperties.java @@ -1,4 +1,4 @@ -package it.fabioformosa.quartzmanager.configuration.properties; +package it.fabioformosa.quartzmanager.security.configuration.properties; import lombok.Data; import lombok.Getter; diff --git a/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/controllers/AuthenticationController.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/controllers/AuthenticationController.java new file mode 100644 index 0000000..ca02749 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/controllers/AuthenticationController.java @@ -0,0 +1,82 @@ +package it.fabioformosa.quartzmanager.security.controllers; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import it.fabioformosa.quartzmanager.security.helpers.impl.JwtTokenHelper; +import it.fabioformosa.quartzmanager.security.models.UserTokenState; +import it.fabioformosa.quartzmanager.security.services.impl.CustomUserDetailsService; + +/** + * JWT Temporary disabled + * + * @author Fabio.Formosa + * + */ + +//@RestController +//@RequestMapping( value = "/api", produces = MediaType.APPLICATION_JSON_VALUE ) +public class AuthenticationController { + + static class PasswordChanger { + public String oldPassword; + public String newPassword; + } + + @Autowired + private CustomUserDetailsService userDetailsService; + + @Autowired + JwtTokenHelper tokenHelper; + + @Value("${quartz-manager.security.jwt.expiration-in-sec}") + private int EXPIRES_IN_SEC; + + @Value("${quartz-manager.security.jwt.cookie-strategy-cookie}") + private String TOKEN_COOKIE; + + @RequestMapping(value = "/changePassword", method = RequestMethod.POST) + @PreAuthorize("hasRole('USER')") + public ResponseEntity changePassword(@RequestBody PasswordChanger passwordChanger) { + userDetailsService.changePassword(passwordChanger.oldPassword, passwordChanger.newPassword); + Map result = new HashMap<>(); + result.put( "result", "success" ); + return ResponseEntity.accepted().body(result); + } + + @RequestMapping(value = "/refresh", method = RequestMethod.GET) + public ResponseEntity refreshAuthenticationToken(HttpServletRequest request, HttpServletResponse response) { + + String authToken = tokenHelper.retrieveToken( request ); + if (authToken != null && tokenHelper.canTokenBeRefreshed(authToken)) { + // TODO check user password last update + String refreshedToken = tokenHelper.refreshToken(authToken); + + Cookie authCookie = new Cookie( TOKEN_COOKIE, refreshedToken ); + authCookie.setPath( "/quartz-manager" ); + authCookie.setHttpOnly( true ); + authCookie.setMaxAge( EXPIRES_IN_SEC ); + // Add cookie to response + response.addCookie( authCookie ); + + UserTokenState userTokenState = new UserTokenState(refreshedToken, EXPIRES_IN_SEC); + return ResponseEntity.ok(userTokenState); + } else { + UserTokenState userTokenState = new UserTokenState(); + return ResponseEntity.accepted().body(userTokenState); + } + } + +} diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/LoginConfigurer.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/LoginConfigurer.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/LoginConfigurer.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/LoginConfigurer.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AjaxAuthenticationFilter.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AjaxAuthenticationFilter.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AjaxAuthenticationFilter.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AjaxAuthenticationFilter.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AnonAuthentication.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AnonAuthentication.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AnonAuthentication.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AnonAuthentication.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AuthenticationFailureHandler.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AuthenticationFailureHandler.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AuthenticationFailureHandler.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AuthenticationFailureHandler.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AuthenticationSuccessHandler.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AuthenticationSuccessHandler.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AuthenticationSuccessHandler.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/AuthenticationSuccessHandler.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/ComboEntryPoint.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/ComboEntryPoint.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/ComboEntryPoint.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/ComboEntryPoint.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/FormLoginConfig.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/FormLoginConfig.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/FormLoginConfig.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/FormLoginConfig.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationFilter.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationFilter.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationFilter.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationFilter.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationSuccessHandler.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationSuccessHandler.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationSuccessHandler.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationSuccessHandler.java diff --git a/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationSuccessHandlerImpl.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationSuccessHandlerImpl.java new file mode 100644 index 0000000..ca5de80 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationSuccessHandlerImpl.java @@ -0,0 +1,78 @@ +package it.fabioformosa.quartzmanager.security.helpers.impl; + +import java.io.IOException; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.User; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import it.fabioformosa.quartzmanager.security.configuration.properties.JwtSecurityProperties; +import it.fabioformosa.quartzmanager.security.models.UserTokenState; + +/** + * It depends on @JwtTokenHelper to generate the jwtToken. + * On login success, it generates the jwtToken and it returns it to the login according to possible strategies: cookie, response header. + * You can choice the strategy through @JwtSecurityProperties + * + */ +public class JwtAuthenticationSuccessHandlerImpl implements JwtAuthenticationSuccessHandler { + + private static final Logger log = LoggerFactory.getLogger(JwtAuthenticationSuccessHandlerImpl.class); + + private final JwtSecurityProperties jwtSecurityProps; + + private final JwtTokenHelper jwtTokenHelper; + + private final ObjectMapper objectMapper; + + private final String contextPath; + + @Autowired + public JwtAuthenticationSuccessHandlerImpl(String contextPath, JwtSecurityProperties jwtSecurityProps, JwtTokenHelper jwtTokenHelper, ObjectMapper objectMapper) { + this.contextPath = contextPath; + this.jwtSecurityProps = jwtSecurityProps; + this.jwtTokenHelper = jwtTokenHelper; + this.objectMapper = objectMapper; + } + + @Override + public String cookieMustBeDeletedAtLogout() { + if(!jwtSecurityProps.getCookieStrategy().isEnabled()) + return null; + return jwtSecurityProps.getCookieStrategy().getCookie(); + } + + @Override + public void onLoginSuccess(Authentication authentication, HttpServletResponse response) throws IOException { + log.debug("Login successed, generating jwtToken..."); + + User user = (User) authentication.getPrincipal(); + String jwtToken = jwtTokenHelper.generateToken(user.getUsername()); + + if(jwtSecurityProps.getCookieStrategy().isEnabled()) { + Cookie authCookie = new Cookie(jwtSecurityProps.getCookieStrategy().getCookie(), jwtToken); + authCookie.setHttpOnly(true); + authCookie.setMaxAge((int) jwtSecurityProps.getExpirationInSec()); + authCookie.setPath(contextPath); + response.addCookie(authCookie); + log.debug("Set jwtToken into the cookie {}", jwtSecurityProps.getCookieStrategy().getCookie()); + } + + if(jwtSecurityProps.getHeaderStrategy().isEnabled()) { + jwtTokenHelper.setHeader(response, jwtToken); + log.debug("Set jwtToken into the response header {}", jwtSecurityProps.getHeaderStrategy().getHeader()); + } + + UserTokenState userTokenState = new UserTokenState(jwtToken, jwtSecurityProps.getExpirationInSec()); + String jwtResponse = objectMapper.writeValueAsString(userTokenState); + response.setContentType("application/json"); + response.getWriter().write(jwtResponse); + } +} diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenAuthenticationFilter.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenAuthenticationFilter.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenAuthenticationFilter.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenAuthenticationFilter.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenBasedAuthentication.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenBasedAuthentication.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenBasedAuthentication.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenBasedAuthentication.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenHelper.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenHelper.java similarity index 98% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenHelper.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenHelper.java index a4bc953..679eb57 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenHelper.java +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtTokenHelper.java @@ -17,7 +17,7 @@ import org.slf4j.LoggerFactory; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; -import it.fabioformosa.quartzmanager.configuration.properties.JwtSecurityProperties; +import it.fabioformosa.quartzmanager.security.configuration.properties.JwtSecurityProperties; /** * diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtUsernamePasswordFiterLoginConfig.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtUsernamePasswordFiterLoginConfig.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtUsernamePasswordFiterLoginConfig.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtUsernamePasswordFiterLoginConfig.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/LogoutSuccess.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/LogoutSuccess.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/LogoutSuccess.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/LogoutSuccess.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/QuartzManagerHttpSecurity.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/QuartzManagerHttpSecurity.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/QuartzManagerHttpSecurity.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/QuartzManagerHttpSecurity.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/RESTRequestMatcher.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/RESTRequestMatcher.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/RESTRequestMatcher.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/RESTRequestMatcher.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/RestAuthenticationEntryPoint.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/RestAuthenticationEntryPoint.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/RestAuthenticationEntryPoint.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/RestAuthenticationEntryPoint.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/WebsocketRequestMatcher.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/WebsocketRequestMatcher.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/WebsocketRequestMatcher.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/WebsocketRequestMatcher.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/Authority.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/Authority.java similarity index 93% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/Authority.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/Authority.java index f259933..32a6284 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/Authority.java +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/Authority.java @@ -1,4 +1,4 @@ -package it.fabioformosa.quartzmanager.security.model; +package it.fabioformosa.quartzmanager.security.models; import javax.persistence.Column; import javax.persistence.GeneratedValue; diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/User.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/User.java similarity index 97% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/User.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/User.java index a8d2c41..ba0d58a 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/User.java +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/User.java @@ -1,4 +1,4 @@ -package it.fabioformosa.quartzmanager.security.model; +package it.fabioformosa.quartzmanager.security.models; import java.io.Serializable; import java.util.Collection; diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/UserRequest.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/UserRequest.java similarity index 93% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/UserRequest.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/UserRequest.java index f89e4fd..469df73 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/UserRequest.java +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/UserRequest.java @@ -1,4 +1,4 @@ -package it.fabioformosa.quartzmanager.security.model; +package it.fabioformosa.quartzmanager.security.models; public class UserRequest { diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/UserTokenState.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/UserTokenState.java similarity index 88% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/UserTokenState.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/UserTokenState.java index 39fb1b0..e39cd6b 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/model/UserTokenState.java +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/models/UserTokenState.java @@ -1,4 +1,4 @@ -package it.fabioformosa.quartzmanager.security.model; +package it.fabioformosa.quartzmanager.security.models; public class UserTokenState { private String access_token; diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/repository/AuthorityRepository.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/repositories/AuthorityRepository.java similarity index 78% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/repository/AuthorityRepository.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/repositories/AuthorityRepository.java index 4e41786..5d736c1 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/repository/AuthorityRepository.java +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/repositories/AuthorityRepository.java @@ -1,4 +1,4 @@ -package it.fabioformosa.quartzmanager.security.repository; +package it.fabioformosa.quartzmanager.security.repositories; /** * Temporary disabled diff --git a/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/repositories/UserRepository.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/repositories/UserRepository.java new file mode 100644 index 0000000..6ae1804 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/repositories/UserRepository.java @@ -0,0 +1,11 @@ +package it.fabioformosa.quartzmanager.security.repositories; + +import it.fabioformosa.quartzmanager.security.models.User; + +public interface UserRepository { + User findByUsername( String username ); +} +//public interface UserRepository extends JpaRepository { +// User findByUsername( String username ); +//} + diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/AuthorityService.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/AuthorityService.java similarity index 75% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/AuthorityService.java rename to quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/AuthorityService.java index f2d320c..5eca666 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/AuthorityService.java +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/AuthorityService.java @@ -1,4 +1,4 @@ -package it.fabioformosa.quartzmanager.security.service; +package it.fabioformosa.quartzmanager.security.services; /** * temporary disabled diff --git a/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/UserService.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/UserService.java new file mode 100644 index 0000000..5b66879 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/UserService.java @@ -0,0 +1,18 @@ +package it.fabioformosa.quartzmanager.security.services; + +import java.util.List; + +import it.fabioformosa.quartzmanager.security.models.User; +import it.fabioformosa.quartzmanager.security.models.UserRequest; + +public interface UserService { + List findAll(); + + User findById(Long id); + + User findByUsername(String username); + + void resetCredentials(); + + User save(UserRequest user); +} diff --git a/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/impl/AuthorityServiceImpl.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/impl/AuthorityServiceImpl.java new file mode 100644 index 0000000..78ebaf4 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/impl/AuthorityServiceImpl.java @@ -0,0 +1,33 @@ +package it.fabioformosa.quartzmanager.security.services.impl; + +import it.fabioformosa.quartzmanager.security.services.AuthorityService; + +/** + * Temporary disabled + * @author Fabio + * + */ + +//@Service +public class AuthorityServiceImpl implements AuthorityService { + + // @Autowired + // private AuthorityRepository authorityRepository; + // + // @Override + // public List findById(Long id) { + // Authority auth = this.authorityRepository.getOne(id); + // List auths = new ArrayList<>(); + // auths.add(auth); + // return auths; + // } + // + // @Override + // public List findByname(String name) { + // Authority auth = this.authorityRepository.findByName(name); + // List auths = new ArrayList<>(); + // auths.add(auth); + // return auths; + // } + +} diff --git a/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/impl/CustomUserDetailsService.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/impl/CustomUserDetailsService.java new file mode 100644 index 0000000..f4b7adc --- /dev/null +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/impl/CustomUserDetailsService.java @@ -0,0 +1,67 @@ +package it.fabioformosa.quartzmanager.security.services.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; + +import it.fabioformosa.quartzmanager.security.models.User; +import it.fabioformosa.quartzmanager.security.repositories.UserRepository; + +/** + * Temporary disabled + * @author Fabio + * + */ +//@Service +public class CustomUserDetailsService implements UserDetailsService { + + protected final Log LOGGER = LogFactory.getLog(getClass()); + + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private AuthenticationManager authenticationManager; + + public void changePassword(String oldPassword, String newPassword) { + + // Authentication currentUser = SecurityContextHolder.getContext().getAuthentication(); + // String username = currentUser.getName(); + // + // if (authenticationManager != null) { + // LOGGER.debug("Re-authenticating user '"+ username + "' for password change request."); + // + // authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, oldPassword)); + // } else { + // LOGGER.debug("No authentication manager set. can't change Password!"); + // + // return; + // } + // + // LOGGER.debug("Changing password for user '"+ username + "'"); + // + // User user = (User) loadUserByUsername(username); + // + // user.setPassword(passwordEncoder.encode(newPassword)); + // userRepository.save(user); + + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userRepository.findByUsername(username); + if (user == null) + throw new UsernameNotFoundException(String.format("No user found with username '%s'.", username)); + else + return user; + } + +} diff --git a/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/impl/UserServiceImpl.java b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/impl/UserServiceImpl.java new file mode 100644 index 0000000..9831e6e --- /dev/null +++ b/quartz-manager-parent/quartz-manager-security/src/main/java/it/fabioformosa/quartzmanager/security/services/impl/UserServiceImpl.java @@ -0,0 +1,79 @@ +package it.fabioformosa.quartzmanager.security.services.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; + +import it.fabioformosa.quartzmanager.security.models.User; +import it.fabioformosa.quartzmanager.security.models.UserRequest; +import it.fabioformosa.quartzmanager.security.repositories.UserRepository; +import it.fabioformosa.quartzmanager.security.services.AuthorityService; +import it.fabioformosa.quartzmanager.security.services.UserService; + +/** + * Temporary disabled + * @author Fabio + * + */ +//@Service +public class UserServiceImpl implements UserService { + + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private AuthorityService authService; + + @Override + @PreAuthorize("hasRole('ADMIN')") + public List findAll() throws AccessDeniedException { + // List result = userRepository.findAll(); + // return result; + return null; + } + + @Override + @PreAuthorize("hasRole('ADMIN')") + public User findById(Long id) throws AccessDeniedException { + // User u = userRepository.getOne(id); + // return u; + return null; + } + + @Override + // @PreAuthorize("hasRole('USER')") + public User findByUsername(String username) throws UsernameNotFoundException { + User u = userRepository.findByUsername(username); + return u; + } + + @Override + public void resetCredentials() { + // List users = userRepository.findAll(); + // for (User user : users) { + // user.setPassword(passwordEncoder.encode("123")); + // userRepository.save(user); + // } + } + + @Override + public User save(UserRequest userRequest) { + User user = new User(); + // user.setUsername(userRequest.getUsername()); + // user.setPassword(passwordEncoder.encode(userRequest.getPassword())); + // user.setFirstname(userRequest.getFirstname()); + // user.setLastname(userRequest.getLastname()); + // List auth = authService.findByname("ROLE_USER"); + // user.setAuthorities(auth); + // this.userRepository.save(user); + return user; + } + +} diff --git a/quartz-manager-parent/quartz-manager-security/src/main/resources/META-INF/spring.factories b/quartz-manager-parent/quartz-manager-security/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..9e6be3c --- /dev/null +++ b/quartz-manager-parent/quartz-manager-security/src/main/resources/META-INF/spring.factories @@ -0,0 +1,4 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +it.fabioformosa.quartzmanager.security.configuration.WebSecurityConfigJWT,\ +it.fabioformosa.quartzmanager.security.configuration.properties.JwtSecurityProperties,\ +it.fabioformosa.quartzmanager.security.configuration.properties.InMemoryAccountProperties \ No newline at end of file diff --git a/quartz-manager-parent/quartz-manager-ui-webjar/pom.xml b/quartz-manager-parent/quartz-manager-ui-webjar/pom.xml new file mode 100644 index 0000000..68aeee1 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-ui-webjar/pom.xml @@ -0,0 +1,139 @@ + + + 4.0.0 + + it.fabioformosa.quartz-manager + quartz-manager-parent + 2.2.2-SNAPSHOT + + + quartz-manager-ui-webjar + + Quartz Manager UI webjar + webjar builder for quartz-manager frontend + + https://github.com/fabioformosa/quartz-manager + + ${basedir}/../.. + UTF-8 + UTF-8 + 1.8 + quartz-manager-frontend + v10.16.3 + 6.9.0 + + + + + + + + build-webjar + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + copy-resources + generate-resources + + copy-resources + + + ${basedir}/target/tmp + + + ../../${frontend.folderName} + + static/** + dist/** + node_modules/** + + + + + + + + + + + com.github.eirslett + frontend-maven-plugin + 1.11.0 + + target/tmp + + + + + install node and npm + + install-node-and-npm + + generate-resources + + ${node.version} + ${npm.version} + + + + + npm install + + npm + + process-resources + + install + + + + + npm run build + + npm + + process-resources + + run build + + + + + + + + + maven-antrun-plugin + 1.8 + + + clean build files + process-resources + + + + + + + + + + + run + + + + + + + + + + diff --git a/quartz-manager-parent/quartz-manager-web/.gitignore b/quartz-manager-parent/quartz-manager-web-showcase/.gitignore similarity index 100% rename from quartz-manager-parent/quartz-manager-web/.gitignore rename to quartz-manager-parent/quartz-manager-web-showcase/.gitignore diff --git a/quartz-manager-parent/quartz-manager-web/pom.xml b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml similarity index 88% rename from quartz-manager-parent/quartz-manager-web/pom.xml rename to quartz-manager-parent/quartz-manager-web-showcase/pom.xml index d651cd5..654e9e4 100644 --- a/quartz-manager-parent/quartz-manager-web/pom.xml +++ b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml @@ -9,12 +9,12 @@ 2.2.2-SNAPSHOT - quartz-manager-web + quartz-manager-web-showcase war - Quartz Manager Web - A webapp that imports Quartz Manager API lib + Quartz Manager Web Showcase + A webapp that imports Quartz Manager API lib and the frontend webjar UTF-8 @@ -28,6 +28,14 @@ it.fabioformosa.quartz-manager quartz-manager-api + + it.fabioformosa.quartz-manager + quartz-manager-ui-webjar + + + it.fabioformosa.quartz-manager + quartz-manager-security + diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/QuartManagerApplication.java b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/QuartManagerApplication.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/QuartManagerApplication.java rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/QuartManagerApplication.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/ServletInitializer.java b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/ServletInitializer.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/ServletInitializer.java rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/ServletInitializer.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/QuartzManagerController.java b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/controllers/QuartzManagerController.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/QuartzManagerController.java rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/controllers/QuartzManagerController.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/SessionController.java b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/controllers/SessionController.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/SessionController.java rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/controllers/SessionController.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/jobs/myjobs/SampleJob.java b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/jobs/myjobs/SampleJob.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/jobs/myjobs/SampleJob.java rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/jobs/myjobs/SampleJob.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/jobs/tests/MisfireTestJob.java b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/jobs/tests/MisfireTestJob.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/jobs/tests/MisfireTestJob.java rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/jobs/tests/MisfireTestJob.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/resources/_disabled_import.sql_off b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/_disabled_import.sql_off similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/resources/_disabled_import.sql_off rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/_disabled_import.sql_off diff --git a/quartz-manager-parent/quartz-manager-web/src/main/resources/application.yml b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/application.yml similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/resources/application.yml rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/application.yml diff --git a/quartz-manager-parent/quartz-manager-web/src/main/resources/banner.txt b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/banner.txt similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/resources/banner.txt rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/banner.txt diff --git a/quartz-manager-parent/quartz-manager-web/src/main/resources/logback.xml b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/logback.xml similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/resources/logback.xml rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/logback.xml diff --git a/quartz-manager-parent/quartz-manager-web/src/main/resources/quartz-manager-2-screenshot_800.PNG b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/quartz-manager-2-screenshot_800.PNG similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/resources/quartz-manager-2-screenshot_800.PNG rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/quartz-manager-2-screenshot_800.PNG diff --git a/quartz-manager-parent/quartz-manager-web/src/main/resources/quartz.properties b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/quartz.properties similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/main/resources/quartz.properties rename to quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/quartz.properties diff --git a/quartz-manager-parent/quartz-manager-web/src/test/java/it/fabioformosa/QuartManagerApplicationTests.java b/quartz-manager-parent/quartz-manager-web-showcase/src/test/java/it/fabioformosa/QuartManagerApplicationTests.java similarity index 100% rename from quartz-manager-parent/quartz-manager-web/src/test/java/it/fabioformosa/QuartManagerApplicationTests.java rename to quartz-manager-parent/quartz-manager-web-showcase/src/test/java/it/fabioformosa/QuartManagerApplicationTests.java diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/AuthenticationController.java b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/AuthenticationController.java deleted file mode 100644 index 4b0d704..0000000 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/AuthenticationController.java +++ /dev/null @@ -1,82 +0,0 @@ -package it.fabioformosa.quartzmanager.controllers; - -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -import it.fabioformosa.quartzmanager.security.helpers.impl.JwtTokenHelper; -import it.fabioformosa.quartzmanager.security.model.UserTokenState; -import it.fabioformosa.quartzmanager.security.service.impl.CustomUserDetailsService; - -/** - * JWT Temporary disabled - * - * @author Fabio.Formosa - * - */ - -//@RestController -//@RequestMapping( value = "/api", produces = MediaType.APPLICATION_JSON_VALUE ) -public class AuthenticationController { - - static class PasswordChanger { - public String oldPassword; - public String newPassword; - } - - @Autowired - private CustomUserDetailsService userDetailsService; - - @Autowired - JwtTokenHelper tokenHelper; - - @Value("${quartz-manager.security.jwt.expiration-in-sec}") - private int EXPIRES_IN_SEC; - - @Value("${quartz-manager.security.jwt.cookie-strategy-cookie}") - private String TOKEN_COOKIE; - - @RequestMapping(value = "/changePassword", method = RequestMethod.POST) - @PreAuthorize("hasRole('USER')") - public ResponseEntity changePassword(@RequestBody PasswordChanger passwordChanger) { - userDetailsService.changePassword(passwordChanger.oldPassword, passwordChanger.newPassword); - Map result = new HashMap<>(); - result.put( "result", "success" ); - return ResponseEntity.accepted().body(result); - } - - @RequestMapping(value = "/refresh", method = RequestMethod.GET) - public ResponseEntity refreshAuthenticationToken(HttpServletRequest request, HttpServletResponse response) { - - String authToken = tokenHelper.retrieveToken( request ); - if (authToken != null && tokenHelper.canTokenBeRefreshed(authToken)) { - // TODO check user password last update - String refreshedToken = tokenHelper.refreshToken(authToken); - - Cookie authCookie = new Cookie( TOKEN_COOKIE, refreshedToken ); - authCookie.setPath( "/quartz-manager" ); - authCookie.setHttpOnly( true ); - authCookie.setMaxAge( EXPIRES_IN_SEC ); - // Add cookie to response - response.addCookie( authCookie ); - - UserTokenState userTokenState = new UserTokenState(refreshedToken, EXPIRES_IN_SEC); - return ResponseEntity.ok(userTokenState); - } else { - UserTokenState userTokenState = new UserTokenState(); - return ResponseEntity.accepted().body(userTokenState); - } - } - -} diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationSuccessHandlerImpl.java b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationSuccessHandlerImpl.java deleted file mode 100644 index fee0ede..0000000 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/helpers/impl/JwtAuthenticationSuccessHandlerImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -package it.fabioformosa.quartzmanager.security.helpers.impl; - -import java.io.IOException; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletResponse; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.User; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import it.fabioformosa.quartzmanager.configuration.properties.JwtSecurityProperties; -import it.fabioformosa.quartzmanager.security.model.UserTokenState; - -/** - * It depends on @JwtTokenHelper to generate the jwtToken. - * On login success, it generates the jwtToken and it returns it to the login according to possible strategies: cookie, response header. - * You can choice the strategy through @JwtSecurityProperties - * - */ -public class JwtAuthenticationSuccessHandlerImpl implements JwtAuthenticationSuccessHandler { - - private static final Logger log = LoggerFactory.getLogger(JwtAuthenticationSuccessHandlerImpl.class); - - private final JwtSecurityProperties jwtSecurityProps; - - private final JwtTokenHelper jwtTokenHelper; - - private final ObjectMapper objectMapper; - - private final String contextPath; - - @Autowired - public JwtAuthenticationSuccessHandlerImpl(String contextPath, JwtSecurityProperties jwtSecurityProps, JwtTokenHelper jwtTokenHelper, ObjectMapper objectMapper) { - this.contextPath = contextPath; - this.jwtSecurityProps = jwtSecurityProps; - this.jwtTokenHelper = jwtTokenHelper; - this.objectMapper = objectMapper; - } - - @Override - public String cookieMustBeDeletedAtLogout() { - if(!jwtSecurityProps.getCookieStrategy().isEnabled()) - return null; - return jwtSecurityProps.getCookieStrategy().getCookie(); - } - - @Override - public void onLoginSuccess(Authentication authentication, HttpServletResponse response) throws IOException { - log.debug("Login successed, generating jwtToken..."); - - User user = (User) authentication.getPrincipal(); - String jwtToken = jwtTokenHelper.generateToken(user.getUsername()); - - if(jwtSecurityProps.getCookieStrategy().isEnabled()) { - Cookie authCookie = new Cookie(jwtSecurityProps.getCookieStrategy().getCookie(), jwtToken); - authCookie.setHttpOnly(true); - authCookie.setMaxAge((int) jwtSecurityProps.getExpirationInSec()); - authCookie.setPath(contextPath); - response.addCookie(authCookie); - log.debug("Set jwtToken into the cookie {}", jwtSecurityProps.getCookieStrategy().getCookie()); - } - - if(jwtSecurityProps.getHeaderStrategy().isEnabled()) { - jwtTokenHelper.setHeader(response, jwtToken); - log.debug("Set jwtToken into the response header {}", jwtSecurityProps.getHeaderStrategy().getHeader()); - } - - UserTokenState userTokenState = new UserTokenState(jwtToken, jwtSecurityProps.getExpirationInSec()); - String jwtResponse = objectMapper.writeValueAsString(userTokenState); - response.setContentType("application/json"); - response.getWriter().write(jwtResponse); - } -} diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/repository/UserRepository.java b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/repository/UserRepository.java deleted file mode 100644 index 755d323..0000000 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/repository/UserRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package it.fabioformosa.quartzmanager.security.repository; - -import it.fabioformosa.quartzmanager.security.model.User; - -public interface UserRepository { - User findByUsername( String username ); -} -//public interface UserRepository extends JpaRepository { -// User findByUsername( String username ); -//} - diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/UserService.java b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/UserService.java deleted file mode 100644 index 76dc45c..0000000 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/UserService.java +++ /dev/null @@ -1,18 +0,0 @@ -package it.fabioformosa.quartzmanager.security.service; - -import java.util.List; - -import it.fabioformosa.quartzmanager.security.model.User; -import it.fabioformosa.quartzmanager.security.model.UserRequest; - -public interface UserService { - List findAll(); - - User findById(Long id); - - User findByUsername(String username); - - void resetCredentials(); - - User save(UserRequest user); -} diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/impl/AuthorityServiceImpl.java b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/impl/AuthorityServiceImpl.java deleted file mode 100644 index 8faff51..0000000 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/impl/AuthorityServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package it.fabioformosa.quartzmanager.security.service.impl; - -import it.fabioformosa.quartzmanager.security.service.AuthorityService; - -/** - * Temporary disabled - * @author Fabio - * - */ - -//@Service -public class AuthorityServiceImpl implements AuthorityService { - - // @Autowired - // private AuthorityRepository authorityRepository; - // - // @Override - // public List findById(Long id) { - // Authority auth = this.authorityRepository.getOne(id); - // List auths = new ArrayList<>(); - // auths.add(auth); - // return auths; - // } - // - // @Override - // public List findByname(String name) { - // Authority auth = this.authorityRepository.findByName(name); - // List auths = new ArrayList<>(); - // auths.add(auth); - // return auths; - // } - -} diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/impl/CustomUserDetailsService.java b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/impl/CustomUserDetailsService.java deleted file mode 100644 index cb8ef9e..0000000 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/impl/CustomUserDetailsService.java +++ /dev/null @@ -1,67 +0,0 @@ -package it.fabioformosa.quartzmanager.security.service.impl; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.crypto.password.PasswordEncoder; - -import it.fabioformosa.quartzmanager.security.model.User; -import it.fabioformosa.quartzmanager.security.repository.UserRepository; - -/** - * Temporary disabled - * @author Fabio - * - */ -//@Service -public class CustomUserDetailsService implements UserDetailsService { - - protected final Log LOGGER = LogFactory.getLog(getClass()); - - @Autowired - private UserRepository userRepository; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Autowired - private AuthenticationManager authenticationManager; - - public void changePassword(String oldPassword, String newPassword) { - - // Authentication currentUser = SecurityContextHolder.getContext().getAuthentication(); - // String username = currentUser.getName(); - // - // if (authenticationManager != null) { - // LOGGER.debug("Re-authenticating user '"+ username + "' for password change request."); - // - // authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, oldPassword)); - // } else { - // LOGGER.debug("No authentication manager set. can't change Password!"); - // - // return; - // } - // - // LOGGER.debug("Changing password for user '"+ username + "'"); - // - // User user = (User) loadUserByUsername(username); - // - // user.setPassword(passwordEncoder.encode(newPassword)); - // userRepository.save(user); - - } - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - User user = userRepository.findByUsername(username); - if (user == null) - throw new UsernameNotFoundException(String.format("No user found with username '%s'.", username)); - else - return user; - } - -} diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/impl/UserServiceImpl.java b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/impl/UserServiceImpl.java deleted file mode 100644 index 0e2a90c..0000000 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/security/service/impl/UserServiceImpl.java +++ /dev/null @@ -1,79 +0,0 @@ -package it.fabioformosa.quartzmanager.security.service.impl; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.crypto.password.PasswordEncoder; - -import it.fabioformosa.quartzmanager.security.model.User; -import it.fabioformosa.quartzmanager.security.model.UserRequest; -import it.fabioformosa.quartzmanager.security.repository.UserRepository; -import it.fabioformosa.quartzmanager.security.service.AuthorityService; -import it.fabioformosa.quartzmanager.security.service.UserService; - -/** - * Temporary disabled - * @author Fabio - * - */ -//@Service -public class UserServiceImpl implements UserService { - - @Autowired - private UserRepository userRepository; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Autowired - private AuthorityService authService; - - @Override - @PreAuthorize("hasRole('ADMIN')") - public List findAll() throws AccessDeniedException { - // List result = userRepository.findAll(); - // return result; - return null; - } - - @Override - @PreAuthorize("hasRole('ADMIN')") - public User findById(Long id) throws AccessDeniedException { - // User u = userRepository.getOne(id); - // return u; - return null; - } - - @Override - // @PreAuthorize("hasRole('USER')") - public User findByUsername(String username) throws UsernameNotFoundException { - User u = userRepository.findByUsername(username); - return u; - } - - @Override - public void resetCredentials() { - // List users = userRepository.findAll(); - // for (User user : users) { - // user.setPassword(passwordEncoder.encode("123")); - // userRepository.save(user); - // } - } - - @Override - public User save(UserRequest userRequest) { - User user = new User(); - // user.setUsername(userRequest.getUsername()); - // user.setPassword(passwordEncoder.encode(userRequest.getPassword())); - // user.setFirstname(userRequest.getFirstname()); - // user.setLastname(userRequest.getLastname()); - // List auth = authService.findByname("ROLE_USER"); - // user.setAuthorities(auth); - // this.userRepository.save(user); - return user; - } - -}