Статьи

Spring boot с Spring Security и jdbc

Spring security — замечательный фреймворк, экономящий много времени и усилий разработчиков. Также это достаточно гибко, чтобы настроить и свести его к вашим потребностям.

Работать с JDBC и Spring Security довольно просто, и многие действия автоматизированы. Это было бы минимальной витриной.

Файл Gradle содержит такие зависимости, как база данных spring-security, spring-jdbc и h2.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
group 'com.gkatzioura'
version '1.0-SNAPSHOT'
 
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.0.RELEASE")
    }
}
 
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'
 
sourceCompatibility = 1.8
 
repositories {
    mavenCentral()
}
 
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.thymeleaf:thymeleaf-spring4")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.springframework:spring-jdbc")
    compile("com.h2database:h2:1.4.192")
    compile("org.slf4j:slf4j-api:1.6.6")
    compile("ch.qos.logback:logback-core:1.1.7")
    compile("ch.qos.logback:logback-classic:1.1.7")
    testCompile "junit:junit:4.11"
}

Таблицы, содержащие определенную информацию, должны быть созданы. Эти таблицы будут иметь имена по умолчанию и имена столбцов, которые Spring ищет для поиска информации.

1
2
3
4
5
6
7
8
drop table if exists users;
create table users(id bigint auto_increment, username varchar(255), password varchar(255), enabled boolean);
insert into users(username,password,enabled) values('steve','steve',true);
insert into users(username,password,enabled) values('john','john',true);
drop table if exists authorities;
create table authorities(username  varchar(255),authority  varchar(255), UNIQUE(username,authority));
insert into authorities(username,authority) values('steve','admin');
insert into authorities(username,authority) values('john','superadmin');

Эти операторы sql будут находиться на resources / schema.sql.

Первый шаг — создать класс приложения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.gkatzioura.spring.security;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
/**
 * Created by gkatzioura on 9/2/16.
 */
@SpringBootApplication
public class Application {
 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
 
}

Для быстрого начала работы база данных будет базой данных h2.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.gkatzioura.spring.security.config;
 
import org.h2.jdbcx.JdbcDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import javax.sql.DataSource;
import java.nio.file.Files;
 
/**
 * Created by gkatzioura on 9/2/16.
 */
@Configuration
public class DataSourceConfig {
 
    @Bean
    public DataSource createDataSource() {
 
        JdbcDataSource dataSource = new JdbcDataSource();
        dataSource.setURL("jdbc:h2:"+System.getProperty("java.io.tmpdir")+"/database");
 
        return dataSource;
    }
 
}

Указав базу данных h2, я установил каталог во временный каталог. Поэтому, как только вы перезапустите ОС, база данных исчезнет.
Как упоминалось ранее, после инициализации компонента источника данных spring-jdbc автоматически найдет в папке ресурсов файл schema.sql. Если файл существует, spring-jdbc попытается выполнить операторы, содержащиеся в schema.sql.

Следующим шагом является определение нашей конфигурации безопасности. Мы должны указать, что наша безопасность будет основана на jdbc. Также мы должны определить конечные точки, которые должны быть безопасными.

01
02
03
04
05
06
07
08
09
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
package com.gkatzioura.spring.security.config;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 
import javax.sql.DataSource;
 
/**
 * Created by gkatzioura on 9/2/16.
 */
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Autowired
    private DataSource dataSource;
 
    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication().dataSource(dataSource);
    }
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
 
        http.authorizeRequests()
                .antMatchers("/public").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }
}

И последнее, но не менее важное: мы добавим контроллер с защищенной конечной точкой и незащищенной конечной точкой.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.gkatzioura.spring.security.controller;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * Created by gkatzioura on 9/2/16.
 */
@RestController
public class GreetController {
 
    private static final Logger LOGGER = LoggerFactory.getLogger(GreetController.class);
 
    @RequestMapping(path = "/public",method = RequestMethod.GET)
    public String sayFreeHi() {
        return "Greeting";
    }
 
    @RequestMapping(path = "/secured",method = RequestMethod.GET)
    public String saySecureHi() {
        return "Secured";
    }
 
}

После того, как вы попытаетесь получить доступ к защищенной конечной точке, отобразится экран входа в систему безопасности Spring по умолчанию.
Продолжите работу с одним из пользователей, указанных в операторах sql (например, имя пользователя: steve, пароль: steve). Если вы хотите выйти из системы, просто нажмите конечную точку выхода из системы / login?

Запустите приложение с

1
gradle bootRun

и ты в порядке.

Вы можете найти исходный код на GitHub

Ссылка: Spring boot с Spring Security и jdbc от нашего партнера JCG Эммануила Гкатзиураса в блоге gkatzioura .