Spring Boot的安全机制---Security,及其常用属性方法说明

2 篇文章 0 订阅
1 篇文章 0 订阅

在Spring Boot中最常用到的安全框架就是Security,这个框架一直都在更新,以满足对应用程序更好的保护。它是用于配置HTTP安全的主要配置类之一,可以配置请求的身份认证、授权、跨站请求伪造防护(CSRF)等。

在Spring Security的配置过程中,通常会使用HttpSecurity配置请求安全策略,然后将其与WebSecurity结合起来使用。

Spring Security可以应用于各种场景,包括但不限于:
1、Web应用程序:可以使用Spring Security保护Web应用程序的URL,并对用户进行身份验证和授权。
2、RESTful API:可以使用Spring Security保护RESTful API,限制只有经过身份验证的用户才能访问API资源。
3、单点登录(SSO):可以使用Spring Security实现单点登录功能,使用户只需登录一次即可访问多个关联的应用程序。
4、分布式系统:可以使用Spring Security在分布式系统中实现统一的身份验证和授权管理。

一、HttpSecurity

使用HttpSecurity(安全构建器)可以方便地配置基于HTTP的安全性,如启用表单登录、启用HTTP basic 认证、启用退出登录等。还可以配置请求的授权策略,如哪些请求需要进行身份认证、哪些请求需要授权等。

HttpSecurity常用方法:

1、anonymous():允许匿名用户访问
2、authorizeRequests():开始请求授权配置
3、formLogin():启用表单登录认证方式
4、httpBasic():启用HTTP basic认证方式
5、logout():启用退出登录
6、oauth2Login():启用OAuth2登录
7、rememberMe():启用remember me功能
8、requestMatchers():添加匹配请求配置
9、securityContext():添加SecurityContext配置
10、securityConfigurer():添加自定义的安全配置
11、sessionManagement():配置Session管理
12、csrf():配置跨站请求伪造防护

其中,authorizeRequests() 方法是 HttpSecurity 的核心方法,它用于开启请求授权配置。在该方法之后,可以通过一系列的配置方法来配置哪些请求需要进行授权,以及授权的方式和条件。

二、WebSecurity

WebSecurity用于配置 Web 安全的主要配置类之一。它提供了一些方法,用于配置一些基本行为,如忽略某些请求、设置用户信息来源、启用HTTPS 等。

WebSecurity 常用的方法:

1、ignoring():配置忽略某些请求
2、authorizeRequests():开始请求授权配置
3、authenticationProvider():配置身份认证提供者
4、headers():配置 HTTP 头信息,如 X-Frame-Options、Strict-Transport-Security 等
5、portMapper():配置端口映射,可以将 HTTP 请求映射到 HTTPS 请求或其他端口上
6、userDetailsService():配置用户信息来源,可以使用内存、数据库或其他方式来获取用户信息
7、httpBasic():启用 HTTP basic 认证,即用户需要在请求头中提供用户名和密码来进行身份认证
8、formLogin():启用表单登录,即用户需要在网页上输入用户名和密码来进行身份认证
9、logout():启用退出登录,即用户可以通过访问特定的 URL 来退出登录
10、csrf():配置跨站请求伪造防护,可以设置是否启用 CSRF 防护、CSRF Token 的生成策略等
11、sessionManagement():配置 Session 管理,可以设置 Session 的失效时间、Session ID 的生成策略等
12、requiresChannel():配置 HTTPS 通信,可以设置哪些请求需要使用 HTTPS 通信
13、exceptionHandling():配置异常处理,可以自定义异常处理的方式

其中,ignoring() 方法用于配置忽略某些请求,如静态资源等,这些请求不需要进行身份认证和授权。
authenticationProvider() 方法用于配置身份认证提供者,可以自定义身份认证的实现方式。

三、安全构建器HttpSecurity和WebSecurity的区别

WebSecurity不仅通过HttpSecurity定义某些请求的安全控制,也通过其他方式定义其他某些请求可以忽略安全控制;

HttpSecurity仅用于定义需要安全控制的请求(当然HttpSecurity也可以指定某些请求不需要安全控制);

可以认为HttpSecurity是WebSecurity的一部分,WebSecurity是包含HttpSecurity的更大的一个概念;

注意 : 这里是从语义上讲,而不是从实现层面的表示形式上讲;

构建目标不同:WebSecurity构建目标是整个Spring Security安全过滤器FilterChainProxy,而HttpSecurity的构建目标仅仅是FilterChainProxy中的一个SecurityFilterChain。

四、拦截请求

在任何应用中,并不是所有请求都需要同等程度地保护起来。有些请求需要认证,有些则不需要。所以,在pom.xml引入Security依赖项并在application.properties里设定账号密码,只是对Security最基础的使用,它会使用默认配置,也就是对所有URL的请求都进行拦截和验证,根据验证结果进行下一步处理,如:访问权限开放。

Security组件是有开放自定义拦截机制的,使用者可以根据自己的应用程序需要来自定义URL请求的拦截规则。

对低版本的Security组件中,对每个请求进行细粒度安全性控制的关键在于重载configure(HttpSecurity)方法;而在高版本(5.7+)中,改为创建Bean。

@Configuration
public class SecurityConfiguration {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((authz) -> authz.anyRequest().permitAll())
            .httpBasic(withDefaults());
        return http.build();
    }
    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().anyRequest();
    }
}

这里的拦截规则主要由2部分组成,一部分是URL匹配规则,另一部分是保护规则(通过定义好的一些方法配合自定义参数来完成规则校验)

URL匹配规则主要有以下几种:
requestMatchers(String… patterns);
requestMatchers(RequestMatcher… requestMatcher);
requestMatchers(HttpMethod method,String… patterns);
requestMatchers(HttpMethod method);
anyRequest();

用于设置保护规则的方法如下:
在这里插入图片描述
示例(其中有些参数以Lambda写法):

@Configuration
public class SecurityConfiguration {
	@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
		http.authorizeHttpRequests(
			(authz) -> authz
				.requestMatchers("/resources/**", "/signup", "/about").permitAll()
				.requestMatchers("/admin/**").hasRole("ADMIN")
				.requestMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
				.anyRequest().authenticated() //所有没被匹配器匹配到的URL都需用户通过认证。
			)
			.formLogin(withDefaults());
			return http.build();
	}
	@Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
    	return (web) -> web.ignoring().requestMatchers("/resources/**");
    }
}

authenticated()要求在执行该请求时,必须已经登录了应用。如果用户没有认证,Spring Security的Filter将会捕获该请求,并将用户重定向到应用的登录界面。同时permitAll()方法允许请求没有任何的安全限制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴趣广泛的程序猿

有钱的捧个钱场,谢谢各位!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值