不得不知道的Spring Security的基本原理
微信公众号:Java患者
专注Java领域技术分享
前言
由于我们的API接口,在服务启动后,是在无保护的状态下。任何人只要知道服务的地址,都可以访问我们开发的这些服务。这种情况在我们真实的企业级应用开发中是不允许的。我们需要对用户进行认证和授权,来保证我们合法的用户和有权限的用户才能访问。
SpringSecurity这个框架就是来做这种事情的,他提供了3个核心的功能:
- 认证:就是告诉系统你是谁,实际上就是我们常说的登录。
- 授权:就是指定当前的用户你能什么,不能干什么。
- 攻击防护:如果黑客通过伪造身份,我们前面的两种操作就无效了的。而SpringSecurity的核心功能,就是它可以有效防止伪造身份。
Spring Security的默认配置
默认情况下,在项目中有Spring Security相关的jar包。Spring Security会自动帮我们做一些安全的配置。这时候我们访问我们写的服务时候,它会让我们去填用户名和密码。
用户名是默认的,就是“user”,密码是我们启动时,控制台给我们打印的那一行日志。我们登陆后就可以拿到我们服务的响应了。
从这个例子中,我们可以看到,在我们不做任何的配置时,Spring Security它把我们所有的访问都给我们保护起来了。这种默认的行为并不能满足我们实际开发的需要,那么我们该如何自定义并覆盖它这种配置?、
第一个表单登录例子
我们用Spring Security来实现通过表单来登录,并且所有请求都需要授权才能访问的例子。
首先创建一个继承继承WebSecurityConfigurerAdapter的类,它是Spring Security提供的web安全的适配器类,然后重写configure(HttpSecurity http)方法。
@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// http.httpBasic() 这是之前httpBasic的登录
// 表单登录(认证)
http.formLogin()
.and()
// 下面的都是对请求进行授权配置
.authorizeRequests()
// 是指任何请求
.anyRequest()
// 都需要授权
.authenticated();
}
}
这时我们访问之前的服务,会跳到一个表单登录页面:
用户名还是“user”,密码依然是控制台打印的默认密码。
Spring Security的基本原理
Spring Security最核心的东西是一个过滤器链,这些过滤器在Spring boot启动的时候会帮我们配置上。
下面是2个常见的认证过滤器:
- UsernamePasswordAuthenticationFilter:处理表单的认证方式。它会检查你的请求是不是一个登录请求,带不带用户名和密码。如果带,就会尝试认证处理。如果没带,则会把请求给下一个过滤器,让他来处理。
- BasicAuthenticationFilter:处理Http Basic的认证方式。它会在在HTTP请求头部看到有没有basic的信息。如果有就拿出来并且做Base64解码,取出用户名和密码尝试登录。
其他过滤器认证处理同理,如果有一个请求认证成功了,他就对请求标记。过滤器链最后一环是FilterSecurityInterceptor,这个过滤器会读取我们的配置,来校验请求有没有权限访问最终的服务。如果不能访问,他会根据其原因来抛出不同的异常,这些异常会被它前面的过滤器ExceptionTranslationFilter捕获到,并且做出相应的处理。比如前面配置了表单登录,它就引导用户去表单登录。
这就是Spring Security最基本的原理,Spring Security的功能都是建立在这个过滤器链基础上的。需要注意的是,认证的过滤器我们是可以通过配置来控制是否生效的,而其他的过滤器不行。
查看
还没有评论,来说两句吧...