diff --git a/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/WebSocketProgressNotifier.java b/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/WebSocketProgressNotifier.java index dcf0b20..74e550b 100644 --- a/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/WebSocketProgressNotifier.java +++ b/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/WebSocketProgressNotifier.java @@ -25,52 +25,52 @@ import it.fabioformosa.quartzmanager.scheduler.TriggerMonitor; @Component public class WebSocketProgressNotifier implements ProgressNotifier { - @Autowired - private SimpMessageSendingOperations messagingTemplate; + @Autowired + private SimpMessageSendingOperations messagingTemplate; - @Resource - private Scheduler scheduler; + @Resource + private Scheduler scheduler; - @Resource - private TriggerMonitor triggerMonitor; + @Resource + private TriggerMonitor triggerMonitor; - //@AfterReturning("execution(* logAndSend(..))") - // @Override - // public void updateProgress(JoinPoint joinPoint) { - // log.info("PROGRESS UPDATE!!!"); - // } + //@AfterReturning("execution(* logAndSend(..))") + // @Override + // public void updateProgress(JoinPoint joinPoint) { + // log.info("PROGRESS UPDATE!!!"); + // } - @Override - public void send() throws SchedulerException { - TriggerStatus currTriggerStatus = new TriggerStatus(); + @Override + public void send() throws SchedulerException { + TriggerStatus currTriggerStatus = new TriggerStatus(); - Trigger trigger = scheduler.getTrigger(triggerMonitor.getTrigger().getKey()); - currTriggerStatus.setFinalFireTime(trigger.getFinalFireTime()); - currTriggerStatus.setNextFireTime(trigger.getNextFireTime()); - currTriggerStatus.setPreviousFireTime(trigger.getPreviousFireTime()); + Trigger trigger = scheduler.getTrigger(triggerMonitor.getTrigger().getKey()); + currTriggerStatus.setFinalFireTime(trigger.getFinalFireTime()); + currTriggerStatus.setNextFireTime(trigger.getNextFireTime()); + currTriggerStatus.setPreviousFireTime(trigger.getPreviousFireTime()); - int timesTriggered = 0; - int repeatCount = 0; + int timesTriggered = 0; + int repeatCount = 0; - if (trigger instanceof SimpleTrigger) { - SimpleTrigger simpleTrigger = (SimpleTrigger) trigger; - timesTriggered = simpleTrigger.getTimesTriggered(); - repeatCount = simpleTrigger.getRepeatCount(); - } else if (trigger instanceof DailyTimeIntervalTrigger) { - DailyTimeIntervalTrigger dailyTrigger = (DailyTimeIntervalTrigger) trigger; - timesTriggered = dailyTrigger.getTimesTriggered(); - repeatCount = dailyTrigger.getRepeatCount(); - } + if (trigger instanceof SimpleTrigger) { + SimpleTrigger simpleTrigger = (SimpleTrigger) trigger; + timesTriggered = simpleTrigger.getTimesTriggered(); + repeatCount = simpleTrigger.getRepeatCount(); + } else if (trigger instanceof DailyTimeIntervalTrigger) { + DailyTimeIntervalTrigger dailyTrigger = (DailyTimeIntervalTrigger) trigger; + timesTriggered = dailyTrigger.getTimesTriggered(); + repeatCount = dailyTrigger.getRepeatCount(); + } - Trigger jobTrigger = triggerMonitor.getTrigger(); - if (jobTrigger != null && jobTrigger.getJobKey() != null) { - currTriggerStatus.setJobKey(jobTrigger.getJobKey().getName()); - currTriggerStatus.setJobClass(jobTrigger.getClass().getSimpleName()); - currTriggerStatus.setTimesTriggered(timesTriggered); - currTriggerStatus.setRepeatCount(repeatCount + 1); - } + Trigger jobTrigger = triggerMonitor.getTrigger(); + if (jobTrigger != null && jobTrigger.getJobKey() != null) { + currTriggerStatus.setJobKey(jobTrigger.getJobKey().getName()); + currTriggerStatus.setJobClass(jobTrigger.getClass().getSimpleName()); + currTriggerStatus.setTimesTriggered(timesTriggered); + currTriggerStatus.setRepeatCount(repeatCount + 1); + } - messagingTemplate.convertAndSend("/topic/progress", currTriggerStatus); - } + messagingTemplate.convertAndSend("/topic/progress", currTriggerStatus); + } } diff --git a/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/configuration/WebsocketConfig.java b/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/configuration/WebsocketConfig.java index 89aca46..47f5d07 100644 --- a/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/configuration/WebsocketConfig.java +++ b/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/configuration/WebsocketConfig.java @@ -20,8 +20,8 @@ public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { - registry.addEndpoint("/logs").setAllowedOrigins("/**").withSockJS(); - registry.addEndpoint("/progress").setAllowedOrigins("/**").withSockJS(); + registry.addEndpoint("/quartz-manager/logs").setAllowedOrigins("/**").withSockJS(); + registry.addEndpoint("/quartz-manager/progress").setAllowedOrigins("/**").withSockJS(); } } diff --git a/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java b/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java index 35242fc..1c05451 100644 --- a/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java +++ b/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java @@ -36,119 +36,119 @@ import it.fabioformosa.quartzmanager.scheduler.TriggerMonitor; * */ @RestController -@RequestMapping("/scheduler") +@RequestMapping("/quartz-manager/scheduler") @Api(value = "scheduler") public class SchedulerController { - private static final int MILLS_IN_A_DAY = 1000 * 60 * 60 * 24; - private static final int SEC_IN_A_DAY = 60 * 60 * 24; + private static final int MILLS_IN_A_DAY = 1000 * 60 * 60 * 24; + private static final int SEC_IN_A_DAY = 60 * 60 * 24; - private final Logger log = LoggerFactory.getLogger(SchedulerController.class); + private final Logger log = LoggerFactory.getLogger(SchedulerController.class); - @Resource - private Scheduler scheduler; + @Resource + private Scheduler scheduler; - @Resource - private TriggerMonitor triggerMonitor; + @Resource + private TriggerMonitor triggerMonitor; - @GetMapping("/config") - public SchedulerConfigParam getConfig() { - log.debug("SCHEDULER - GET CONFIG params"); - SimpleTrigger simpleTrigger = (SimpleTrigger) triggerMonitor.getTrigger(); + private long fromMillsIntervalToTriggerPerDay(long repeatIntervalInMills) { + return (int) Math.ceil(MILLS_IN_A_DAY / repeatIntervalInMills); + } - int maxCount = simpleTrigger.getRepeatCount() + 1; - long triggersPerDay = fromMillsIntervalToTriggerPerDay(simpleTrigger.getRepeatInterval()); + private int fromTriggerPerDayToMillsInterval(long triggerPerDay) { + return (int) Math.ceil(Long.valueOf(MILLS_IN_A_DAY) / triggerPerDay); // with ceil the triggerPerDay is a max value + } - return new SchedulerConfigParam(triggersPerDay, maxCount); - } + @SuppressWarnings("unused") + private int fromTriggerPerDayToSecInterval(long triggerPerDay) { + return (int) Math.ceil(Long.valueOf(SEC_IN_A_DAY) / triggerPerDay); + } - @GetMapping("/progress") - public TriggerStatus getProgressInfo() throws SchedulerException { - log.trace("SCHEDULER - GET PROGRESS INFO"); - TriggerStatus progress = new TriggerStatus(); + @GetMapping("/config") + public SchedulerConfigParam getConfig() { + log.debug("SCHEDULER - GET CONFIG params"); + SimpleTrigger simpleTrigger = (SimpleTrigger) triggerMonitor.getTrigger(); - SimpleTriggerImpl jobTrigger = (SimpleTriggerImpl) scheduler.getTrigger(triggerMonitor.getTrigger().getKey()); - if (jobTrigger != null && jobTrigger.getJobKey() != null) { - progress.setJobKey(jobTrigger.getJobKey().getName()); - progress.setJobClass(jobTrigger.getClass().getSimpleName()); - progress.setTimesTriggered(jobTrigger.getTimesTriggered()); - progress.setRepeatCount(jobTrigger.getRepeatCount()); - progress.setFinalFireTime(jobTrigger.getFinalFireTime()); - progress.setNextFireTime(jobTrigger.getNextFireTime()); - progress.setPreviousFireTime(jobTrigger.getPreviousFireTime()); - } + int maxCount = simpleTrigger.getRepeatCount() + 1; + long triggersPerDay = fromMillsIntervalToTriggerPerDay(simpleTrigger.getRepeatInterval()); - return progress; - } + return new SchedulerConfigParam(triggersPerDay, maxCount); + } - @GetMapping(produces = "application/json") - public Map getStatus() throws SchedulerException { - log.trace("SCHEDULER - GET STATUS"); - String schedulerState = ""; - if (scheduler.isShutdown() || !scheduler.isStarted()) - schedulerState = SchedulerStates.STOPPED.toString(); - else if (scheduler.isStarted() && scheduler.isInStandbyMode()) - schedulerState = SchedulerStates.PAUSED.toString(); - else - schedulerState = SchedulerStates.RUNNING.toString(); - return Collections.singletonMap("data", schedulerState.toLowerCase()); - } + @GetMapping("/progress") + public TriggerStatus getProgressInfo() throws SchedulerException { + log.trace("SCHEDULER - GET PROGRESS INFO"); + TriggerStatus progress = new TriggerStatus(); - @GetMapping("/pause") - @ResponseStatus(HttpStatus.NO_CONTENT) - public void pause() throws SchedulerException { - log.info("SCHEDULER - PAUSE COMMAND"); - scheduler.standby(); - } + SimpleTriggerImpl jobTrigger = (SimpleTriggerImpl) scheduler.getTrigger(triggerMonitor.getTrigger().getKey()); + if (jobTrigger != null && jobTrigger.getJobKey() != null) { + progress.setJobKey(jobTrigger.getJobKey().getName()); + progress.setJobClass(jobTrigger.getClass().getSimpleName()); + progress.setTimesTriggered(jobTrigger.getTimesTriggered()); + progress.setRepeatCount(jobTrigger.getRepeatCount()); + progress.setFinalFireTime(jobTrigger.getFinalFireTime()); + progress.setNextFireTime(jobTrigger.getNextFireTime()); + progress.setPreviousFireTime(jobTrigger.getPreviousFireTime()); + } - @PostMapping("/config") - public SchedulerConfigParam postConfig(@RequestBody SchedulerConfigParam config) throws SchedulerException { - log.info("SCHEDULER - NEW CONFIG {}", config); - SimpleTrigger trigger = (SimpleTrigger) triggerMonitor.getTrigger(); + return progress; + } - TriggerBuilder triggerBuilder = trigger.getTriggerBuilder(); + @GetMapping(produces = "application/json") + public Map getStatus() throws SchedulerException { + log.trace("SCHEDULER - GET STATUS"); + String schedulerState = ""; + if (scheduler.isShutdown() || !scheduler.isStarted()) + schedulerState = SchedulerStates.STOPPED.toString(); + else if (scheduler.isStarted() && scheduler.isInStandbyMode()) + schedulerState = SchedulerStates.PAUSED.toString(); + else + schedulerState = SchedulerStates.RUNNING.toString(); + return Collections.singletonMap("data", schedulerState.toLowerCase()); + } - int intervalInMills = fromTriggerPerDayToMillsInterval(config.getTriggerPerDay()); - Trigger newTrigger = triggerBuilder.withSchedule(SimpleScheduleBuilder.simpleSchedule() - .withIntervalInMilliseconds(intervalInMills).withRepeatCount(config.getMaxCount() - 1)).build(); + @GetMapping("/pause") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void pause() throws SchedulerException { + log.info("SCHEDULER - PAUSE COMMAND"); + scheduler.standby(); + } - scheduler.rescheduleJob(triggerMonitor.getTrigger().getKey(), newTrigger); - triggerMonitor.setTrigger(newTrigger); - return config; - } + @PostMapping("/config") + public SchedulerConfigParam postConfig(@RequestBody SchedulerConfigParam config) throws SchedulerException { + log.info("SCHEDULER - NEW CONFIG {}", config); + SimpleTrigger trigger = (SimpleTrigger) triggerMonitor.getTrigger(); - @GetMapping("/resume") - @ResponseStatus(HttpStatus.NO_CONTENT) - public void resume() throws SchedulerException { - log.info("SCHEDULER - RESUME COMMAND"); - scheduler.start(); - } + TriggerBuilder triggerBuilder = trigger.getTriggerBuilder(); - @GetMapping("/run") - @ResponseStatus(HttpStatus.NO_CONTENT) - public void run() throws SchedulerException { - log.info("SCHEDULER - START COMMAND"); - scheduler.start(); - } + int intervalInMills = fromTriggerPerDayToMillsInterval(config.getTriggerPerDay()); + Trigger newTrigger = triggerBuilder.withSchedule(SimpleScheduleBuilder.simpleSchedule() + .withIntervalInMilliseconds(intervalInMills).withRepeatCount(config.getMaxCount() - 1)).build(); - @GetMapping("/stop") - @ResponseStatus(HttpStatus.NO_CONTENT) - public void stop() throws SchedulerException { - log.info("SCHEDULER - STOP COMMAND"); - scheduler.shutdown(true); - } + scheduler.rescheduleJob(triggerMonitor.getTrigger().getKey(), newTrigger); + triggerMonitor.setTrigger(newTrigger); + return config; + } - private long fromMillsIntervalToTriggerPerDay(long repeatIntervalInMills) { - return (int) Math.ceil(MILLS_IN_A_DAY / repeatIntervalInMills); - } + @GetMapping("/resume") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void resume() throws SchedulerException { + log.info("SCHEDULER - RESUME COMMAND"); + scheduler.start(); + } - private int fromTriggerPerDayToMillsInterval(long triggerPerDay) { - return (int) Math.ceil(Long.valueOf(MILLS_IN_A_DAY) / triggerPerDay); // with ceil the triggerPerDay is a max value - } + @GetMapping("/run") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void run() throws SchedulerException { + log.info("SCHEDULER - START COMMAND"); + scheduler.start(); + } - @SuppressWarnings("unused") - private int fromTriggerPerDayToSecInterval(long triggerPerDay) { - return (int) Math.ceil(Long.valueOf(SEC_IN_A_DAY) / triggerPerDay); - } + @GetMapping("/stop") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void stop() throws SchedulerException { + log.info("SCHEDULER - STOP COMMAND"); + scheduler.shutdown(true); + } } diff --git a/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/WebsocketController.java b/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/WebsocketController.java index 5ecdb36..ab53b6b 100644 --- a/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/WebsocketController.java +++ b/quartz-manager-parent/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/WebsocketController.java @@ -7,10 +7,10 @@ import org.springframework.stereotype.Controller; @Controller public class WebsocketController { - @MessageMapping({ "/logs", "/progress" }) - @SendTo("/topic/logs") - public String subscribe() throws Exception { - return "subscribed"; - } + @MessageMapping({ "/quartz-manager/logs", "/quartz-manager/progress" }) + @SendTo("/topic/logs") + public String subscribe() throws Exception { + return "subscribed"; + } } diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/WebSecurityConfigJWT.java b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/WebSecurityConfigJWT.java index d264134..c3e2d8c 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/WebSecurityConfigJWT.java +++ b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/configuration/WebSecurityConfigJWT.java @@ -37,9 +37,9 @@ import it.fabioformosa.quartzmanager.security.helpers.impl.JwtAuthenticationSucc import it.fabioformosa.quartzmanager.security.helpers.impl.JwtAuthenticationSuccessHandlerImpl; import it.fabioformosa.quartzmanager.security.helpers.impl.JwtTokenAuthenticationFilter; import it.fabioformosa.quartzmanager.security.helpers.impl.JwtTokenHelper; -import it.fabioformosa.quartzmanager.security.helpers.impl.QuartzManagerHttpSecurity; import it.fabioformosa.quartzmanager.security.helpers.impl.JwtUsernamePasswordFiterLoginConfig; import it.fabioformosa.quartzmanager.security.helpers.impl.LogoutSuccess; +import it.fabioformosa.quartzmanager.security.helpers.impl.QuartzManagerHttpSecurity; /** * @@ -51,142 +51,142 @@ import it.fabioformosa.quartzmanager.security.helpers.impl.LogoutSuccess; @EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfigJWT extends WebSecurityConfigurerAdapter { - private static final String[] PATTERNS_SWAGGER_UI = {"/swagger-ui.html", "/v2/api-docs", "/swagger-resources/**", "/webjars/**"}; + private static final String[] PATTERNS_SWAGGER_UI = {"/swagger-ui.html", "/v2/api-docs", "/swagger-resources/**", "/webjars/**"}; - private static final String LOGIN_PATH = "/api/login"; - private static final String LOGOUT_PATH = "/api/logout"; + 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 String contextPath; + @Value("${server.servlet.context-path}") + private String contextPath; - @Value("${app.name}") - private String APP_NAME; + @Value("${app.name}") + private String APP_NAME; - @Value("${quartz-manager.security.login-model.form-login-enabled}") - private Boolean formLoginEnabled; - @Value("${quartz-manager.security.login-model.userpwd-filter-enabled}") - private Boolean userpwdFilterEnabled; + @Value("${quartz-manager.security.login-model.form-login-enabled}") + private Boolean formLoginEnabled; + @Value("${quartz-manager.security.login-model.userpwd-filter-enabled}") + private Boolean userpwdFilterEnabled; - @Autowired - private JwtSecurityProperties jwtSecurityProps; + @Autowired + private JwtSecurityProperties jwtSecurityProps; - @Autowired - private ObjectMapper objectMapper; + @Autowired + private ObjectMapper objectMapper; - @Autowired - private UserDetailsService userDetailsService; + @Autowired + private UserDetailsService userDetailsService; - @Autowired - private InMemoryAccountProperties inMemoryAccountProps; + @Autowired + private InMemoryAccountProperties inMemoryAccountProps; - @Override - public void configure(AuthenticationManagerBuilder authenticationManagerBuilder)throws Exception { - configureInMemoryAuthentication(authenticationManagerBuilder); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.csrf().disable() // - .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() // - .exceptionHandling().authenticationEntryPoint(restAuthEntryPoint()).and() // - .addFilterBefore(jwtAuthenticationTokenFilter(), BasicAuthenticationFilter.class) // - .authorizeRequests().anyRequest().authenticated(); - - QuartzManagerHttpSecurity.from(http).withLoginConfigurer(loginConfigurer(), logoutConfigurer()) // - .login(LOGIN_PATH, authenticationManager()).logout(LOGOUT_PATH); - - // temporary disabled csfr - // http.csrf().ignoringAntMatchers("/api/login", "/api/signup") // - // .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) // - } - - @Override - public void configure(WebSecurity web) throws Exception { - web.ignoring()// - .antMatchers(HttpMethod.GET, PATTERNS_SWAGGER_UI) // - .antMatchers(HttpMethod.GET,"/css/**", "/js/**", "/img/**", "/lib/**"); - } - - private void configureInMemoryAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { - PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); - if(inMemoryAccountProps.isEnabled() && inMemoryAccountProps.getUsers() != null && !inMemoryAccountProps.getUsers().isEmpty()) { - InMemoryUserDetailsManagerConfigurer inMemoryAuth = authenticationManagerBuilder.inMemoryAuthentication(); - inMemoryAccountProps.getUsers() - .forEach(u -> inMemoryAuth - .withUser(u.getName()) - .password(encoder.encode(u.getPassword())) - .roles(u.getRoles().toArray(new String[0]))); + @Override + public void configure(AuthenticationManagerBuilder authenticationManagerBuilder)throws Exception { + configureInMemoryAuthentication(authenticationManagerBuilder); } - } - @Bean - CorsConfigurationSource corsConfigurationSource() { - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues()); - return source; - } + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf().disable() // + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() // + .exceptionHandling().authenticationEntryPoint(restAuthEntryPoint()).and() // + .addFilterBefore(jwtAuthenticationTokenFilter(), BasicAuthenticationFilter.class) // + .authorizeRequests().anyRequest().authenticated(); - @Bean - public LoginConfigurer formLoginConfigurer() { - JwtAuthenticationSuccessHandler jwtAuthenticationSuccessHandler = jwtAuthenticationSuccessHandler(); - AuthenticationSuccessHandler authenticationSuccessHandler = new AuthenticationSuccessHandler(jwtAuthenticationSuccessHandler); - AuthenticationFailureHandler authenticationFailureHandler = new AuthenticationFailureHandler(); - LoginConfigurer loginConfigurer = new FormLoginConfig(authenticationSuccessHandler, authenticationFailureHandler); - return loginConfigurer; - } + QuartzManagerHttpSecurity.from(http).withLoginConfigurer(loginConfigurer(), logoutConfigurer()) // + .login(LOGIN_PATH, authenticationManager()).logout(LOGOUT_PATH); - @Bean - public JwtAuthenticationSuccessHandler jwtAuthenticationSuccessHandler() { - JwtTokenHelper jwtTokenHelper = jwtTokenHelper(); - JwtAuthenticationSuccessHandler jwtAuthenticationSuccessHandler = new JwtAuthenticationSuccessHandlerImpl(contextPath, jwtSecurityProps, jwtTokenHelper, objectMapper); - return jwtAuthenticationSuccessHandler; - } + // temporary disabled csfr + // http.csrf().ignoringAntMatchers("/api/login", "/api/signup") // + // .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) // + } - @Bean - public JwtTokenAuthenticationFilter jwtAuthenticationTokenFilter() throws Exception { - return new JwtTokenAuthenticationFilter(jwtTokenHelper(), userDetailsService); - } + @Override + public void configure(WebSecurity web) throws Exception { + web.ignoring()// + .antMatchers(HttpMethod.GET, PATTERNS_SWAGGER_UI) // + .antMatchers(HttpMethod.GET,"/css/**", "/js/**", "/img/**", "/lib/**"); + } - @Bean - public JwtTokenHelper jwtTokenHelper() { - return new JwtTokenHelper(APP_NAME, jwtSecurityProps); - } + private void configureInMemoryAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { + PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); + if(inMemoryAccountProps.isEnabled() && inMemoryAccountProps.getUsers() != null && !inMemoryAccountProps.getUsers().isEmpty()) { + InMemoryUserDetailsManagerConfigurer inMemoryAuth = authenticationManagerBuilder.inMemoryAuthentication(); + inMemoryAccountProps.getUsers() + .forEach(u -> inMemoryAuth + .withUser(u.getName()) + .password(encoder.encode(u.getPassword())) + .roles(u.getRoles().toArray(new String[0]))); + } + } - @Bean - public LoginConfigurer loginConfigurer() { - if(BooleanUtils.isTrue(userpwdFilterEnabled)) - return userpwdFilterLoginConfigurer(); - if(BooleanUtils.isNotFalse(formLoginEnabled)) - return formLoginConfigurer(); - throw new RuntimeException("No login configurer enabled!"); - } + @Bean + CorsConfigurationSource corsConfigurationSource() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues()); + return source; + } - @Bean - public LogoutSuccess logoutConfigurer() { - return new LogoutSuccess(objectMapper); - } + @Bean + public LoginConfigurer formLoginConfigurer() { + JwtAuthenticationSuccessHandler jwtAuthenticationSuccessHandler = jwtAuthenticationSuccessHandler(); + AuthenticationSuccessHandler authenticationSuccessHandler = new AuthenticationSuccessHandler(jwtAuthenticationSuccessHandler); + AuthenticationFailureHandler authenticationFailureHandler = new AuthenticationFailureHandler(); + LoginConfigurer loginConfigurer = new FormLoginConfig(authenticationSuccessHandler, authenticationFailureHandler); + return loginConfigurer; + } - @Bean - public AuthenticationEntryPoint restAuthEntryPoint() { - return new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED); - } + @Bean + public JwtAuthenticationSuccessHandler jwtAuthenticationSuccessHandler() { + JwtTokenHelper jwtTokenHelper = jwtTokenHelper(); + JwtAuthenticationSuccessHandler jwtAuthenticationSuccessHandler = new JwtAuthenticationSuccessHandlerImpl(contextPath, jwtSecurityProps, jwtTokenHelper, objectMapper); + return jwtAuthenticationSuccessHandler; + } - @Bean - @Override - public UserDetailsService userDetailsServiceBean() throws Exception { - return super.userDetailsServiceBean(); - } + @Bean + public JwtTokenAuthenticationFilter jwtAuthenticationTokenFilter() throws Exception { + return new JwtTokenAuthenticationFilter(jwtTokenHelper(), userDetailsService); + } - @Bean - public LoginConfigurer userpwdFilterLoginConfigurer() { - LoginConfigurer loginConfigurer = new JwtUsernamePasswordFiterLoginConfig(jwtAuthenticationSuccessHandler()); - return loginConfigurer; - } + @Bean + public JwtTokenHelper jwtTokenHelper() { + return new JwtTokenHelper(APP_NAME, jwtSecurityProps); + } - // @Bean - // public PasswordEncoder passwordEncoder() { - // return new BCryptPasswordEncoder(); - // } + @Bean + public LoginConfigurer loginConfigurer() { + if(BooleanUtils.isTrue(userpwdFilterEnabled)) + return userpwdFilterLoginConfigurer(); + if(BooleanUtils.isNotFalse(formLoginEnabled)) + return formLoginConfigurer(); + throw new RuntimeException("No login configurer enabled!"); + } + + @Bean + public LogoutSuccess logoutConfigurer() { + return new LogoutSuccess(objectMapper); + } + + @Bean + public AuthenticationEntryPoint restAuthEntryPoint() { + return new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED); + } + + @Bean + @Override + public UserDetailsService userDetailsServiceBean() throws Exception { + return super.userDetailsServiceBean(); + } + + @Bean + public LoginConfigurer userpwdFilterLoginConfigurer() { + LoginConfigurer loginConfigurer = new JwtUsernamePasswordFiterLoginConfig(jwtAuthenticationSuccessHandler()); + return loginConfigurer; + } + + // @Bean + // public PasswordEncoder passwordEncoder() { + // return new BCryptPasswordEncoder(); + // } } diff --git a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java index 6d123d7..5df6496 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java +++ b/quartz-manager-parent/quartz-manager-web/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java @@ -8,66 +8,66 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping(value = "/api", produces = MediaType.APPLICATION_JSON_VALUE) +@RequestMapping(value = "/quartz-manager/api", produces = MediaType.APPLICATION_JSON_VALUE) public class UserController { - /** - * JWT Temporary disabled - * - * @author Fabio.Formosa - * - */ + /** + * JWT Temporary disabled + * + * @author Fabio.Formosa + * + */ - // @Autowired - // private UserService userService; + // @Autowired + // private UserService userService; - // @RequestMapping(method = POST, value = "/signup") - // public ResponseEntity addUser(@RequestBody UserRequest userRequest, - // UriComponentsBuilder ucBuilder) { - // - // User existUser = this.userService.findByUsername(userRequest.getUsername()); - // if (existUser != null) - // throw new ResourceConflictException(userRequest.getId(), "Username already exists"); - // User user = this.userService.save(userRequest); - // HttpHeaders headers = new HttpHeaders(); - // headers.setLocation(ucBuilder.path("/api/user/{userId}").buildAndExpand(user.getId()).toUri()); - // return new ResponseEntity<>(user, HttpStatus.CREATED); - // } - // - // @RequestMapping(method = GET, value = "/user/all") - // public List loadAll() { - // return this.userService.findAll(); - // } - // - // @RequestMapping(method = GET, value = "/user/{userId}") - // public User loadById(@PathVariable Long userId) { - // return this.userService.findById(userId); - // } - // - // - // @RequestMapping(method = GET, value = "/user/reset-credentials") - // public ResponseEntity resetCredentials() { - // this.userService.resetCredentials(); - // Map result = new HashMap<>(); - // result.put("result", "success"); - // return ResponseEntity.accepted().body(result); - // } + // @RequestMapping(method = POST, value = "/signup") + // public ResponseEntity addUser(@RequestBody UserRequest userRequest, + // UriComponentsBuilder ucBuilder) { + // + // User existUser = this.userService.findByUsername(userRequest.getUsername()); + // if (existUser != null) + // throw new ResourceConflictException(userRequest.getId(), "Username already exists"); + // User user = this.userService.save(userRequest); + // HttpHeaders headers = new HttpHeaders(); + // headers.setLocation(ucBuilder.path("/api/user/{userId}").buildAndExpand(user.getId()).toUri()); + // return new ResponseEntity<>(user, HttpStatus.CREATED); + // } + // + // @RequestMapping(method = GET, value = "/user/all") + // public List loadAll() { + // return this.userService.findAll(); + // } + // + // @RequestMapping(method = GET, value = "/user/{userId}") + // public User loadById(@PathVariable Long userId) { + // return this.userService.findById(userId); + // } + // + // + // @RequestMapping(method = GET, value = "/user/reset-credentials") + // public ResponseEntity resetCredentials() { + // this.userService.resetCredentials(); + // Map result = new HashMap<>(); + // result.put("result", "success"); + // 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(); - // } + /* + * 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(); - } + @GetMapping("/whoami") + @PreAuthorize("isAuthenticated()") + public Object user() { + return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + } } diff --git a/quartz-manager-parent/quartz-manager-web/src/main/resources/application.yml b/quartz-manager-parent/quartz-manager-web/src/main/resources/application.yml index f69a691..c2115fa 100644 --- a/quartz-manager-parent/quartz-manager-web/src/main/resources/application.yml +++ b/quartz-manager-parent/quartz-manager-web/src/main/resources/application.yml @@ -1,6 +1,6 @@ server: servlet: - context-path: /quartz-manager + context-path: / session.timeout : 28800 port: 8080