如何利用自定义注解放行 Spring Security 项目的接口

本文介绍如何在Spring Security项目中通过自定义注解实现接口的匿名访问。文章详细阐述了Spring Security的两种放行策略,并展示了创建自定义注解和配置类的步骤,强调注解只能用于标记在@RestController注解的方法上。

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

在实际项目中使用到了springsecurity作为安全框架,我们会遇到需要放行一些接口,使其能匿名访问的业务需求。 但是每当需要当需要放行时,都需要在security的配置类中进行修改,感觉非常的不优雅。

例如这样:

图片

所以想通过自定义一个注解,来进行接口匿名访问。在实现需求前,我们先了解一下security的两种方行思路。

第一种就是在 configure(WebSecurity web) 方法中配置放行,像下面这样:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/css/**", "/js/**", "/index.html", "/img/**", "/fonts/**", "/favicon.ico", "/verifyCode");
}

第二种方式是在 configure(HttpSecurity http) 方法中进行配置:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
{
 httpSecurity
    .authorizeRequests()
          .antMatchers("/hello").permitAll()
          .anyRequest().authenticated()
}

两种方式最大的区别在于,第一种方式是不走 Spring Security 过滤器链,而第二种方式走 Spring Security 过滤器链,在过滤器链中,给请求放行。如果您正在学习Spring Boot,那么推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/

在我们使用 Spring Security 的时候,有的资源可以使用第一种方式额外放行,不需要验证,例如前端页面的静态资源,就可以按照第一种方式配置放行。

有的资源放行,则必须使用第二种方式,例如登录接口。大家知道,登录接口也是必须要暴露出来的,不需要登录就能访问到的,但是我们却不能将登录接口用第一种方式暴露出来,登录请求必须要走 Spring Security 过滤器链,因为在这个过程中,还有其他事情要做,具体的登录流程想了解的可以自行百度。

了解完了security的两种放行策略后,我们开始实现

首先创建一个自定义注解

@Target({ElementType.METHOD}) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface IgnoreAuth {
}

这里说明一下, @Target({ElementType.METHOD}) 我的实现方式,注解只能标记在带有 @RequestMapping 注解的方法上。具体为什么下面的实现方式看完就懂了。

接下来创建一个security的配置类SecurityConfig并继承 WebSecurityConfigurerAdapter

@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter
{

    @Autowired
    private RequestMap
### 配置无需认证即可访问的接口 为了使某些接口不需要身份验证就能被访问,在`Spring Security`的安全配置类中可以通过重写`configure(HttpSecurity http)`方法来指定哪些URL模式应该公开。这通常是在继承了`WebSecurityConfigurerAdapter`的配置类里完成,尽管推荐使用新的基于lambda表达式的安全配置方式。 #### 使用 `permitAll()` 方法放行特定路径 通过调用`.antMatchers().permitAll()`,可以允许未经过身份验证的请求访问指定的资源或端点[^2]: ```java @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**", "/login", "/signup").permitAll() // 放行这些路径 .anyRequest().authenticated(); // 所有其他请求都需要认证 } ``` 上述代码片段展示了如何让`/public/**`下的所有子路径以及单独列出的`/login`和`/signup`两个API免于认证检查。 对于更复杂的匹配需求,还可以采用正则表达式或其他形式的路径匹配器来进行精确控制。 #### 处理静态资源 如果项目中有前端页面或者其他类型的静态资源(比如CSS、JavaScript文件),同样可以在配置中声明它们为公共可用,从而避免不必要的权限拦截: ```java http .authorizeRequests() .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll(); ``` 这段设置会自动识别并开放常见的静态资源位置给所有人访问[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值