代码之家  ›  专栏  ›  技术社区  ›  Sunny Agarwal

如果在OAuth2弹簧安全性的头中没有传递令牌,为什么过滤器链会继续?

  •  2
  • Sunny Agarwal  · 技术社区  · 11 年前

    我正在尝试使用OAuth2和spring安全性,配置xml如下:

        <http pattern="/oauth/token" create-session="stateless" authentication-manager-ref="oauthUserAuthenticationManager"
          xmlns="http://www.springframework.org/schema/security">
        <intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY"/>
        <anonymous enabled="false"/>
        <http-basic entry-point-ref="clientAuthenticationEntryPoint"/>
        <custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER"/>
    </http>
    <http auto-config="true" pattern="/services/rest/**" create-session="never" entry-point-ref="oauthAuthenticationEntryPoint"
          xmlns="http://www.springframework.org/schema/security">
        <anonymous enabled="false"/>
        <intercept-url pattern="/services/rest/**"/>
        <custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER"/>
        <access-denied-handler ref="oauthAccessDeniedHandler"/>
    </http>
    

    我成功生成了令牌。现在,在尝试访问受保护的资源时,如果我在头中传递令牌,一切都正常。 但如果我不传递令牌,安全性就会被绕过。

    我检查了OAuth2AuthenticationProcessingFilter的代码:

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
            ServletException {
    
        final boolean debug = logger.isDebugEnabled();
        final HttpServletRequest request = (HttpServletRequest) req;
        final HttpServletResponse response = (HttpServletResponse) res;
    
        try {
    
            Authentication authentication = tokenExtractor.extract(request);
    
            if (authentication == null) { // If token is null, do nothing
                if (debug) {
                    logger.debug("No token in request, will continue chain.");
                }
            }
            else {
                request.setAttribute(OAuth2AuthenticationDetails.ACCESS_TOKEN_VALUE, authentication.getPrincipal());
                if (authentication instanceof AbstractAuthenticationToken) {
                    AbstractAuthenticationToken needsDetails = (AbstractAuthenticationToken) authentication;
                    needsDetails.setDetails(authenticationDetailsSource.buildDetails(request));                 
                }
                Authentication authResult = authenticationManager.authenticate(authentication);
    
                if (debug) {
                    logger.debug("Authentication success: " + authResult);
                }
    
                SecurityContextHolder.getContext().setAuthentication(authResult);
    
            }
        }
        catch (OAuth2Exception failed) {
            SecurityContextHolder.clearContext();
    
            if (debug) {
                logger.debug("Authentication request failed: " + failed);
            }
    
            authenticationEntryPoint.commence(request, response,
                    new InsufficientAuthenticationException(failed.getMessage(), failed));
    
            return;
        }
    
        chain.doFilter(request, response);
    }
    

    如果令牌不存在,为什么这个过滤器会跳过安全性?我是否应该添加其他过滤器来处理这种情况?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Dave Syer    11 年前

    尝试

    <intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY"/>
    
    推荐文章