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

标签 java spring spring-security

我需要开发一个休息服务 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/

    相关文章:

    java - 如何在Unity3d中调用java的非静态void方法?

    java - 从数据库获取数据时出现 NullPointerException,使用注解在 Struts 2 中调用 Action

    java - withings API 的 Oauth 签名失败

    spring - 以编程方式控制 @RestController 可用性

    java - React 登录页面(客户端)和 spring boot/security(服务器端)

    java - 我的 spring 安全代码没有使用静态资源,如 css、js 和图像文件夹

    java - 启动画面和 Intent

    java - 如何将应用程序 apk 传递到 jar?

    Spring Data REST 分页

    java - Spring Security SAML2 为它们动态选择 IDP 或动态 URL