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.