SpringBoot 集成 SpringSecurity

实验环境

  • IDEA
  • Spring Boot:2.4.4
  • Spring Security:2.4.4
  • Gradle:6.8.3

spring security 简介

spring security 的核心功能主要包括:
* 认证
* 授权
* 攻击防护(防止伪造身份)

其核心就是一组过滤器链,项目启动后将会自动配置。

* UsernamePasswordAuthenticationFilter:表单登录Filter,判断是否是一个登录请求及是否包含 username 和 password;
* BasicAuthenticationFilter:用于认证用户的身份;
* … :其他认证过滤器;
* ExceptionTranslationFilter:会捕获抛出的错误,然后根据不同的认证方式进行信息的返回提示;
* FilterSecurityinterceptor:根据BrowserSecurityConfig 中的配置判定该请求是否能进行访问 rest 服务。

注意:紫色的过滤器可以配置是否生效,灰色的过滤器不可以配置是否生效。

Spring Security 简单集成体验

  1. 实验前提:已经使用 idea 新建 Spring Boot 工程,建构工具使用Gradle;

  2. 在 build.gradle 文件中 dependencies 中添加 Spring Security 依赖

    implementation 'org.springframework.boot:spring-boot-starter-security'
    
  3. 只要加入依赖,项目的所有接口都会被自动保护起来;编写测试接口:
    TestController.java

    @RestController
    public class TestController {
    
    @GetMapping("/test")
    public String Test() {
        return "test";
    }
    }
    
  4. 启动项目,Spring Security 初始帐号为 user,控制台中会打印出 Spring Security 初始密码:

  5. 从浏览器发送请求访问 http://localhost:8080/test,服务端会返回 302 响应码,让客户端重定向到 http://localhost:8080/login 页面,用户在 http://localhost:8080/login 页面输入初始帐号密码登录,登陆成功之后,就会自动跳转到 http://localhost:8080/test 接口。

配置 Spring Security 帐号密码

配置文件配置用户名/密码

可以直接在 application.yml 文件中配置用户的基本信息:

spring:
  profiles:
    active: dev
  security:
    user:
      name: admin
      password: admin

配置完成后,重启项目,就可以使用这里配置的 admin/admin 登录了。

Java 配置类配置用户名/密码

可以在 Java 配置类中配置用户名/密码:

/**
 * Spring Security 配置类
 *
 * @author zhaoff
 */
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 在内存中配置用户 admin,密码为 admin
        auth.inMemoryAuthentication()
                .withUser("admin")
                .roles("admin")
                .password("$2a$10$A3Rt7Qhu6IAhtIsaC/hVXOgDiL289wOqEIhl1q7JtjEIGvMEv.iY6");
    }

    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

重启项目,就可以使用在 configure 方法中配置的 admin/admin 登录了(用户的密码是加密之后的字符串)。

注意:从 Spring5 开始,强制要求密码要加密。Spring Security 中提供了 BCryptPasswordEncoder 密码编码工具,可以非常方便的实现密码的加密加盐,相同明文加密出来的结果总是不同,这样就不需要用户去额外保存盐的字段了。

集成完成!