gpt4 book ai didi

java - Spring security - 休息服务的自定义过滤器和入口点

转载 作者:行者123 更新时间:2023-12-03 18:42:16 24 4
gpt4 key购买 nike

我需要开发一个休息服务 wirh Spring Security(版本 4.0.3。RELEASE)的安全性。

场景是:

  • 验证执行请求的客户端(客户端 ID + 客户端
    自定义 header 上的 token )
  • 如果出现错误,需要发送 JSON 响应

  • 我创建了一个自定义 OncePerRequestFilter它完成了读取自定义 token 的工作,就像它是 basic auth token 。
    public class MyClientAuthorizationFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    // omitting implementation
    }

    }

    然后我创建了自己的 AuthenticationEntryPoint这完成了在响应中写入 JSON 错误的工作。
    public class MyAuthorizationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
    // omitting implementation
    }

    }

    然后我像这样把它们连接起来:
    @Configuration
    @EnableWebSecurity
    public class WebApiSecurityConfig extends WebSecurityConfigurerAdapter implements TogatherWebApiCostants {

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

    private @Inject Environment environment;

    @Bean
    protected AuthenticationEntryPoint clientAuthorizationEntryPoint() {
    return new MyAuthorizationEntryPoint();
    }

    @Bean
    protected Filter clientAuthorizationFilter() {
    return new MyAuthorizationFilter();
    }

    /**
    * @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)
    */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    log.debug("Configuring HTTP security");

    // @formatter:on
    http
    .addFilterBefore(clientAuthorizationFilter(), BasicAuthenticationFilter.class)
    .exceptionHandling().authenticationEntryPoint(clientAuthorizationEntryPoint());
    // @formatter:off
    }

    }

    一切正常,除了自定义入口点。它没有被解雇,而且似乎 Spring 仍在使用默认的。我还尝试切换到 XML 配置(我更习惯于使用它而不是 JavaConfig 方法)但行为保持不变。

    谁能告诉我我做错了什么?

    注意:我尝试通过添加记录器来调试 Spring Security org.springframework.security级别设置为 debug ,但我没有看到任何日志消息

    ~~~~~~~~~~~~~~~

    编辑:添加当前的解决方法

    到目前为止,缺乏优雅的解决方案,我只是从过滤器中明确调用入口点。
    public class MyClientAuthorizationFilter extends OncePerRequestFilter {

    ...
    private @Inject AuthenticationEntryPoint entryPoint;
    ...

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    try {
    // omitting logic
    } catch(AuthenticationException ae) {
    SecurityContextHolder.clearContext();
    entryPoint.commence(request, response, ae);
    return;
    }
    }

    }

    最佳答案

    看起来您在 authenticationEntryPoint() 中传递了错误的对象的 WebApiSecurityConfig实现类,通过AuthenticationEntryPoint在这里的实现类对象 TogatherWebApiClientAuthorizationEntryPoint并检查您是否收到自定义错误。

    关于java - Spring security - 休息服务的自定义过滤器和入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52125934/

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