|
|
|
@ -0,0 +1,59 @@
|
|
|
|
|
package com.yami.shop.security.common.adapter;
|
|
|
|
|
|
|
|
|
|
// 导入Spring框架中用于将方法标记为创建Bean的注解,通过该注解定义的方法返回的对象会被Spring容器管理,可在其他地方进行注入使用
|
|
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
|
|
// 导入Spring Security框架中用于配置基于Web的安全相关设置的类,通过链式调用的方式可以配置如认证、授权、跨域、会话管理等多个方面的安全策略
|
|
|
|
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
|
|
|
// 导入Spring Security框架中用于启用Web安全功能的注解,表明在当前应用中要开启Spring Security相关的Web安全配置机制
|
|
|
|
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
|
|
|
|
// 导入Spring Security框架中用于定义会话创建策略的枚举类,此处配置为无状态(STATELESS)会话策略,适用于基于Token的认证方式
|
|
|
|
|
import org.springframework.security.config.http.SessionCreationPolicy;
|
|
|
|
|
// 导入Spring Security框架中用于构建安全过滤链的核心接口,配置好的安全规则最终会形成这样一个过滤链来处理进入应用的请求,进行安全相关的检查和过滤操作
|
|
|
|
|
import org.springframework.security.web.SecurityFilterChain;
|
|
|
|
|
// 导入Spring框架中用于将类标记为组件的注解,表明该类是一个Spring管理的组件,会被自动扫描并实例化,可在其他地方进行依赖注入使用
|
|
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
// 导入Spring框架中用于处理跨域相关的工具类,此处用于判断请求是否是跨域预检请求(OPTIONS请求),以便对不同类型请求做不同的授权处理
|
|
|
|
|
import org.springframework.web.cors.CorsUtils;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* MallWebSecurityConfigurerAdapter类主要用于配置Spring Security在Web应用中的安全策略,
|
|
|
|
|
* 其特点是利用了Spring Security的防火墙等安全相关功能,但并不使用Spring Security自带的认证授权登录机制,
|
|
|
|
|
* 而是自行处理认证授权逻辑(可能通过其他自定义方式,比如基于Token的方式等),在这个类中重点配置了如跨域、会话管理以及请求的授权规则等方面的内容,
|
|
|
|
|
* 通过定义SecurityFilterChain来构建整个安全过滤链,使得进入应用的请求按照设定的规则进行相应的安全处理。
|
|
|
|
|
*
|
|
|
|
|
* @author 菠萝凤梨
|
|
|
|
|
* @date 2022/3/25 17:33
|
|
|
|
|
*/
|
|
|
|
|
@Component
|
|
|
|
|
@EnableWebSecurity
|
|
|
|
|
public class MallWebSecurityConfigurerAdapter {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 定义一个名为filterChain的方法,并通过@Bean注解将其返回的SecurityFilterChain对象交由Spring容器管理,成为一个可被注入使用的Bean。
|
|
|
|
|
* 这个方法用于构建安全过滤链,配置了一系列的安全相关规则,具体如下:
|
|
|
|
|
*
|
|
|
|
|
* @param http HttpSecurity对象,用于以链式调用的方式配置基于HTTP请求的安全策略,如认证、授权、跨域、会话管理等各个方面
|
|
|
|
|
* @return SecurityFilterChain 返回配置好的安全过滤链对象,该过滤链会应用到整个Web应用中,对进入的请求进行安全相关的处理和过滤
|
|
|
|
|
* @throws Exception 如果在配置HttpSecurity过程中出现异常(比如配置的规则不符合要求等情况),则会抛出异常,需要进行相应的处理
|
|
|
|
|
*/
|
|
|
|
|
@Bean
|
|
|
|
|
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
|
|
|
|
|
|
|
|
|
// 关闭跨站请求伪造(CSRF)防护功能,因为基于Token的认证方式下通常不需要CSRF防护,Token本身就用于身份验证,可避免此类安全风险
|
|
|
|
|
return http.csrf().disable().cors()
|
|
|
|
|
|
|
|
|
|
// 配置跨域相关设置,启用跨域支持(后续可能还需要配置更具体的跨域规则等,这里只是开启了基本的支持),
|
|
|
|
|
// 接着配置会话管理相关内容,将会话创建策略设置为无状态(STATELESS),意味着服务器不会为客户端创建和维护会话状态,
|
|
|
|
|
// 适用于基于Token的认证场景,每次请求都通过携带Token来验证身份,服务器不依赖会话来识别客户端
|
|
|
|
|
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
|
|
|
|
|
|
|
|
|
|
// 配置请求授权相关规则,对于跨域预检请求(OPTIONS请求,通过CorsUtils::isPreFlightRequest判断),允许所有的此类请求通过,
|
|
|
|
|
// 因为跨域预检请求主要是浏览器在正式发起跨域请求前进行的一种询问服务器是否允许跨域的请求,通常需要放行
|
|
|
|
|
.and().authorizeRequests().requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
|
|
|
|
|
|
|
|
|
|
// 继续配置请求授权规则,对于所有其他请求(通过"/**"表示任意路径的请求),也都允许通过,这意味着在这个配置下,没有进行严格的基于Spring Security自带认证授权的访问限制,
|
|
|
|
|
// 可能后续会通过其他自定义的中间件或者业务逻辑来对请求进行更细致的权限判断等操作,此处只是简单放开了所有请求的访问权限
|
|
|
|
|
.and().authorizeRequests().requestMatchers(
|
|
|
|
|
"/**").permitAll().and().build();
|
|
|
|
|
}
|
|
|
|
|
}
|