CORS Filter before Authentication Filter - is less secure?Spring Security Filter Chain Order

i86rm4rw  于 2023-04-10  发布在  Spring
关注(0)|答案(2)|浏览(163)

我发现在从单页应用程序访问ReST服务时,为了正确地允许访问ReST端点,我必须在身份验证过滤器之前注册CORS过滤器。这是不太安全还是安全性较差?
我的安全配置现在看起来像

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Inject
    public void setUserDetailsService(UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }

    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder.userDetailsService(userDetailsService)
                .passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
           .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .antMatchers("/health","/metrics", "/v1/users/register", "/swagger-ui/**", "/v2/api-docs").permitAll()
                .antMatchers("/mappings", "/v1/**", "/backend-service/**").authenticated()
                .and()
            .httpBasic()
                .realmName("serviceGateway")
                .and()
            .csrf()
                .disable()
            .headers()
                .frameOptions().disable()
            .and().addFilterBefore(new SimpleCORSFilter(), ChannelProcessingFilter.class);
    }

}

我的SimpleCORSFilter看起来像

public class SimpleCORSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /**
     * This method adds specific headers to the HTTP request to enable CORS
     * requests
     * @param request
     * @param response
     * @param chain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Access-Control-Allow-Origin", "*");
        res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        res.setHeader("Access-Control-Max-Age", "3600");
        res.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, Accept, x-requested-with, Cache-Control");
        chain.doFilter(request, res);
    }

    @Override
    public void destroy() {

    }
}

我在Angular中通过一个简单的$http调用访问代码

$scope.login = function() {
  $http({
    method: 'GET',
    url: 'https://myservice.mydomain.com:8095/v1/users/login',
    headers: {
      'Authorization': 'Basic ' + btoa("username:password")
    }
  })
    .then(successCallback);
};

我认为将CORS过滤器放在安全性之前只意味着CORS头将被添加到每个请求中,这看起来不像是一个安全漏洞,因为我在头中没有发送敏感数据,除了Authorization头。
我是在思考还是有什么我没看到的?

68bkxrlz

68bkxrlz1#

实际上,当你的JavaScript代码发布到另一个来源的资源时,浏览器会发出一个pre-flight请求(OPTIONS动词),而不带authorization头。
如果您的身份验证代码在CORS处理程序之前运行,则必须对此请求进行例外处理,以避免在pre-flight上返回401 Unauthorized

j13ufse2

j13ufse22#

在preflight选项请求中,从浏览器中我们永远不会得到auth令牌,因此在检查身份验证之前添加cors过滤器应该没问题

相关问题