为了账号安全,请及时绑定邮箱和手机立即绑定

基于自定义标头的 Spring Security antMatcher 规则

基于自定义标头的 Spring Security antMatcher 规则

千万里不及你 2023-03-09 14:08:35
在 Spring 框架中,我目前正在尝试使用自定义标头而不是 url 来区分某些端点。目前,我似乎看不出如何允许带有自定义标头的特定 URL,但在 Spring Security 中拒绝另一个 URL。我的安全配置当前有一个 antMatcher,如下所示:.antMatchers( HttpMethod.POST, "/api/website-user" ).permitAll()但是,我还有一些其他的“POST”方法也受到保护——对于这个特定的端点,我只希望通过发送的标头识别和排除它。您如何告诉 Spring 安全该 URL 应该通过未经身份验证的方式传递 @PostMapping( headers = "X-Operation-Name=forgot-password" )    public WebsiteUser forgotPassword( @Valid PasswordResetRequestModel passwordReset )但是这个例如没有(并且依赖于经过身份验证的用户)?@PostMapping( headers = "X-Operation-Name=resend-verification" )    public WebsiteUser resendVerification( Principal principal )
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

您始终可以实现一个RequestMatcher来定义您自定义的 HTTP 请求匹配逻辑。如果匹配器为 HTTP 请求返回真值,它将允许该请求访问:


public MyRequestMatcher implements RequestMatcher {


    boolean matches(HttpServletRequest request){

         //Define the matching logic here....

         if(request.getHeader("xxx") != null &&

            request.getHeader("xxx").equals("yyyy"){

             return true;

         }

         //blablablab

    }

并配置使用这个匹配器:


 httpSecurity.authorizeRequests().requestMatchers(new MyRequestMatcher()).permitAll();

Spring Security 也提供了一些常用的RequestMatcher比如RequestHeaderRequestMatcher和AndRequestMatcher,应该适合你的需求:


//This matches if the request has X-Operation-Name header and its value is forgot-password

RequestHeaderRequestMatcher headerMatcher = new RequestHeaderRequestMatcher("X-Operation-Name","forgot-password" );


// This matches if the request is POST to the /api/website-user

AntPathRequestMatcher antRequestMatcher = new AntPathRequestMatcher("/api/website-user", HttpMethod.POST)


// This matches if both of the above matches matches 

AndRequestMatcher andMatcher = new AndRequestMatcher(headerMatcher,antRequestMatcher );


httpSecurity.authorizeRequests().requestMatchers(andMatcher).permitAll();


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 190 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信