diff --git a/view/pom.xml b/view/pom.xml index 9aa1558309..d9bcb9393a 100644 --- a/view/pom.xml +++ b/view/pom.xml @@ -107,6 +107,14 @@ <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-config</artifactId> + </dependency> <!-- Servlet API, needed for compilation. --> <dependency> diff --git a/view/src/main/java/ApplicationBootstrap.java b/view/src/main/java/ApplicationBootstrap.java index 3bab9cef41..7b4897a09d 100644 --- a/view/src/main/java/ApplicationBootstrap.java +++ b/view/src/main/java/ApplicationBootstrap.java @@ -6,21 +6,32 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRegistration; import org.apache.wicket.protocol.http.WicketFilter; import org.apache.wicket.spring.injection.annot.SpringComponentInjector; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.orm.jpa.LocalEntityManagerFactoryBean; import org.springframework.orm.jpa.SharedEntityManagerCreator; import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.filter.DelegatingFilterProxy; import org.springframework.web.servlet.DispatcherServlet; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; import se.su.dsv.scipro.SciProApplication; import se.su.dsv.scipro.daisyExternal.http.DaisyAPI; import se.su.dsv.scipro.daisyExternal.http.DaisyAPIImpl; @@ -84,7 +95,6 @@ public class ApplicationBootstrap implements WebApplicationInitializer { webApplicationContext.register(SciProApplication.class); webApplicationContext.register(CurrentProfile.class); webApplicationContext.register(Config.class); - webApplicationContext.scan("se.su.dsv.scipro.api"); webApplicationContext.refresh(); servletContext.addListener(new ContextLoaderListener(webApplicationContext)); @@ -102,8 +112,48 @@ public class ApplicationBootstrap implements WebApplicationInitializer { servletContext.addFilter("wicket-filter", filter) .addMappingForUrlPatterns(null, true, "/*"); - servletContext.addServlet("spring-web", new DispatcherServlet(webApplicationContext)) - .addMapping("/api/*"); + AnnotationConfigWebApplicationContext dispatcherApplicationContext = new AnnotationConfigWebApplicationContext(); + dispatcherApplicationContext.register(WebConfig.class); + dispatcherApplicationContext.setParent(webApplicationContext); + dispatcherApplicationContext.setServletContext(servletContext); + + ServletRegistration.Dynamic dispatcher = servletContext.addServlet( + "spring-web", + new DispatcherServlet(dispatcherApplicationContext)); + dispatcher.setLoadOnStartup(1); + dispatcher.addMapping("/api/*"); + + DelegatingFilterProxy springSecurityFilterChain = new DelegatingFilterProxy("springSecurityFilterChain", dispatcherApplicationContext); + servletContext.addFilter("spring-security-filter", springSecurityFilterChain) + .addMappingForServletNames(null, false, "spring-web"); + } + + @Configuration + @EnableWebMvc + @EnableWebSecurity + @ComponentScan("se.su.dsv.scipro.api") + public static class WebConfig { + @Bean + public SecurityFilterChain basicAuth(HttpSecurity http) + throws Exception + { + return http + .httpBasic(Customizer.withDefaults()) + .authorizeHttpRequests(authorize -> authorize + .anyRequest().authenticated()) + .build(); + } + + @Bean + public UserDetailsService userDetailsService() { + UserDetails userDetails = org.springframework.security.core.userdetails.User.withDefaultPasswordEncoder() + .username("user") + .password("password") + .roles("USER") + .build(); + + return new InMemoryUserDetailsManager(userDetails); + } } @Configuration