文章目录
一、什么是 Spring Security?
- Spring Security是一个能够为基于Spring的企业应用系统
提供声明式的安全访问控制解决方案的安全框架
。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC、DI和AOP功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。(百科解读)
二、初始搭建的 Spring Security 是什么样子的?
开始搭建
- 搭建一个Spring Boot最简单的环境,定义一个
/hello
请求接口
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@GetMapping("/hello")
public String hello() {
return "hello spring security";
}
}
- 引入Spring Security相关的包,这里提供所有Security专栏项目中要用到的maven依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
</dependencies>
- 启动项目,启动后访问接口
http://localhost:8080/hello
,出现登录弹框就是默认的Security样子了。
所以用户名密码是啥?
- 默认用户名是
user
- 初始密码在项目启动的时候,日志会打印出来
现在请求后台接口都需要登录验证,如何关闭默认的security验证呢?
- 配置文件中
将 security.basic.enabled 设为 false
,每次请求后台接口将不再进行安全验证。
security.basic.enabled = false
用表单登录验证的样式可以吗?
- 创建Config类继承WebSecurityConfigurerAdapter,覆盖configure方法,如下:
@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// http.httpBasic()
http.formLogin()// 表单方式
.and()
.authorizeRequests()
.anyRequest()
.authenticated();
}
}
- 重新启动,访问接口
http://localhost:8080/hello
,就会跳到如下登录页
三、基本原理
SpringSecurity基本原理
- 它最核心的东西其实就是一个
过滤器链
,即一组Filter。 - 如图:
UsernamePasswordAuthenticationFilter
:处理表单登录的过滤器。BasicAuthenticationFilter
:处理httpBasic登录的过滤器。ExceptionTranslationFilter
:用于捕获后面过滤器抛出的异常。FilterSecurityInterceptor
:过滤器链的最后一环,它会决定当前请求能否访问REST API,它依据的是代码中的配置,比如哪些请求只有指定用户访问等,如下可以进行很复杂的配置:
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.and()
.authorizeRequests() // √
.anyRequest() // √
.authenticated(); // √
}
表单登录校验到底是怎么处理的?
- 上面提到了表单登录是
由 UsernamePasswordAuthenticationFilter 过滤器来处理的
,它会过滤/login
路径的请求,然后获取用户名密码再进行校验登录逻辑。
- 关于源码级更详细的处理流程后面文章会提到,敬请期待!
四、推荐阅读
实战篇
- 《手把手教你如何使用Spring Security(上):登录授权》
- 《手把手教你如何使用Spring Security(中):接口认证》
- 《手把手教你如何使用Spring Security(下):访问控制》
源码篇
- 《Spring Security源码(一):整体框架设计》
- 《Spring Security源码(二):建造者详解》
- 《Spring Security源码(三):HttpSecurity详解》
- 《Spring Security源码(四):配置器详解》
- 《Spring Security源码(五):FilterChainProxy是如何创建的?》
- 《Spring Security源码(六):FilterChainProxy是如何运行的?》
- 《Spring Security源码(七):设计模式在框架中的应用》
- 《Spring Security源码(八):登录认证源码流程》
- 《Spring Security源码(九):过滤器链上的过滤器是如何排序的?》
- 《Spring Security源码(十):权限访问控制是如何做到的?》