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,并将登录页面指向此控制器