Paginas personalizadas de login y registro

parent 055b7cdd
...@@ -6,15 +6,8 @@ import java.util.List; ...@@ -6,15 +6,8 @@ import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.roshka.modelo.Ciudad; import com.roshka.modelo.*;
import com.roshka.modelo.Departamento; import com.roshka.repositorio.*;
import com.roshka.modelo.Postulante;
import com.roshka.modelo.PostulanteTecnologia;
import com.roshka.modelo.Tecnologia;
import com.roshka.repositorio.CiudadRepository;
import com.roshka.repositorio.DepartamentoRepository;
import com.roshka.repositorio.PostulanteRepository;
import com.roshka.repositorio.TecnologiaRepository;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
...@@ -22,6 +15,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; ...@@ -22,6 +15,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@SpringBootApplication @SpringBootApplication
@EnableJpaRepositories("com.roshka.repositorio") @EnableJpaRepositories("com.roshka.repositorio")
...@@ -33,7 +27,8 @@ public class CurriculumsearchApplication { ...@@ -33,7 +27,8 @@ public class CurriculumsearchApplication {
} }
@Bean @Bean
CommandLineRunner runner(PostulanteRepository postRepo,TecnologiaRepository tecRepo,DepartamentoRepository depR, CiudadRepository ciudR) { CommandLineRunner runner(PostulanteRepository postRepo, TecnologiaRepository tecRepo, DepartamentoRepository depR,
CiudadRepository ciudR, RRHHUserRepository rrhhUserRepository) {
return args -> { return args -> {
try { try {
// read json and write to db // read json and write to db
...@@ -53,6 +48,14 @@ public class CurriculumsearchApplication { ...@@ -53,6 +48,14 @@ public class CurriculumsearchApplication {
List<Postulante> postulantes = mapper.readValue(inputStream,typeReference); List<Postulante> postulantes = mapper.readValue(inputStream,typeReference);
postRepo.saveAll(postulantes); postRepo.saveAll(postulantes);
System.out.println("postulantes Saved!"); System.out.println("postulantes Saved!");
String password = new BCryptPasswordEncoder().encode("test");
RRHHUser testuser = new RRHHUser();
testuser.setEmail("test@test.com");
testuser.setFirstName("test");
testuser.setLastName("test");
testuser.setPassword(password);
rrhhUserRepository.save(testuser);
System.out.println("Usuario Test: \nEmail: test@test.com\nPassword: test");
} catch (IOException e){ } catch (IOException e){
System.out.println("Unable to save tecnologias: " + e.getMessage()); System.out.println("Unable to save tecnologias: " + e.getMessage());
......
...@@ -10,6 +10,7 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe ...@@ -10,6 +10,7 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
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;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import javax.sql.DataSource; import javax.sql.DataSource;
...@@ -45,17 +46,27 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -45,17 +46,27 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override @Override
protected void configure(HttpSecurity http) throws Exception { protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests() http
// .csrf().disable()
.authorizeRequests()
.antMatchers("/").authenticated() .antMatchers("/").authenticated()
.antMatchers("/home").authenticated() .antMatchers("/home").authenticated()
.antMatchers("/postulantes").authenticated()
.anyRequest().permitAll() .anyRequest().permitAll()
.and() .and()
.formLogin() .formLogin()
.loginPage("/login")
.usernameParameter("email") .usernameParameter("email")
.defaultSuccessUrl("/home") .defaultSuccessUrl("/home")
.permitAll() .permitAll()
.and() .and()
.logout().logoutSuccessUrl("/").permitAll(); .logout()
.logoutUrl("/logout")
.logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET"))
.clearAuthentication(true)
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID", "remember-me")
.logoutSuccessUrl("/login");
} }
} }
\ No newline at end of file
...@@ -25,7 +25,6 @@ import org.springframework.web.bind.annotation.*; ...@@ -25,7 +25,6 @@ import org.springframework.web.bind.annotation.*;
@Controller @Controller
@RequestMapping("/")
public class PostulanteController { public class PostulanteController {
PostulanteRepository post; PostulanteRepository post;
TecnologiaRepository tecRepo; TecnologiaRepository tecRepo;
...@@ -101,7 +100,14 @@ public class PostulanteController { ...@@ -101,7 +100,14 @@ public class PostulanteController {
} }
System.out.println("hola"); System.out.println("hola");
post.save(postulante); post.save(postulante);
return "redirect:/"; return "redirect:/postulacion-correcta";
}
@GetMapping("/postulacion-correcta")
public String successPostulation(Model model){
model.addAttribute("mensaje1", "Tu informacion se ha recibido correctamente!");
model.addAttribute("mensaje2", " espera por que nos pongamos en contacto!");
return "exitoRegistro";
} }
@ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseStatus(HttpStatus.BAD_REQUEST)
......
...@@ -22,6 +22,11 @@ public class RRHHUserController { ...@@ -22,6 +22,11 @@ public class RRHHUserController {
this.rrhhUserRepository = rrhhUserRepository; this.rrhhUserRepository = rrhhUserRepository;
} }
@GetMapping("/")
public String redirectOnHome(){
return "redirect:/home";
}
@GetMapping("/register") @GetMapping("/register")
public String showRegistrationForm(Model model) { public String showRegistrationForm(Model model) {
model.addAttribute("user", new RRHHUser()); model.addAttribute("user", new RRHHUser());
...@@ -29,6 +34,11 @@ public class RRHHUserController { ...@@ -29,6 +34,11 @@ public class RRHHUserController {
return "registration"; return "registration";
} }
@GetMapping("/login")
public String getLogin() {
return "login";
}
@PostMapping("/process_register") @PostMapping("/process_register")
public String processRegister(HttpServletRequest request, RRHHUser user) { public String processRegister(HttpServletRequest request, RRHHUser user) {
if(Long.parseLong(request.getParameter("registrationCode")) != REGISTER_CODE){ if(Long.parseLong(request.getParameter("registrationCode")) != REGISTER_CODE){
......
...@@ -173,6 +173,7 @@ function serializeJSON (form) { ...@@ -173,6 +173,7 @@ function serializeJSON (form) {
// Create a new FormData object // Create a new FormData object
const formData = new FormData(form); const formData = new FormData(form);
// Create an object to hold the name/value pairs // Create an object to hold the name/value pairs
const pairs = {}; const pairs = {};
...@@ -189,20 +190,24 @@ function serializeJSON (form) { ...@@ -189,20 +190,24 @@ function serializeJSON (form) {
} }
async function postData(url = '', data = {}) { async function postData(url = '', data = {}) {
var token = document.querySelector("meta[name='_csrf']").content;
var headerxs = document.querySelector("meta[name='_csrf_header']").content;
// Default options are marked with * // Default options are marked with *
const response = await fetch(url, { let senddata = {
method: 'POST', // *GET, POST, PUT, DELETE, etc. method: 'POST', // *GET, POST, PUT, DELETE, etc.
mode: 'cors', // no-cors, *cors, same-origin mode: 'cors', // no-cors, *cors, same-origin
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
credentials: 'same-origin', // include, *same-origin, omit credentials: 'same-origin', // include, *same-origin, omit
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json',
// 'Content-Type': 'application/x-www-form-urlencoded', // 'Content-Type': 'application/x-www-form-urlencoded',
}, },
redirect: 'follow', // manual, *follow, error redirect: 'follow', // manual, *follow, error
referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
body: data // body data type must match "Content-Type" header body: data // body data type must match "Content-Type" header
}); }
senddata["headers"][headerxs] = token;
const response = await fetch(url, senddata);
return response; // parses JSON response into native JavaScript objects return response; // parses JSON response into native JavaScript objects
} }
formValidator() formValidator()
......
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<link href="https://fonts.googleapis.com/css?family=Nunito+Sans:400,400i,700,900&display=swap" rel="stylesheet">
</head>
<style>
body {
text-align: center;
padding: 40px 0;
background: #EBF0F5;
}
h1 {
color: #506BEE;
font-family: "Nunito Sans", "Helvetica Neue", sans-serif;
font-weight: 900;
font-size: 40px;
margin-bottom: 10px;
}
p {
color: #404F5E;
font-family: "Nunito Sans", "Helvetica Neue", sans-serif;
font-size:20px;
margin: 0;
}
i {
color: #506BEE;
font-size: 100px;
line-height: 200px;
margin-left:-15px;
}
.card {
background: white;
padding: 60px;
border-radius: 4px;
box-shadow: 0 2px 3px #C8D0D8;
display: inline-block;
margin: 0 auto;
}
</style>
<body>
<div class="card">
<div style="border-radius:200px; height:200px; width:200px; background: #F8FAF5; margin:0 auto;">
<i class="checkmark"></i>
</div>
<h1>Genial!</h1>
<p>${mensaje1}<br/>${mensaje2}</p>
</div>
</body>
</html>
\ No newline at end of file
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Login</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
<link href="https://getbootstrap.com/docs/4.0/examples/signin/signin.css" rel="stylesheet" crossorigin="anonymous">
</head>
<body>
<section class="vh-100" style="background-color: #508bfc;">
<div class="container py-5 h-100">
<div class="row d-flex justify-content-center align-items-center h-100">
<div class="col-12 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-2-strong" style="border-radius: 1rem;">
<div class="card-body p-5 text-center">
<form:form method="post" action="/login">
<h3 class="mb-5">Sign in</h3>
<div class="form-outline mb-4">
<input type="email" id="typeEmailX-2" class="form-control form-control-lg" name="email" placeholder="example@example.com"/>
<label class="form-label" for="typeEmailX-2">Email</label>
</div>
<div class="form-outline mb-4">
<input type="password" id="typePasswordX-2" class="form-control form-control-lg" name="password" />
<label class="form-label" for="typePasswordX-2">Password</label>
</div>
<button class="btn btn-primary btn-lg btn-block" type="submit">Login</button>
</form:form>
<hr class="my-4">
</div>
</div>
</div>
</div>
</div>
</section>
</body>
</html>
...@@ -468,6 +468,8 @@ ...@@ -468,6 +468,8 @@
</div> </div>
</div> </div>
</div> </div>
<meta name="_csrf" content="${_csrf.token}"/>
<meta name="_csrf_header" content="${_csrf.headerName}"/>
<!-- Optional JavaScript; choose one of the two! --> <!-- Optional JavaScript; choose one of the two! -->
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment