IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Spring boot security avec 2 bdds (une pour les données de l'appli et l'autre pour security)


Sujet :

Spring Java

  1. #1
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut Spring boot security avec 2 bdds (une pour les données de l'appli et l'autre pour security)
    Bonjour,

    Je fais face à un problème que je n'arrive pas à résoudre: configurer un projet spring boot avec la bdd des données du projet séparée de la bdd security.

    J'ai pu configurer un projet spring boot avec plusieurs bdd grâce à ce site : https://www.baeldung.com/spring-data...iple-databases
    J'ai cette config pour ma bdd secondaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    @Configuration
    @PropertySource({"classpath:application.properties"})
    @EnableJpaRepositories(
            basePackages = "com.myApp.security.repositories",
            entityManagerFactoryRef = "productEntityManager",
            transactionManagerRef = "productTransactionManager"
    )
    public class ProductPersistenceConfiguration {
     
        @Autowired
        private Environment env;
     
        @Bean
        @ConfigurationProperties(prefix="spring.productdb-datasource")
        public DataSource productDataSource() {
            return DataSourceBuilder.create().build();
        }
     
        @Bean
        public LocalContainerEntityManagerFactoryBean productEntityManager() {
            final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
            em.setDataSource(productDataSource());
            em.setPackagesToScan("com.myApp.security.metier");
     
            final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            em.setJpaVendorAdapter(vendorAdapter);
            final HashMap<String, Object> properties = new HashMap<String, Object>();
            properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
            properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
            em.setJpaPropertyMap(properties);
     
            return em;
        }
     
        @Bean
        public PlatformTransactionManager productTransactionManager() {
            final JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(productEntityManager().getObject());
            return transactionManager;
        }
    }
    J'ai pu configurer un projet spring security grâce à ce site: https://www.laulem.com/dev/spring-bo...-security.html
    Avec cette config:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
    @EntityScan( "com.myApp.metier.impl" )
    @EnableJpaRepositories( "com.myApp.repositories" )
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
     
        @Autowired
        @Qualifier("userDetailsService")
        private UserDetailsService customUserDetailsService;
     
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                    .authorizeRequests().antMatchers("/").permitAll()
                    .anyRequest().authenticated()
                    .and().formLogin().loginPage("/login").successHandler( myAuthenticationSuccessHandler() ).failureUrl("/login?error=true").permitAll()
                    .and().logout().deleteCookies("JSESSIONID").logoutUrl("/logout").logoutSuccessUrl("/login");
        }
     
        @Override
        protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
            authManagerBuilder.userDetailsService(customUserDetailsService).passwordEncoder(myAppPasswordEncoder());
        }
     
        /**
         * Cryptage des mots de passe
         *
         * @return
         */
        @Bean
        public BCryptPasswordEncoder bCryptPasswordEncoder() {
            return new BCryptPasswordEncoder();
        }
     
     
        /**
         * Pas de cryptage des mots de passe
         *
         * @return
         */
        @Bean
        public MyAppPasswordEncoder myAppPasswordEncoder() {
            return new MyAppPasswordEncoder ();
        }
     
        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
     
        @Bean
        public AuthenticationSuccessHandler myAuthenticationSuccessHandler(){
            return new MyAppUrlAuthenticationSuccessHandler();
        }
    }
    Mais je n'arrive pas à réunir ces deux projets en un seul me permettant d'avoir une bdd données projet et une bdd security séparées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
    @PropertySource({"classpath:application.properties"})
    @EnableJpaRepositories(
            basePackages = "com.myApp.security.repositories",
            entityManagerFactoryRef = "productEntityManager",
            transactionManagerRef = "productTransactionManager"
    )
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
     
        @Autowired
        private Environment env;
     
        @Autowired
        @Qualifier("userDetailsService")
        private UserDetailsService customUserDetailsService;
     
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                    .authorizeRequests().antMatchers("/").permitAll()
                    .anyRequest().authenticated()
                    .and().formLogin().loginPage("/login").successHandler( myAuthenticationSuccessHandler() ).failureUrl("/login?error=true").permitAll()
                    .and().logout().deleteCookies("JSESSIONID").logoutUrl("/logout").logoutSuccessUrl("/login");
        }
     
        @Override
        protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
            authManagerBuilder.userDetailsService(customUserDetailsService).passwordEncoder(myAppPasswordEncoder());
        }
     
        /**
         * Cryptage des mots de passe
         *
         * @return
         */
        @Bean
        public BCryptPasswordEncoder bCryptPasswordEncoder() {
            return new BCryptPasswordEncoder();
        }
     
     
        /**
         * Pas de cryptage des mots de passe
         *
         * @return
         */
        @Bean
        public myAppPasswordEncoder myAppPasswordEncoder() {
            return new myAppPasswordEncoder();
        }
     
        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
     
        @Bean
        public AuthenticationSuccessHandler myAuthenticationSuccessHandler(){
            return new myAppUrlAuthenticationSuccessHandler();
        }
     
        @Bean
        @ConfigurationProperties(prefix="spring.productdb-datasource")
        public DataSource productDataSource() {
            return DataSourceBuilder.create().build();
        }
     
        @Bean
        public LocalContainerEntityManagerFactoryBean productEntityManager() {
            final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
            em.setDataSource(productDataSource());
            em.setPackagesToScan("com.myApp.security.metier.impl");
     
            final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            em.setJpaVendorAdapter(vendorAdapter);
            final HashMap<String, Object> properties = new HashMap<String, Object>();
            properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
            properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
            em.setJpaPropertyMap(properties);
     
            return em;
        }
     
        @Bean
        public PlatformTransactionManager productTransactionManager() {
            final JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(productEntityManager().getObject());
            return transactionManager;
        }
    }
    J'ai des problèmes lors de l'intanciation des beans, car certains sont instanciés en double par le framework!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    org.springframework.beans.factory.UnsatisfiedDependencyException: 
    	Error creating bean with name 'securityConfig': 
    	Unsatisfied dependency expressed through field 'customUserDetailsService'; 
    	nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: 
    	Error creating bean with name 'userDetailsService': 
    	Unsatisfied dependency expressed through field 'userService'; 
    	nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: 
    	Error creating bean with name 'userService': 
    	Unsatisfied dependency expressed through field 'userRepository'; 
    	nested exception is org.springframework.beans.factory.BeanCreationException: 
    	Error creating bean with name 'userRepository' defined in com.myApp.security.repositories.UserRepository defined in @EnableJpaRepositories declared on SecurityConfig: 
    	Cannot create inner bean '(inner bean)#2239ae10' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; 
    	nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#2239ae10': 
    	Cannot resolve reference to bean 'productEntityManager' while setting constructor argument; 
    	nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: 
    	Error creating bean with name 'productEntityManager': Requested bean is currently in creation: 
    	Is there an unresolvable circular reference?
    Je ne trouve pas ce qu'il faut enlever ou ajouter pour que ca fonctionne enfin.

    Avez-vous des suggestions on un lien vers un projet spring boot security avec 2 bdd qui fonctionne pour que je puisse comprendre d'un vient mon erreur.

    Merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Il faut 2 entity managers/datasources, donc bien faire attention aux noms des propriétés, noms des packages scannés, ...
    c'est très facile de se planter par des copier/coller maladroits, si vous mettez tout dans une seul projet,
    sans parler des comportements par défaut de Spring, que vous pouvez oublier de configurer spécifiquement pour chaque data source.

    Une façon "simple" d'éviter ce genre de problèmes est d'avoir un projet principal qui contient plusieurs sous-projets
    Avec maven :
    le projet principal est
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <packaging>pom</packaging>
    et contient une section modules, par exemple
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <modules>
    		<module>myproject-domain</module> <!-- packaging jar -->
    		<module>myproject-maindb</module> <!-- packaging jar -->
    		<module>myproject-secdb</module> <!-- packaging jar -->
     
    		<module>myproject-mvc</module> <!-- packaging war: la webapp -->
    </modules>

  3. #3
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Bonjour JeitEmgie,

    Merci de ta réponse, mon projet est bien structuré en plusieurs modules. (Le code a été simplifié et abrégé pour poster ma question sur le forum.J'ai un module webApp en springboot, j'ai un module "métier" et un module "security")Le "parent" du projet est spring-boot 2.5.7, la sécurité marche tant que je laisse la datasource par défaut de spring, mais ca "explose" dès que je veux mettre en place 2 datasources séparées et en particulier une dédiée pour spring-security.

    Le problème semble venir de la classe WebSecurityConfigurerAdapter qui a l'air d'instancier certains beans qui se retrouvent en conflit avec la dataSource secondaire que je veux configurer pour la partie spring-security de l'appli.

    Je continue de chercher...

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/11/2019, 20h55
  2. Réponses: 2
    Dernier message: 11/05/2016, 17h06
  3. Réponses: 7
    Dernier message: 26/03/2014, 11h56
  4. Réponses: 1
    Dernier message: 19/02/2008, 00h32
  5. Réponses: 0
    Dernier message: 22/08/2007, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo