gpt4 book ai didi

spring - 对多个 URL 使用 AbstractAuthenticationProcessingFilter

转载 作者:行者123 更新时间:2023-12-01 13:55:59 25 4
gpt4 key购买 nike

我的应用程序中有以下端点模式

  • /token -- 所有人都可以访问
  • /rest/securedone/** -- 需要身份验证
  • /rest/securedtwo/** -- 需要身份验证
  • /rest/unsecured/** -- 不需要身份验证

  • 到目前为止,我可以访问/token 端点。
    但是/rest/securedone/** 和/rest/unsecured/** 在未发送 token (JWT)时返回 401。我打算保护/rest/securedone/** 并且很好/rest/unsecured/** 应该可以访问。

    我的 httpSecurity 配置如下:
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http
    .cors()
    .and()
    .csrf().disable()
    .authorizeRequests()
    .antMatchers("/token").permitAll()
    .antMatchers("/rest/secured/**").authenticated()
    .and()
    .exceptionHandling()
    .authenticationEntryPoint(authenticationEntryPoint)
    .and()
    .sessionManagement()
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

    http.addFilterBefore(authenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);

    http.headers().cacheControl();
    }

    我的 AbstractAuthenticationProcessingFilter 扩展类如下:
    public class MyAuthenticationTokenFilter extends AbstractAuthenticationProcessingFilter {

    private static Logger log = LoggerFactory.getLogger(MyAuthenticationTokenFilter.class);

    public MyAuthenticationTokenFilter() { super("/rest/**"); }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws AuthenticationException, ServletException {
    //authentication handling code
    }


    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
    super.successfulAuthentication(request, response, chain, authResult);
    chain.doFilter(request, response);
    }
    }

    有人可以帮我弄清楚以下问题:
  • 什么时候使用 MyAuthenticationTokenFilter?它将为哪个 URL 调用?为什么/rest/unsecured/** 也期待认证?即使我明确说 .antMatchers("/rest/secured/**").permitAll() 也会发生这种情况。我
  • 我可以在 MyAuthenticationTokenFilter 构造函数中的 super(defaultFilterProcessingUrl) 调用中指定多个 url 模式吗?例如,如果我有另一个 url,例如/api/secured/ , 我怎样才能让我的 MyAuthenticationTokenFilter 为/api/secured/调用 要求?我不需要不同的身份验证处理,所以我想重新使用这个过滤器。
  • 最佳答案

    When is the MyAuthenticationTokenFilter used ?



    此过滤器用于处理带有客户端凭据的请求,它会在
    RequestMatcher
    时过滤 url。匹配请求 url,例如,在您的配置中,它将处理匹配 /rest/** 的 url ,并尝试将客户端凭据转换为 Authentication (例如 userInfo、role ...),当请求的客户端凭据不正确时,它可能会引发异常。
    authorizeRequests不同( xxx.authenticated()xxx.permit() ), authorizeRequests只需检查身份验证是否具有某些特殊属性(例如角色、范围)。

    以此类推, AbstractAuthenticationProcessingFilter只是将一些卡片( Authentication )放入不同客户的盒子( SecurityContext )中, authorizeRequests只需选中包含所需卡的框,否则它会拒绝请求。 AbstractAuthenticationProcessingFilter 不关心谁/如何使用卡片,以及 authorizeRequests不在乎卡片从哪里来。

    Can I specify multiple url patterns in my super(defaultFilterProcessingUrl) call inside MyAuthenticationTokenFilter constructor ?



    是的,您可以设置 requiresAuthenticationRequestMatcher来自 setRequiresAuthenticationRequestMatcher ,它将覆盖旧的 requiresAuthenticationRequestMatcher , 例如,
    authenticationTokenFilter
    .setRequiresAuthenticationRequestMatcher(new OrRequestMatcher(
    new AntPathRequestMatcher("/rest/secured/**")
    , new AntPathRequestMatcher("/api/secured/**")
    ));

    关于spring - 对多个 URL 使用 AbstractAuthenticationProcessingFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46899568/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com