package shop.alien.store.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import shop.alien.store.filter.PreAuthFilter;

import javax.annotation.Resource;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Resource
    private CustomAccessDeniedHandler customAccessDeniedHandler;

    @Resource
    private PreAuthFilter preAuthFilter;

    /**
     * 核心：跳过前端静态资源的Security过滤（不走过滤器链，性能最优）
     * 适用于前端打包后的静态资源（JS/CSS/图片/字体等）
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring()
                // 前端静态资源路径（根据实际项目调整）
                .antMatchers("/static/**", "/css/**", "/js/**", "/images/**", "/fonts/**")
                // 若前端部署在后端，放行打包后的dist目录（Vue/React打包后）
                .antMatchers("/dist/**", "/public/**")
                // 放行Swagger（若有）
                .antMatchers("/swagger-ui/**", "/v3/api-docs/**","/doc.html","/webjars/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                // 1. 禁用CSRF（前后端分离无Cookie，无需保护）
                .csrf().disable()
                // 2. 禁用Session（无状态，仅授权）
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                // 3. 关闭所有默认认证入口（表单登录、HTTP Basic）
                .formLogin().disable()
                .httpBasic().disable()
                // 4. 禁用注销
                .logout().disable()
                // 5. 配置授权规则
                .authorizeRequests()
//                // 公开接口：无需权限
//                .antMatchers("/doc.html").permitAll()
//                // 管理员接口：需ROLE_ADMIN角色
//                .antMatchers("/**").hasRole("ADMIN")
//                // 普通用户接口：需ROLE_USER角色
//                .antMatchers("/user/**").hasRole("USER")
                // 其他接口：需任意认证（即请求头带X-User-Roles）
                .anyRequest().permitAll()
                .and()
                // 6. 添加自定义预认证过滤器（核心：解析权限）
                .addFilterBefore(preAuthFilter, UsernamePasswordAuthenticationFilter.class)
                // 7. 配置授权异常处理器
                .exceptionHandling().accessDeniedHandler(customAccessDeniedHandler);

        // 允许跨域
        http.cors();
    }

}
