前后分离之后SpringBoot+SpringSecurity放行Swagger访问后,security跨域配置失效的问题

本文介绍了在前后分离的项目中,使用SpringBoot和SpringSecurity时遇到的Swagger访问和跨域问题。当Security未放行Swagger,本地无法访问Swagger,且前端跨域请求遭遇403错误。通过重写SecurityConfig和WebMvcConfigurer的配置方法,实现了既能允许Swagger访问后端接口,又能解决前端跨域问题。同时提醒,在生产环境中务必关闭Swagger以确保安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景:

项目用的swagger生成的接口文档,同时也有security权限验证,为了方便后端自己测试,所以接口测试直接访问swagger;

但是security如果没有放行swagger的话,本地是访问不到swagger的,同时前端要访问后端接口,也有跨域问题;

 Security没有放行swagger访问的时候,用swagger请求接口会报错:

我这样配置SecurityConfig之后,解决了swagger访问的问题:


    @Override
    public void configure(WebSecurity web) throws Exception {
        // v1是接口访问前缀,注意与自己的项目区别
        web.ignoring().antMatchers("/v1/**");
        
    }

但是,前端的跨域问题又出现了, 前端报错403;

查了一下资料,

WebSecurity和HttpSecurity的区别主要是:

  1. 这两个都是继承WebSecurityConfigurerAdapter后重写的方法
  2. http.permitAll不会绕开springsecurity验证,相当于是允许该路径通过
  3. web.ignoring是直接绕开spring security的所有filter,直接跳过验证

                
<think>好的,我现在需要帮助用户解决在前后分离架构下使用Spring Security实现访问权限控制的问题。首先,我得回忆一下用户提供的引用内容,看看有哪些信息可以利用。用户引用了四个资料,主要涉及Spring Security的配置、认证授权、CSRF防护以及权限处理的具体代码示例。 用户的问题是关于最佳实践的,所以我需要整理出一个结构清晰的回答,涵盖配置安全过滤器链、认证管理、权限控制、CSRF处理、异常处理等方面。同时,用户要求生成相关问题,我需要根据回答内容提出几个相关的问题,帮助用户进一步学习。 首先,我应该明确前后分离的特点,比如使用JWT、RESTful API、无状态认证等。然后结合引用中的配置示例,说明如何配置Spring Security的安全过滤器链,特别是登录处理URL和CORS配置,因为前后分离通常涉及问题。 接下来,认证管理部分需要提到自定义的UserDetailsService和JWT的使用,确保用户信息正确加载,并生成令牌返回给前端。引用4中的JWT实现可能有用,但用户提供的代码片段中没有详细说明,可能需要结合常见做法补充。 然后是权限控制,这里可以使用注解如@PreAuthorize,或者基于配置的权限规则,如antMatchers。引用1和引用2中的配置示例展示了如何设置登录处理URL和异常处理,引用4中的CustomizeAccessDeniedHandler处理权限不足的情况,这些都需要整合到最佳实践中。 CSRF防护在前后分离中可能需要禁用,因为通常使用token认证,引用3提到默认启用CSRF,但建议在无状态情况下禁用,这点需要强调。 异常处理部分,引用2和4中的UnLoginHandler和CustomizeAccessDeniedHandler展示了如何返回JSON响应,而不是跳转页面,这对前后分离很重要,需要确保所有异常都返回统一的JSON格式。 最后,其他实践可能包括接口文档整合、审计日志、请求限流等,但用户提供的引用中没有提到这些,可能需要简要提及,但不过多展开。 生成相关问题方面,可以考虑JWT与Session的区别、动态权限管理、CSRF处理、统一响应格式等,这些都是与主题紧密相关的问题,能帮助用户深入理解。 现在需要检查是否所有要点都覆盖,并且符合用户的需求。确保回答结构清晰,分点说明,每个部分都有对应的代码示例或配置方法,同时引用正确的资料作为支持。例如,在配置安全过滤器链时引用1和2,在异常处理时引用2和4等。 另外,注意用户要求使用中文回答,所有数学表达式用$...$格式,独立公式用$$...$$,但这个问题主要涉及代码和配置,可能数学公式较少,但如果有的话需要正确应用格式。例如,如果有算法相关的数学内容,需要正确使用LaTeX,但当前问题可能不涉及。 最后,确保生成的三个相关问题与内容相关,能够引导用户进一步探索,比如优化JWT、动态权限控制、CSRF处理等。</think>在前后分离架构中使用Spring Security实现访问权限控制需要遵循以下最佳实践,涵盖核心配置、认证授权、异常处理等关键环节: --- ### 一、安全过滤器链配置(核心入口) ```java @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .cors().configurationSource(corsConfigurationSource()) // 域配置[^2] .and() .csrf().disable() // 前后分离建议禁用CSRF[^3] .authorizeHttpRequests(auth -> auth .requestMatchers("/api/public/**").permitAll() .requestMatchers("/api/admin/**").hasRole("ADMIN") .anyRequest().authenticated() ) .formLogin(login -> login .loginProcessingUrl("/api/auth/login") // 登录接口路径[^1] .successHandler(loginSuccessHandler()) .failureHandler(loginFailureHandler()) ) .exceptionHandling(ex -> ex .authenticationEntryPoint(unLoginHandler()) // 未登录处理[^2] .accessDeniedHandler(accessDeniedHandler()) // 权限不足处理[^4] ); return http.build(); } } ``` --- ### 二、认证管理实现 1. **用户信息加载** ```java @Service public class JwtUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) { // 数据库查询用户及权限 return User.withUsername(username) .password(encodedPassword) .authorities(roles) .build(); } } ``` 2. **JWT令牌生成(登录成功处理)** ```java public class LoginSuccessHandler implements AuthenticationSuccessHandler { @Override public void onSuccess(...) { String token = Jwts.builder() .setSubject(username) .claim("roles", authorities) .signWith(SECRET_KEY) .compact(); response.getWriter().write(JSON.toJSONString(new AuthResult(token))); // 返回JSON[^4] } } ``` --- ### 三、权限控制策略 1. **方法级权限控制** ```java @RestController @PreAuthorize("hasRole('ADMIN')") // 类级别控制[^2] public class AdminController { @GetMapping("/sys/users") @PreAuthorize("hasAuthority('USER:READ')") // 细粒度控制[^4] public List<User> listUsers() { // ... } } ``` 2. **动态权限配置(数据库驱动)** ```java @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth .requestMatchers(dynamicPermissionLoader.loadUrlMappings()) ); } ``` --- ### 四、异常处理标准化 | 异常类型 | 处理方式 | 响应示例 | |-------------------|---------------------------------------|-----------------------------| | 未认证 | `AuthenticationEntryPoint`[^2] | `{"code":401,"msg":"请登录"}` | | 权限不足 | `AccessDeniedHandler`[^4] | `{"code":403,"msg":"无权限"}` | | 凭证失效/过期 | 自定义`AuthenticationFailureHandler` | `{"code":4011,"msg":"令牌过期"}` | --- ### 五、其他关键实践 1. **接口文档整合**:在Swagger白名单中放行`/v3/api-docs/**` 2. **审计日志**:实现`AuditListener`记录敏感操作 3. **请求限流**:集成Resilience4j进行API访问频率控制 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值