Nous allons voir comment utiliser des jetons CSRF dans une application REST avec spring.
Dans ce type d'application, il n'y a pas de formulaire pour entrer un nom d'utilisateur et un mot de passe.
Lors de votre connexion au serveur, il est possible d'obtenir le jeton CSRF au lieu de faire une requête au serveur.
var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var csrf = req.getResponseHeader("x-csrf-token")
var cookie = JSON.stringify({method: 'GET', url: '/', csrf: csrf});
$.cookie('myWebApp', cookie);
Ensuite pour la connexion
var cookie = JSON.parse($.cookie('myWebApp'));
var data = 'username=' + $('#username').val() + '&password=' + $('#password').val();
$.ajax({
data: data,
headers: {'X-CSRF-TOKEN': cookie.csrf},
timeout: 1000,
type: 'POST',
url: '/login',
}).done(function (data, textStatus, jqXHR) {
var csrf = jqXHR.getResponseHeader("x-csrf-token")
var cookie = JSON.stringify({method: 'GET', url: '/', csrf: csrf});
$.cookie('chezlise', cookie);
window.location = "main.html";
})
A chaque requête vous devez vérifier si le jeton a changé et l'affecter à votre cookie au besoin.
Mis à part les requêtes de type GET, il faudra insérer le jeton dans vos requête ajax.
Au niveau du serveur, il faut créer une classe héritant de WebSecurityConfigurerAdapter
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class ServerApplicationSecurity extends WebSecurityConfigurerAdapter {
@Autowired
private RESTAuthenticationEntryPoint authenticationEntryPoint;
@Autowired
private RESTAuthenticationFailureHandler authenticationFailureHandler;
@Autowired
private RESTAuthenticationSuccessHandler authenticationSuccessHandler;
@Autowired
private UserServiceImpl userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/rest/**").authenticated();
//http.csrf().disable();
http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
http.formLogin().successHandler(authenticationSuccessHandler);
http.formLogin().failureHandler(authenticationFailureHandler);
http.logout().logoutUrl("/logout");
http.logout().logoutSuccessUrl("/");
// CSRF tokens handling
http.addFilterAfter(new CsrfTokenResponseHeaderBindingFilter(), CsrfFilter.class);
}
}
https://github.com/aditzel/spring-security-csrf-filter/blob/master/src/main/java/com/allanditzel/springframework/security/web/csrf/CsrfTokenResponseHeaderBindingFilter.java
Ensuite dans la classe de l'application
@EntityScan(basePackageClasses = {ServerApplication.class, Jsr310JpaConverters.class})
@SpringBootApplication
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
@Bean
public WebSecurityConfigurerAdapter webSecurityConfigurerAdapter() {
return new ServerApplicationSecurity();
}
}
Blog sur la conception, développement et le génie logiciel. Divers langages et systèmes d'exploitations sont traités.
jeudi 8 octobre 2015
jeudi 1 octobre 2015
Mapping d'une date d'anniversaire en JPA.
La version 2.1 de JPA et la version 5 de MySQL ont été utilisé.
Une date d'anniversaire s'affiche sous le format: dd/MM/yyyy. Ce format varie d'une région à une autre. Une telle date ne possède pas d'heure.
Si vous ne spécifiez par le bon type dans votre entité, vos risques de ne pas obtenir le format désiré à l'affichage.
L'annotation Temporal offre 3 valeurs: Date, Time et Timestamp. Le time est inutile pour un anniversaire.
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
private Date birthdate;
La valeur qui sera transféré sera
"anniversaire":"17/06/1980" au lieu
"anniversaire":"1980-06-17"
Si vous utiliser l'annotation DateTimeFormat de spring
@DateTimeFormat(pattern = "dd/MM/yyyy") dans votre DTO, vous allez obtenir une valeur numérique similaire à 14360400000.
Une date d'anniversaire s'affiche sous le format: dd/MM/yyyy. Ce format varie d'une région à une autre. Une telle date ne possède pas d'heure.
Si vous ne spécifiez par le bon type dans votre entité, vos risques de ne pas obtenir le format désiré à l'affichage.
L'annotation Temporal offre 3 valeurs: Date, Time et Timestamp. Le time est inutile pour un anniversaire.
Selon l'annotation, voici le type de donnée et le type en bd..
@Temporal(javax.persistence. TemporalType.DATE)
Data type date
DB data type date
@Temporal(javax.persistence. TemporalType.TIMESTAMP)
Data type timestamp
DB data type datetime
Si vous n'en spécifiez aucun, vous obtiendrez ceux de TemporalType.TIMESTAMP.
@Entity
public class personne{
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date anniversaire;
...
}
Au niveau de votre DTO, vous devez spécifiez le format.
private Date birthdate;
La valeur qui sera transféré sera
"anniversaire":"17/06/1980" au lieu
"anniversaire":"1980-06-17"
Si vous utiliser l'annotation DateTimeFormat de spring
@DateTimeFormat(pattern = "dd/MM/yyyy") dans votre DTO, vous allez obtenir une valeur numérique similaire à 14360400000.
Commande Mysql utile
Importer un script sql
mysql -puse databasename
source nom_script.sql
Export du schéma de base de donnée
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p -d databasename > database.sql
Créer un utilisateur
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';Octroie des privilèges sur tout
GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
Active les privilèges immédiatement
FLUSH PRIVILEGES;
Inscription à :
Articles (Atom)