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:
J'ai pu configurer un projet spring security grâce à ce site: https://www.laulem.com/dev/spring-bo...-security.html
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; } }
Avec cette config:
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 @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(); } }
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
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; } }
Je ne trouve pas ce qu'il faut enlever ou ajouter pour que ca fonctionne enfin.
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?
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.
Partager