Spring-Security 使用 spring-boot 和 JDBC 身份驗證

假設你想要阻止未經授權的使用者訪問該頁面,那麼你必須通過授權訪問來阻止他們。我們可以通過使用 spring-security 來實現這一點,spring-security 通過保護所有 HTTP 端點來提供基本身份驗證。為此,你需要為專案新增 spring-security 依賴項,在 maven 中我們可以將依賴項新增為:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

這是一個安全配置,可確保只有經過身份驗證的使用者才能訪問。

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
DataSource datasource;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest()
            .fullyAuthenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login?logout")
            .permitAll()
            .and()
        .csrf();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication().dataSource(datasource).passwordEncoder(passwordEncoder());
}

@Bean
public PasswordEncoder passwordEncoder() {
    PasswordEncoder encoder = new BCryptPasswordEncoder();
    return encoder;
}
}
組態 描述
@Configuration 表示 Spring IoC 容器可以將該類用作 bean 定義的源。
@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER) 覆蓋訪問規則而不更改任何其他自動配置的功能。較低的值具有較高的優先順序
WebSecurityConfigurerAdapter SecurityConfig 類擴充套件並覆蓋其幾個方法來設定安全配置的一些細節。
@Autowired of DataSource 提供工廠以連線到物理資料來源。
configure(HttpSecurity) 重寫方法定義應該保護哪些 URL 路徑,哪些不應該保護。
.authorizeRequests().anyRequest() .fullyAuthenticated() 表示要對我們的應用程式的所有請求進行身份驗證。
.formLogin() 配置基於表單的登入
.loginPage("/login").failureUrl("/login?error").permitAll() 指定登入頁面的位置,並允許所有使用者訪問該頁面。
.logout().logoutUrl("/logout") .logoutSuccessUrl("/login?logout").permitAll() 登出後重定向到的 URL。預設為/ login?logout。
.csrf() 用於防止跨站點請求偽造,啟用 CSRF 保護(預設)。
configure(AuthenticationManagerBuilder){} 重寫方法,用於定義使用者的身份驗證方式。
.jdbcAuthentication().dataSource(datasource) 表示我們正在使用 JDBC 身份驗證
.passwordEncoder(passwordEncoder()) 表示我們正在使用密碼編碼器來編碼我們的密碼。 (建立一個 bean 來返回密碼 Encoder 的選擇,我們在這種情況下使用 BCrypt)

請注意,我們尚未配置任何要使用的表名或任何查詢,這是因為預設情況下 spring security 會查詢下表:

create table users (   
  username varchar(50) not null primary key,
  password varchar(255) not null,
  enabled boolean not null) ;

create table authorities (
  username varchar(50) not null,
  authority varchar(50) not null,
  foreign key (username) references users (username),
  unique index authorities_idx_1 (username, authority));

將以下行插入上表:

INSERT INTO authorities(username,authority) 
VALUES ('user', 'ROLE_ADMIN');

INSERT INTO users(username,password,enabled)
VALUES('user', '$2a$10$JvqOtJaDys0yoXPX9w47YOqu9wZr/PkN1dJqjG9HHAzMyu9EV1R4m', '1');

在我們的例子中,使用者名稱user密碼也是用 BCrypt 演算法加密的 user

最後,在 application.properties 中配置資料來源以使用 spring boot:

spring.datasource.url = jdbc:mysql://localhost:3306/spring
spring.datasource.username = root
spring.datasource.password = Welcome123

注意: 建立並配置登入控制器並將其對映到路徑/login,並將登入頁面指向此控制器