Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

79.7. Authorization Bearer

		
package cn.aigcsst.config;

import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authorization.AuthorizationDecision;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

/**
 * @author Neo
 * @description Security 配置类
 * @date 2023-01-26 21:18
 */
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@Slf4j
public class WebSecurityConfiguration {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

        http.csrf((csrf) -> csrf.disable());

        http.authorizeHttpRequests(auth -> auth
                // 使用SpEL表达式读取Authorization头,并添加授权条件
                .requestMatchers("/adm/**").access((authentication, context) -> {
                    // 获取当前请求对象
                    HttpServletRequest request = context.getRequest();
                    // 读取Authorization头
                    String authorizationHeader = request.getHeader("Authorization");
                    log.debug("Authorization:" + authorizationHeader);

                    // 自定义授权逻辑(示例:头存在且为Bearer类型则授权通过)
                    boolean isAuthorized = authorizationHeader != null && authorizationHeader.startsWith("Bearer ");
                    return new AuthorizationDecision(isAuthorized);
                })
                .anyRequest().permitAll()
        );
        return http.build();
    }


}