diff --git a/pom.xml b/pom.xml index 7862c0b..08f2cc7 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,12 @@ org.mariadb.jdbc mariadb-java-client + + + org.springframework.data + spring-data-jpa + + @@ -57,24 +63,13 @@ bootstrap 5.2.2 - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity5 - 3.0.4.RELEASE - + org.webjars.bower jquery 3.6.1 - - - org.springframework.boot - spring-boot-starter-validation - - org.webjars @@ -104,12 +99,19 @@ org.springframework.boot spring-boot-starter-security + org.springframework.security - spring-security-test - test + spring-security-web - + + + org.springframework.security + spring-security-config + + + + diff --git a/src/main/java/com/cristobalbernal/foro/Respositorios/ICategoriaForo.java b/src/main/java/com/cristobalbernal/foro/Respositorios/ICategoriaForo.java index d92975c..3e35934 100644 --- a/src/main/java/com/cristobalbernal/foro/Respositorios/ICategoriaForo.java +++ b/src/main/java/com/cristobalbernal/foro/Respositorios/ICategoriaForo.java @@ -1,4 +1,8 @@ package com.cristobalbernal.foro.Respositorios; -public interface ICategoriaForo { +import com.cristobalbernal.foro.Entidades.CategoriaForoEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ICategoriaForo extends JpaRepository { + } diff --git a/src/main/java/com/cristobalbernal/foro/Respositorios/IUsers.java b/src/main/java/com/cristobalbernal/foro/Respositorios/IUsers.java index 93d71d8..5d74dd7 100644 --- a/src/main/java/com/cristobalbernal/foro/Respositorios/IUsers.java +++ b/src/main/java/com/cristobalbernal/foro/Respositorios/IUsers.java @@ -2,7 +2,9 @@ package com.cristobalbernal.foro.Respositorios; import com.cristobalbernal.foro.Entidades.UsersEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.web.bind.annotation.PostMapping; -public interface IUsers extends JpaRepository { +public interface IUsers extends JpaRepository { + UsersEntity findByEmail(String email); } diff --git a/src/main/java/com/cristobalbernal/foro/Servicios/ServicioRespuestas.java b/src/main/java/com/cristobalbernal/foro/Servicios/ServicioRespuestas.java index 08dee83..85dbe75 100644 --- a/src/main/java/com/cristobalbernal/foro/Servicios/ServicioRespuestas.java +++ b/src/main/java/com/cristobalbernal/foro/Servicios/ServicioRespuestas.java @@ -16,12 +16,6 @@ public class ServicioRespuestas { @PostConstruct public void init(){ - /* - respuestas = new RespuestasEntity[6]; - respuestas[0] = new RespuestasEntity(0, "TITULO 1", "aslkjbdakjdbkajwdbjakwdbkawjdbawkd.bawdawd" + - "adaw,dbakwjdbawkjd,abjwkd,awk,dad" + - "awda,wbjdwakjdawkjdawdblaw"); - */ } } diff --git a/src/main/java/com/cristobalbernal/foro/Servicios/ServicioUser.java b/src/main/java/com/cristobalbernal/foro/Servicios/ServicioUser.java new file mode 100644 index 0000000..dbc9e71 --- /dev/null +++ b/src/main/java/com/cristobalbernal/foro/Servicios/ServicioUser.java @@ -0,0 +1,28 @@ +package com.cristobalbernal.foro.Servicios; + +import com.cristobalbernal.foro.Entidades.Foro; +import com.cristobalbernal.foro.Entidades.UsersEntity; +import com.cristobalbernal.foro.Respositorios.IForo; +import com.cristobalbernal.foro.Respositorios.IUsers; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ServicioUser { + @Autowired + private IUsers iUsers; + + public List init(){ + return iUsers.findAll(); + } + + /* + public UsersEntity findById(long id){ + return iUsers.findById((int) id).orElse(null); + } + */ + + +} diff --git a/src/main/java/com/cristobalbernal/foro/controlador/Controlador.java b/src/main/java/com/cristobalbernal/foro/controlador/Controlador.java index d66332e..3c1de52 100644 --- a/src/main/java/com/cristobalbernal/foro/controlador/Controlador.java +++ b/src/main/java/com/cristobalbernal/foro/controlador/Controlador.java @@ -7,10 +7,12 @@ import com.cristobalbernal.foro.Respositorios.IUsers; import com.cristobalbernal.foro.Servicios.ServicioForo; import com.cristobalbernal.foro.Servicios.ServicioRespuestas; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; @@ -34,12 +36,12 @@ public class Controlador { return "index"; } @GetMapping("/login") - public String login(){ + public String login(Model model){ return "login/login"; } @GetMapping("/registrar") public String registrar(){ - return "Registrar/registrar"; + return "Registrar/Registrar"; } @GetMapping("/crearPregunta") public String pregunta(){ @@ -56,5 +58,14 @@ public class Controlador { public @ResponseBody List getAllUsers(){ return iUsers.findAll(); } + + @PostMapping("/process_register") + public String processRegister(UsersEntity user) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + String encodedPassword = passwordEncoder.encode(user.getPassword()); + user.setPassword(encodedPassword); + iUsers.save(user); + return "index"; + } } diff --git a/src/main/java/com/cristobalbernal/foro/seguridad/ConfigSeguridad.java b/src/main/java/com/cristobalbernal/foro/seguridad/ConfigSeguridad.java deleted file mode 100644 index 4d9ccaa..0000000 --- a/src/main/java/com/cristobalbernal/foro/seguridad/ConfigSeguridad.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.cristobalbernal.foro.seguridad; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.LogoutConfigurer; -import org.springframework.security.core.userdetails.User; -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; - -@Configuration -@EnableWebSecurity -public class ConfigSeguridad { - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - .requestMatchers("","/home","/","/registrar","/css/**","/image/**","/fonts/**","js/**","/postdetall/{id}").permitAll() - .anyRequest().authenticated() - ) - .formLogin((form) -> form - .loginPage("/login") - .permitAll() - ) - .logout(LogoutConfigurer::permitAll); - - return http.build(); - } - - @Bean - public UserDetailsService userDetailsService() { - UserDetails user = - User.withDefaultPasswordEncoder() - .username("tobal") - .password("1234") - .roles("USER") - .build(); - - return new InMemoryUserDetailsManager(user); - } -} diff --git a/src/main/java/com/cristobalbernal/foro/seguridad/MvcConfig.java b/src/main/java/com/cristobalbernal/foro/seguridad/McvConfig.java similarity index 52% rename from src/main/java/com/cristobalbernal/foro/seguridad/MvcConfig.java rename to src/main/java/com/cristobalbernal/foro/seguridad/McvConfig.java index 268a3a5..072941d 100644 --- a/src/main/java/com/cristobalbernal/foro/seguridad/MvcConfig.java +++ b/src/main/java/com/cristobalbernal/foro/seguridad/McvConfig.java @@ -5,12 +5,14 @@ import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration -public class MvcConfig implements WebMvcConfigurer { - @Override - public void addViewControllers(ViewControllerRegistry registration){ - registration.addViewController("/").setViewName("inicio"); - registration.addViewController("/crearPregunta").setViewName("crearPregunta"); - registration.addViewController("/login").setViewName("login"); +public class McvConfig implements WebMvcConfigurer { + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + registry.addViewController("").setViewName("index"); + registry.addViewController("/index").setViewName("index"); + registry.addViewController("/login").setViewName("login"); } + } + diff --git a/src/main/java/com/cristobalbernal/foro/seguridad/SegurityConfig.java b/src/main/java/com/cristobalbernal/foro/seguridad/SegurityConfig.java new file mode 100644 index 0000000..0e652b3 --- /dev/null +++ b/src/main/java/com/cristobalbernal/foro/seguridad/SegurityConfig.java @@ -0,0 +1,59 @@ +package com.cristobalbernal.foro.seguridad; + +import com.cristobalbernal.foro.seguridad.models.CustomUserDetailService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.LogoutConfigurer; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + + +@Configuration +@EnableWebSecurity +public class SegurityConfig { + @Bean + public CustomUserDetailService userDetailsService(){ + return new CustomUserDetailService(); + } + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public DaoAuthenticationProvider authenticationProvider() { + DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); + + authProvider.setUserDetailsService(userDetailsService()); + authProvider.setPasswordEncoder(passwordEncoder()); + + return authProvider; + } + + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests() + .requestMatchers("/crearPregunta","/miperfil").authenticated() + .anyRequest().permitAll() + .and() + .formLogin() + .usernameParameter("email") + .loginPage("/login") + .defaultSuccessUrl("/home") + .permitAll() + .and() + .logout(LogoutConfigurer::permitAll); + + return http.build(); + } + + + + +} diff --git a/src/main/java/com/cristobalbernal/foro/seguridad/models/CustomUserDetailService.java b/src/main/java/com/cristobalbernal/foro/seguridad/models/CustomUserDetailService.java new file mode 100644 index 0000000..b79a036 --- /dev/null +++ b/src/main/java/com/cristobalbernal/foro/seguridad/models/CustomUserDetailService.java @@ -0,0 +1,23 @@ +package com.cristobalbernal.foro.seguridad.models; + +import com.cristobalbernal.foro.Entidades.UsersEntity; +import com.cristobalbernal.foro.Respositorios.IUsers; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.ArrayList; + +public class CustomUserDetailService implements UserDetailsService { + + @Autowired + private IUsers iUsers; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + UsersEntity users = iUsers.findByEmail(username); + return new CustomUserDetails(users); + } + +} diff --git a/src/main/java/com/cristobalbernal/foro/seguridad/models/CustomUserDetails.java b/src/main/java/com/cristobalbernal/foro/seguridad/models/CustomUserDetails.java new file mode 100644 index 0000000..daf91e5 --- /dev/null +++ b/src/main/java/com/cristobalbernal/foro/seguridad/models/CustomUserDetails.java @@ -0,0 +1,53 @@ +package com.cristobalbernal.foro.seguridad.models; + +import com.cristobalbernal.foro.Entidades.UsersEntity; +import org.springframework.context.annotation.Bean; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; + +public class CustomUserDetails implements UserDetails { + + + private final UsersEntity user; + + public CustomUserDetails(UsersEntity user) { + this.user = user; + } + + @Override + public Collection getAuthorities() { + return null; + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public String getUsername() { + return user.getEmail(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5cdfb66..6396b04 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,4 +6,5 @@ spring.datasource.url=jdbc:mariadb://localhost:3306/forogruas spring.datasource.username=root spring.datasource.password= spring.jpa.properties.hibernate.jdbc.time_zone=UTC -spring.data.jpa.repositories.enabled=true \ No newline at end of file +spring.data.jpa.repositories.enabled=true +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl \ No newline at end of file diff --git a/src/main/resources/templates/login/login.html b/src/main/resources/templates/login/login.html index f003375..ae6e91f 100644 --- a/src/main/resources/templates/login/login.html +++ b/src/main/resources/templates/login/login.html @@ -25,11 +25,11 @@
Log In
Hello there, Log In
- +