Intergiciels et services

Transactions, Spring Data & Spring Security

M2TIW - TIW1 - Emmanuel Coquery

Transactions

ACID

  • Atomicité
  • Cohérence
  • Isolation
  • Persistence (Durability)

Bases de données et serveurs d’application

  • Fournissent des transactions ACID
  • Relayées par les APIs / pilotes:
    • JDBC
    • JPA
  • Pas les seules ressources concernées, e.g.
    • Fichiers
    • Messages (services, files de messages)

⇒ Transactions multiparties complexes

Two-phase commit

Source IBM

Java Transactional API (JTA)

  • API de coordination des transactions
  • Méthodes & annotations pour gérer les transactions
    • Classes UserTransaction (EJB), EntityTransaction (JPA)
    • Méthode setRollbackOnly
  • Annotation pour spécifier les transactions

Modes transactionnels possibles

  • @TransactionAttribute:
    • MANDATORY, REQUIRED, REQUIRES_NEW, …
  • Spring: @Transactional

Aspects pour les transactions

Source Doc Spring

Spring Data

Objectifs

  • Faciliter le développement de DAO/repositories
  • Générer du code pour les parties “faciles”
  • JDBC, JPA, MongoDB, Cassandra, Redis, etc
  • Spring Boot: facilité de configuration

Principe

  • Point de départ: entité mappée, e.g. en JPA
  • Spring fourni une interface générique de Repository
    • qu’il est possible d’étendre pour ajouter des méthodes supplémentaires
  • Spring va générer une classe implémentant l’interface voulue
  • Une instance de la classe générée sera placée dans le contexte Spring

Exemple: entité

@Entity
public class Couleur {
  @Id
  @GeneratedValue
  private Long id;

  private String nom;
  private String description;
  private String colorCode;

  // ...  accesseurs, constructeurs, equals, etc
}

Exemple: interface

public interface CouleurRepository
  extends CrudRepository<Couleur, Long> {
}

définit save, findById, findAll, count, delete, existsById, etc
(c.f. code de CrudRepository)

Exemple: utilisation

@Autowired
private CouleurRepository couleurRepository;

@Test
void testCouleurRepository() {
  Couleur c = new Couleur("vert","basique","00FF00");
  couleurRepository.save(c);
  Optional<Couleur> c2 = couleurRepository.findById(c.getId());
  assertTrue(c2.isPresent());
  assertEquals(c,c2.get());
}

En coulisses: classe générée

LOG.info("Classe d'implementation de CouleurRepository: {}",
         couleurRepository.getClass());

donne

Classe d'implementation de CouleurRepository:
class com.sun.proxy.$Proxy95
  • Spring a généré une implémentation de CouleurRepository
  • Cette implémentation a été ajoutée au contexte

Ajouter d’autres méthodes au Repositories

public interface CouleurRepository extends CrudRepository<Couleur, Long> {

  Optional<Couleur> findByNom(String nom);

}
@Test
void testMethodeGenereeParNom() {
  Couleur c = new Couleur("bleu","basique","00FF00");
  couleurRepository.save(c);
  Optional<Couleur> c2 = couleurRepository.findByNom(c.getNom());
  assertTrue(c2.isPresent());
  assertEquals(c,c2.get());
}

Code généré via noms de méthodes

  • Langage de requête basé sur le nom des méthodes
    • find | By | Nom | And | ColorCode
  • Traduction en JPQL:
    SELECT c
    FROM Couleur c
    WHERE c.nom = :nom
    AND c.colorCode = :colorCode

Documentation, Référence

Requêtes ad-hoc

Pour les cas complexes: spécifier une requête JPQL

public interface CouleurRepository
  extends JpaRepository<Couleur, Long> { //!\\

  @Query("select c from Couleur c where c.colorCode = ?1")
  Optional<Couleur> getByColorCode(String colorCode);

}

Spring Security

Objectifs et caractéristiques

  • faciliter la gestion de la sécurité:
    • authentification & autorisation
  • intégration Spring Web MVC
  • modularité

Security Context

  • obtenu via le SecurityContextHolder
  • fourni une Authentication permettant de récupérer
    • un principal
    • des granted authorities

Principal & User Details

le principal contient des informations sur l’utilisateur

Granted Authorities

  • une authority permet d’accorder un droit
    e.g. un rôle
  • les granted authorities sont celles attribuées à l’utilisateur (principal) courant.

Authentification

  • processus de validation et complétion d’une Authentication
  • normalement déclenchée par le framework
    • typiquement dans un ServletFilter
  • fait via un AuthenticationManager
    • décliné selon le type d’authentification
      (DAO, LDAP, etc)

Autorisation

  • en général à travers des ServletFilters
    et/ou des aspects
  • décision prise par un AccessDecisionManager

Access Decision Manager

  • decide(authentication, targetObject, configAttributes)
  • AccessDeniedException, InsufficientAuthenticationException
  • appelé par un SecurityInterceptor

Cas particulier: votes

utilise des AccessDecisionVoters
(avec une méthode vote similaire à decide)

Source Spring

Intégration avec Spring Web MVC

Activation via @EnableWebSecurity

Classes qui étendent WebSecurityConfigurerAdapter

Documentation, CORS

exemple login, exemple plus complexe