简体   繁体   中英

How to use SpringSecurity and JDBI

I'm trying to configure a server with Spring. I want to use Spring security and JDBI at the same time. So I've configured the datasource of my server (?) and linked it to JDBI. But I'm not able to use this datasource in the WebSecurityConfig.

This is my Main config java file :

    @SpringBootApplication
    @EnableAutoConfiguration
    public class Application extends WebMvcConfigurerAdapter {

       private static DBI dbi = null;

       public static void main(String[] args) {
           SpringApplication.run(Application.class, args);
       }


       static DBI getDbi() {
           if(dbi == null) {
               DataSource ds = JdbcConnectionPool.create("jdbc:h2:mem:test", "ndl", "ndl");
               dbi = new DBI(ds);
           }
           return dbi;
       }
    }

This is the file for security spring

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login.html")
                .permitAll()
                .and()
                .logout()
                .permitAll();
        http.csrf().disable();
    }

    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication().dataSource(dataSource)
                .usersByUsernameQuery(
                        "select username,password from users where username=?")
                .authoritiesByUsernameQuery(
                        "select username, role from users where username=?");
    }

}

I got this error.

Field dataSource in rest.WebSecurityConfig required a bean of type 'javax.sql.DataSource' that could not be found.

I tried to write the DataSource ds in the class (and not in the method). And add to it the annotation @Bean. But i got an other error

   public static DataSource ds = JdbcConnectionPool.create("jdbc:h2:mem:test", "ndl", "ndl");

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public static DataSource getDataSource(){
        return ds;
    }

And the error

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSecurityConfig': Injection of autowired dependencies failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/jdbc/core/support/JdbcDaoSupport

I hope you have any ideas... Thanks ;)

Problem found.

I missed the following dependency : spring-jdbc

So my final build.gradle is

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.8.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

jar {
    baseName = 'gs-rest-service'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
    maven {
        url 'https://repo.spring.io/libs-milestone'
    }
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile('org.springframework.boot:spring-boot-starter-test')
    compile("org.springframework.boot:spring-boot-starter-security")
    testCompile("org.springframework.security:spring-security-test")
    compile group: 'org.jdbi', name: 'jdbi', version: '2.4.2'
    compile group: 'com.h2database', name: 'h2', version: '1.3.148'
    compile group: 'org.springframework', name: 'spring-jdbc', version: '4.3.8.RELEASE'
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM