This commit is contained in:
2024-12-09 13:39:53 +03:00
parent baeeed40d1
commit 9339a1b7b1
11 changed files with 105 additions and 26 deletions

View File

@@ -28,6 +28,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-jdbc' 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.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.security:spring-security-core' implementation 'org.springframework.security:spring-security-core'
implementation 'org.springframework.security:spring-security-web' implementation 'org.springframework.security:spring-security-web'
@@ -39,7 +40,8 @@ dependencies {
implementation 'org.hibernate.orm:hibernate-community-dialects' implementation 'org.hibernate.orm:hibernate-community-dialects'
implementation 'org.xerial:sqlite-jdbc:3.46.1.3' implementation 'org.xerial:sqlite-jdbc:3.46.1.3'
implementation 'com.h2database:h2'
compileOnly 'org.projectlombok:lombok' compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'

View File

@@ -6,6 +6,7 @@ import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.ProviderManager; import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 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.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -19,21 +20,18 @@ public class SecurityConfig {
@Bean @Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth http.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll() .requestMatchers("/").permitAll()
.requestMatchers("/login").permitAll() .requestMatchers("/login").permitAll()
.requestMatchers("/register").permitAll() .requestMatchers("/register").permitAll()
.requestMatchers("/logout").permitAll() .requestMatchers("/logout").permitAll()
// .requestMatchers("/api/**").permitAll()
.requestMatchers("/css/**").permitAll() .requestMatchers("/css/**").permitAll()
.requestMatchers("/js/**").permitAll() .requestMatchers("/js/**").permitAll()
.anyRequest().authenticated() .anyRequest().authenticated()
); );
// http.formLogin(form -> form
// .loginPage("/login")
// .loginProcessingUrl("/login")
// .usernameParameter("email")
// .failureHandler(authenticationFailureHandler())
// .permitAll());
http.exceptionHandling(exception -> exception.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"))); http.exceptionHandling(exception -> exception.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login")));
http.logout(logout -> logout.logoutSuccessUrl("/").permitAll()); http.logout(logout -> logout.logoutSuccessUrl("/").permitAll());

View File

@@ -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 = "Все для вашего дома и офиса";
}

View File

@@ -9,8 +9,11 @@ import ru.lionarius.isdojplab.repository.ProductRepository;
@Controller @Controller
public class HomeController { public class HomeController {
@Autowired private final ProductRepository productRepository;
private ProductRepository productRepository;
public HomeController(ProductRepository productRepository) {
this.productRepository = productRepository;
}
@GetMapping("/") @GetMapping("/")
public String home(Model model) { public String home(Model model) {

View File

@@ -35,14 +35,6 @@ public class LoginFormController {
return "login_form"; 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") @PostMapping("/login")
public String submitForm(@ModelAttribute("user") User user, BindingResult bindingResult, Model model, HttpSession httpSession) { public String submitForm(@ModelAttribute("user") User user, BindingResult bindingResult, Model model, HttpSession httpSession) {
if (bindingResult.hasErrors()) { if (bindingResult.hasErrors()) {

View File

@@ -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()));
}
}
}

View File

@@ -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));
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -1,7 +1,6 @@
spring.profiles.active=dev
spring.application.name=isdojp-lab spring.application.name=isdojp-lab
spring.datasource.driver-class-name=org.sqlite.JDBC spring.data.rest.base-path=/api
spring.datasource.url=jdbc:sqlite:./database/data.db
spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect store.name=asdfasfsdfs
spring.jpa.generate-ddl=true store.description=\u0412\u0441\u0435 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0434\u043e\u043c\u0430 \u0438 \u043e\u0444\u0438\u0441\u0430
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

View File

@@ -9,8 +9,8 @@
<body> <body>
<header> <header>
<h1>Магазин электротоваров</h1> <h1 th:text="${@storeProperties.name}"></h1>
<p>Все для вашего дома и офиса</p> <p th:text="${@storeProperties.description}"></p>
</header> </header>
<div class="container"> <div class="container">