diff --git a/build.gradle b/build.gradle index 8f6234b..7719bd2 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-data-rest' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.security:spring-security-core' implementation 'org.springframework.security:spring-security-web' @@ -39,7 +40,8 @@ dependencies { implementation 'org.hibernate.orm:hibernate-community-dialects' implementation 'org.xerial:sqlite-jdbc:3.46.1.3' - + implementation 'com.h2database:h2' + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' diff --git a/src/main/java/ru/lionarius/isdojplab/config/SecurityConfig.java b/src/main/java/ru/lionarius/isdojplab/config/SecurityConfig.java index d46969d..187dd3e 100644 --- a/src/main/java/ru/lionarius/isdojplab/config/SecurityConfig.java +++ b/src/main/java/ru/lionarius/isdojplab/config/SecurityConfig.java @@ -6,6 +6,7 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.ProviderManager; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -19,21 +20,18 @@ public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http.authorizeHttpRequests(auth -> auth + http.csrf(AbstractHttpConfigurer::disable) + .authorizeHttpRequests(auth -> auth .requestMatchers("/").permitAll() .requestMatchers("/login").permitAll() .requestMatchers("/register").permitAll() .requestMatchers("/logout").permitAll() +// .requestMatchers("/api/**").permitAll() .requestMatchers("/css/**").permitAll() .requestMatchers("/js/**").permitAll() .anyRequest().authenticated() ); -// http.formLogin(form -> form -// .loginPage("/login") -// .loginProcessingUrl("/login") -// .usernameParameter("email") -// .failureHandler(authenticationFailureHandler()) -// .permitAll()); + http.exceptionHandling(exception -> exception.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"))); http.logout(logout -> logout.logoutSuccessUrl("/").permitAll()); diff --git a/src/main/java/ru/lionarius/isdojplab/config/StoreProperties.java b/src/main/java/ru/lionarius/isdojplab/config/StoreProperties.java new file mode 100644 index 0000000..40b0edd --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/config/StoreProperties.java @@ -0,0 +1,13 @@ +package ru.lionarius.isdojplab.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "store") +public class StoreProperties { + private String name = "Магазин электротоваров"; + private String description = "Все для вашего дома и офиса"; +} diff --git a/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java b/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java index b06f267..887e76b 100644 --- a/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java +++ b/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java @@ -9,8 +9,11 @@ import ru.lionarius.isdojplab.repository.ProductRepository; @Controller public class HomeController { - @Autowired - private ProductRepository productRepository; + private final ProductRepository productRepository; + + public HomeController(ProductRepository productRepository) { + this.productRepository = productRepository; + } @GetMapping("/") public String home(Model model) { diff --git a/src/main/java/ru/lionarius/isdojplab/controller/LoginFormController.java b/src/main/java/ru/lionarius/isdojplab/controller/LoginFormController.java index 1f87085..968553b 100644 --- a/src/main/java/ru/lionarius/isdojplab/controller/LoginFormController.java +++ b/src/main/java/ru/lionarius/isdojplab/controller/LoginFormController.java @@ -35,14 +35,6 @@ public class LoginFormController { return "login_form"; } -// @PostMapping("/login") -// public String submitForm(@RequestParam String email, @RequestParam String password) { -// System.out.println(email); -// System.out.println(password); -// -// return "redirect:/"; -// } - @PostMapping("/login") public String submitForm(@ModelAttribute("user") User user, BindingResult bindingResult, Model model, HttpSession httpSession) { if (bindingResult.hasErrors()) { diff --git a/src/main/java/ru/lionarius/isdojplab/rest/UserEventHandler.java b/src/main/java/ru/lionarius/isdojplab/rest/UserEventHandler.java new file mode 100644 index 0000000..b6533bc --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/rest/UserEventHandler.java @@ -0,0 +1,35 @@ +package ru.lionarius.isdojplab.rest; + +import org.springframework.data.rest.core.annotation.HandleBeforeCreate; +import org.springframework.data.rest.core.annotation.HandleBeforeSave; +import org.springframework.data.rest.core.annotation.RepositoryEventHandler; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; +import ru.lionarius.isdojplab.model.User; + +@Component +@RepositoryEventHandler +public class UserEventHandler { + + private final PasswordEncoder passwordEncoder; + + public UserEventHandler(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + @HandleBeforeCreate + public void handleBeforeCreate(User user) { + encodePassword(user); + } + + @HandleBeforeSave + public void handleBeforeSave(User user) { + encodePassword(user); + } + + private void encodePassword(User user) { + if (user.getPassword() != null) { + user.setPassword(passwordEncoder.encode(user.getPassword())); + } + } +} diff --git a/src/main/java/ru/lionarius/isdojplab/runner/DevDataInitializer.java b/src/main/java/ru/lionarius/isdojplab/runner/DevDataInitializer.java new file mode 100644 index 0000000..d955eb6 --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/runner/DevDataInitializer.java @@ -0,0 +1,25 @@ +package ru.lionarius.isdojplab.runner; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; +import ru.lionarius.isdojplab.model.Product; +import ru.lionarius.isdojplab.repository.ProductRepository; + +@Component +@Profile("dev") +public class DevDataInitializer implements CommandLineRunner { + + private final ProductRepository productRepository; + + public DevDataInitializer(ProductRepository productRepository) { + this.productRepository = productRepository; + } + + @Override + public void run(String... args) throws Exception { + productRepository.save(new Product(null, "Тестовый товар 1", 1000.0, "Описание товара", null)); + productRepository.save(new Product(null, "Тестовый товар 2", 2000.0, "Описание товара", null)); + productRepository.save(new Product(null, "Тестовый товар 3", 3000.0, "Описание товара", null)); + } +} diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties new file mode 100644 index 0000000..33fc06f --- /dev/null +++ b/src/main/resources/application-dev.properties @@ -0,0 +1,6 @@ +spring.datasource.driver-class-name=org.sqlite.JDBC +spring.datasource.url=jdbc:sqlite::memory: +spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect +spring.jpa.generate-ddl=true +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.show-sql=true \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties new file mode 100644 index 0000000..7b5b2d7 --- /dev/null +++ b/src/main/resources/application-prod.properties @@ -0,0 +1,6 @@ +spring.datasource.driver-class-name=org.sqlite.JDBC +spring.datasource.url=jdbc:sqlite:./database/data.db +spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect +spring.jpa.generate-ddl=true +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=false \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8edda93..1e4a360 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,6 @@ +spring.profiles.active=dev spring.application.name=isdojp-lab -spring.datasource.driver-class-name=org.sqlite.JDBC -spring.datasource.url=jdbc:sqlite:./database/data.db -spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect -spring.jpa.generate-ddl=true -spring.jpa.hibernate.ddl-auto=update -spring.jpa.show-sql=true \ No newline at end of file +spring.data.rest.base-path=/api + +store.name=asdfasfsdfs +store.description=\u0412\u0441\u0435 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0434\u043e\u043c\u0430 \u0438 \u043e\u0444\u0438\u0441\u0430 diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index 93c8021..3b72921 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -9,8 +9,8 @@
-

Магазин электротоваров

-

Все для вашего дома и офиса

+

+