This is an automated email from the ASF dual-hosted git repository.

thenatog pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new a9b5bebb15 NIFI-10216 Refactored NiFi Web API Security Configuration
a9b5bebb15 is described below

commit a9b5bebb1545bfd555abaac43421309fa3d5f0be
Author: exceptionfactory <[email protected]>
AuthorDate: Wed Apr 20 10:11:52 2022 -0500

    NIFI-10216 Refactored NiFi Web API Security Configuration
    
    - Removed extension of deprecated WebSecurityConfigurerAdapter
    - Moved Filter bean configuration associated configuration classes
    - Set default Spring Security log level to INFO
    - Adjusted CSRF Token Repository to leverage simplified RequestUriBuilder 
for retrieving allowed context paths
    
    Signed-off-by: Nathan Gough <[email protected]>
    
    This closes #6195
---
 .../java/org/apache/nifi/web/util/WebUtils.java    |   2 +-
 .../src/main/resources/conf/logback.xml            |   4 +-
 .../nifi/web/NiFiWebApiSecurityConfiguration.java  | 302 ++++++---------------
 .../web/security/NiFiAuthenticationProvider.java   |  12 +-
 .../NiFiAnonymousAuthenticationFilter.java         |   5 -
 .../AuthenticationSecurityConfiguration.java       |  10 +
 .../JwtAuthenticationSecurityConfiguration.java    |  17 ++
 .../KnoxAuthenticationSecurityConfiguration.java   |  10 +
 .../X509AuthenticationSecurityConfiguration.java   |  12 +
 .../csrf/StandardCookieCsrfTokenRepository.java    |  15 +-
 .../StandardCookieCsrfTokenRepositoryTest.java     |  19 +-
 11 files changed, 147 insertions(+), 261 deletions(-)

diff --git 
a/nifi-commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/WebUtils.java
 
b/nifi-commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/WebUtils.java
index fc1fc08487..024570b140 100644
--- 
a/nifi-commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/WebUtils.java
+++ 
b/nifi-commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/WebUtils.java
@@ -128,7 +128,7 @@ public final class WebUtils {
 
         // Check it against the allowed list
         if (!allowedContextPaths.contains(determinedContextPath)) {
-            final String msg = "The provided context path [" + 
determinedContextPath + "] was not registered as allowed [" + 
allowedContextPaths + "]";
+            final String msg = "The provided context path [" + 
determinedContextPath + "] was not registered as allowed " + 
allowedContextPaths;
             throw new UriBuilderException(msg);
         }
     }
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/conf/logback.xml
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/conf/logback.xml
index fe60fbf6e7..507bbdd38f 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/conf/logback.xml
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/conf/logback.xml
@@ -128,6 +128,7 @@
 
     <!-- Suppress non-error messages due to excessive logging by class or 
library -->
     <logger name="org.springframework" level="ERROR"/>
+    <logger name="org.springframework.security" level="INFO"/>
 
     <!-- Suppress non-error messages due to known warning about redundant path 
annotation (NIFI-574) -->
     <logger name="org.glassfish.jersey.internal.Errors" level="ERROR"/>
@@ -173,9 +174,6 @@
     <logger name="org.apache.nifi.web.api.AccessResource" level="INFO" 
additivity="false">
         <appender-ref ref="USER_FILE"/>
     </logger>
-    <logger name="org.springframework.security.saml.log" level="WARN" 
additivity="false">
-        <appender-ref ref="USER_FILE"/>
-    </logger>
     <logger name="org.opensaml" level="WARN" additivity="false">
         <appender-ref ref="USER_FILE"/>
     </logger>
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiSecurityConfiguration.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiSecurityConfiguration.java
index 129435dce8..53f7be935c 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiSecurityConfiguration.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiSecurityConfiguration.java
@@ -18,115 +18,119 @@ package org.apache.nifi.web;
 
 import org.apache.nifi.util.NiFiProperties;
 import 
org.apache.nifi.web.security.anonymous.NiFiAnonymousAuthenticationFilter;
-import 
org.apache.nifi.web.security.anonymous.NiFiAnonymousAuthenticationProvider;
 import org.apache.nifi.web.security.csrf.CsrfCookieRequestMatcher;
 import org.apache.nifi.web.security.csrf.StandardCookieCsrfTokenRepository;
-import org.apache.nifi.web.security.jwt.provider.BearerTokenProvider;
-import org.apache.nifi.web.security.jwt.resolver.StandardBearerTokenResolver;
 import org.apache.nifi.web.security.knox.KnoxAuthenticationFilter;
-import org.apache.nifi.web.security.knox.KnoxAuthenticationProvider;
 import org.apache.nifi.web.security.log.AuthenticationUserFilter;
 import org.apache.nifi.web.security.oidc.OIDCEndpoints;
 import 
org.apache.nifi.web.security.saml2.web.authentication.logout.Saml2LocalLogoutFilter;
 import 
org.apache.nifi.web.security.saml2.web.authentication.logout.Saml2SingleLogoutFilter;
 import org.apache.nifi.web.security.x509.X509AuthenticationFilter;
-import org.apache.nifi.web.security.x509.X509AuthenticationProvider;
-import org.apache.nifi.web.security.x509.X509CertificateExtractor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpStatus;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.AuthenticationProvider;
-import 
org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.authentication.ProviderManager;
 import 
org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 import 
org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.builders.WebSecurity;
 import 
org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import 
org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.config.http.SessionCreationPolicy;
-import 
org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationProvider;
 import 
org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter;
-import 
org.springframework.security.oauth2.server.resource.web.BearerTokenResolver;
 import 
org.springframework.security.saml2.provider.service.servlet.filter.Saml2WebSsoAuthenticationFilter;
 import 
org.springframework.security.saml2.provider.service.servlet.filter.Saml2WebSsoAuthenticationRequestFilter;
 import 
org.springframework.security.saml2.provider.service.web.Saml2MetadataFilter;
 import 
org.springframework.security.saml2.provider.service.web.authentication.logout.Saml2LogoutRequestFilter;
 import 
org.springframework.security.saml2.provider.service.web.authentication.logout.Saml2LogoutResponseFilter;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.access.ExceptionTranslationFilter;
 import 
org.springframework.security.web.authentication.AnonymousAuthenticationFilter;
-import 
org.springframework.security.web.authentication.preauth.x509.X509PrincipalExtractor;
+import org.springframework.security.web.authentication.HttpStatusEntryPoint;
 import org.springframework.security.web.csrf.CsrfFilter;
 import org.springframework.security.web.util.matcher.AndRequestMatcher;
 
+import java.util.List;
+
 /**
- * NiFi Web Api Spring security. Applies the various NiFiAuthenticationFilter 
servlet filters which will extract authentication
- * credentials from API requests.
+ * Application Security Configuration using Spring Security
  */
 @Configuration
 @EnableWebSecurity
 @EnableGlobalMethodSecurity(prePostEnabled = true)
-public class NiFiWebApiSecurityConfiguration extends 
WebSecurityConfigurerAdapter {
-    private NiFiProperties properties;
-
-    private X509AuthenticationFilter x509AuthenticationFilter;
-    private X509CertificateExtractor certificateExtractor;
-    private X509PrincipalExtractor principalExtractor;
-    private X509AuthenticationProvider x509AuthenticationProvider;
-    private JwtAuthenticationProvider jwtAuthenticationProvider;
-
-    private KnoxAuthenticationFilter knoxAuthenticationFilter;
-    private KnoxAuthenticationProvider knoxAuthenticationProvider;
-
-    private NiFiAnonymousAuthenticationFilter anonymousAuthenticationFilter;
-    private NiFiAnonymousAuthenticationProvider 
anonymousAuthenticationProvider;
-
-    private BearerTokenProvider bearerTokenProvider;
-
-    private Saml2WebSsoAuthenticationFilter saml2WebSsoAuthenticationFilter;
-    private Saml2WebSsoAuthenticationRequestFilter 
saml2WebSsoAuthenticationRequestFilter;
-    private Saml2MetadataFilter saml2MetadataFilter;
-    private Saml2LogoutRequestFilter saml2LogoutRequestFilter;
-    private Saml2LogoutResponseFilter saml2LogoutResponseFilter;
-    private Saml2SingleLogoutFilter saml2SingleLogoutFilter;
-    private Saml2LocalLogoutFilter saml2LocalLogoutFilter;
-    private AuthenticationProvider openSamlAuthenticationProvider;
-
-    public NiFiWebApiSecurityConfiguration() {
-        super(true); // disable defaults
-    }
-
+public class NiFiWebApiSecurityConfiguration {
     /**
-     * Configure Web Security with ignoring matchers for authentication 
requests
+     * Spring Security Authentication Manager configured using Authentication 
Providers from specific configuration classes
      *
-     * @param webSecurity Spring Web Security Configuration
+     * @param authenticationProviders Autowired Authentication Providers
+     * @return Authentication Manager
      */
-    @Override
-    public void configure(final WebSecurity webSecurity) {
-        webSecurity
-                .ignoring()
-                    .antMatchers(
-                            "/access",
-                            "/access/config",
-                            "/access/token",
-                            "/access/kerberos",
-                            OIDCEndpoints.TOKEN_EXCHANGE,
-                            OIDCEndpoints.LOGIN_REQUEST,
-                            OIDCEndpoints.LOGIN_CALLBACK,
-                            OIDCEndpoints.LOGOUT_CALLBACK,
-                            "/access/knox/callback",
-                            "/access/knox/request",
-                            "/access/logout/complete");
+    @Bean
+    public AuthenticationManager authenticationManager(final 
List<AuthenticationProvider> authenticationProviders) {
+        return new ProviderManager(authenticationProviders);
     }
 
-    @Override
-    protected void configure(HttpSecurity http) throws Exception {
+    @Bean
+    public SecurityFilterChain securityFilterChain(
+            final HttpSecurity http,
+            final NiFiProperties properties,
+            final X509AuthenticationFilter x509AuthenticationFilter,
+            final BearerTokenAuthenticationFilter 
bearerTokenAuthenticationFilter,
+            final KnoxAuthenticationFilter knoxAuthenticationFilter,
+            final NiFiAnonymousAuthenticationFilter 
anonymousAuthenticationFilter,
+            final Saml2WebSsoAuthenticationFilter 
saml2WebSsoAuthenticationFilter,
+            final Saml2WebSsoAuthenticationRequestFilter 
saml2WebSsoAuthenticationRequestFilter,
+            final Saml2MetadataFilter saml2MetadataFilter,
+            final Saml2LogoutRequestFilter saml2LogoutRequestFilter,
+            final Saml2LogoutResponseFilter saml2LogoutResponseFilter,
+            final Saml2SingleLogoutFilter saml2SingleLogoutFilter,
+            final Saml2LocalLogoutFilter saml2LocalLogoutFilter
+    ) throws Exception {
         http
+                .logout().disable()
+                .anonymous().disable()
+                .requestCache().disable()
                 .rememberMe().disable()
-                .authorizeRequests().anyRequest().fullyAuthenticated().and()
-                
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
-                .csrf().requireCsrfProtectionMatcher(
-                        new AndRequestMatcher(CsrfFilter.DEFAULT_CSRF_MATCHER, 
new CsrfCookieRequestMatcher()))
-                        .csrfTokenRepository(new 
StandardCookieCsrfTokenRepository(properties.getAllowedContextPathsAsList()));
+                .sessionManagement().disable()
+                .headers().disable()
+                .servletApi().disable()
+                .securityContext().disable()
+                .authorizeHttpRequests(authorize -> authorize
+                        .antMatchers(
+                                "/access",
+                                "/access/config",
+                                "/access/token",
+                                "/access/kerberos",
+                                "/access/knox/callback",
+                                "/access/knox/request",
+                                "/access/logout/complete",
+                                OIDCEndpoints.TOKEN_EXCHANGE,
+                                OIDCEndpoints.LOGIN_REQUEST,
+                                OIDCEndpoints.LOGIN_CALLBACK,
+                                OIDCEndpoints.LOGOUT_CALLBACK
+                        ).permitAll()
+                        .anyRequest().authenticated()
+                )
+                .csrf(csrf -> csrf
+                        .csrfTokenRepository(
+                                new StandardCookieCsrfTokenRepository()
+                        )
+                        .requireCsrfProtectionMatcher(
+                                new 
AndRequestMatcher(CsrfFilter.DEFAULT_CSRF_MATCHER, new 
CsrfCookieRequestMatcher())
+                        )
+                )
+                .exceptionHandling(exceptionHandling -> exceptionHandling
+                        .authenticationEntryPoint(new 
HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))
+                )
+                .addFilterBefore(x509AuthenticationFilter, 
AnonymousAuthenticationFilter.class)
+                .addFilterBefore(bearerTokenAuthenticationFilter, 
AnonymousAuthenticationFilter.class)
+                .addFilterBefore(new AuthenticationUserFilter(), 
ExceptionTranslationFilter.class);
+
+        if (properties.isKnoxSsoEnabled()) {
+            http.addFilterBefore(knoxAuthenticationFilter, 
AnonymousAuthenticationFilter.class);
+        }
+
+        if (properties.isAnonymousAuthenticationAllowed()) {
+            http.addFilterAfter(anonymousAuthenticationFilter, 
AnonymousAuthenticationFilter.class);
+        }
 
         if (properties.isSamlEnabled()) {
             http.addFilterBefore(saml2WebSsoAuthenticationFilter, 
AnonymousAuthenticationFilter.class);
@@ -143,158 +147,6 @@ public class NiFiWebApiSecurityConfiguration extends 
WebSecurityConfigurerAdapte
             }
         }
 
-        http.addFilterBefore(x509FilterBean(), 
AnonymousAuthenticationFilter.class);
-        http.addFilterBefore(bearerTokenAuthenticationFilter(), 
AnonymousAuthenticationFilter.class);
-        http.addFilterBefore(knoxFilterBean(), 
AnonymousAuthenticationFilter.class);
-        http.addFilterAfter(anonymousFilterBean(), 
AnonymousAuthenticationFilter.class);
-        http.addFilterAfter(new AuthenticationUserFilter(), 
AnonymousAuthenticationFilter.class);
-
-        // disable default anonymous handling because it doesn't handle 
conditional authentication well
-        http.anonymous().disable();
-    }
-
-    @Bean
-    @Override
-    public AuthenticationManager authenticationManagerBean() throws Exception {
-        // override xxxBean method so the authentication manager is available 
in app context (necessary for the method level security)
-        return super.authenticationManagerBean();
-    }
-
-    @Override
-    protected void configure(AuthenticationManagerBuilder auth) throws 
Exception {
-        auth
-                .authenticationProvider(x509AuthenticationProvider)
-                .authenticationProvider(jwtAuthenticationProvider)
-                .authenticationProvider(knoxAuthenticationProvider)
-                .authenticationProvider(anonymousAuthenticationProvider);
-
-        if (properties.isSamlEnabled()) {
-            auth.authenticationProvider(openSamlAuthenticationProvider);
-        }
-    }
-
-    @Bean
-    public KnoxAuthenticationFilter knoxFilterBean() throws Exception {
-        if (knoxAuthenticationFilter == null) {
-            knoxAuthenticationFilter = new KnoxAuthenticationFilter();
-            knoxAuthenticationFilter.setProperties(properties);
-            
knoxAuthenticationFilter.setAuthenticationManager(authenticationManager());
-        }
-        return knoxAuthenticationFilter;
-    }
-
-    @Bean
-    public X509AuthenticationFilter x509FilterBean() throws Exception {
-        if (x509AuthenticationFilter == null) {
-            x509AuthenticationFilter = new X509AuthenticationFilter();
-            x509AuthenticationFilter.setProperties(properties);
-            
x509AuthenticationFilter.setCertificateExtractor(certificateExtractor);
-            x509AuthenticationFilter.setPrincipalExtractor(principalExtractor);
-            
x509AuthenticationFilter.setAuthenticationManager(authenticationManager());
-        }
-        return x509AuthenticationFilter;
-    }
-
-    @Bean
-    public BearerTokenAuthenticationFilter bearerTokenAuthenticationFilter() 
throws Exception {
-        final BearerTokenAuthenticationFilter filter = new 
BearerTokenAuthenticationFilter(authenticationManager());
-        filter.setBearerTokenResolver(bearerTokenResolver());
-        return filter;
-    }
-
-    @Bean
-    public BearerTokenResolver bearerTokenResolver() {
-        return new StandardBearerTokenResolver();
-    }
-
-    @Bean
-    public NiFiAnonymousAuthenticationFilter anonymousFilterBean() throws 
Exception {
-        if (anonymousAuthenticationFilter == null) {
-            anonymousAuthenticationFilter = new 
NiFiAnonymousAuthenticationFilter();
-            anonymousAuthenticationFilter.setProperties(properties);
-            
anonymousAuthenticationFilter.setAuthenticationManager(authenticationManager());
-        }
-        return anonymousAuthenticationFilter;
-    }
-
-    @Autowired
-    public void setProperties(NiFiProperties properties) {
-        this.properties = properties;
-    }
-
-    @Autowired
-    public void setJwtAuthenticationProvider(JwtAuthenticationProvider 
jwtAuthenticationProvider) {
-        this.jwtAuthenticationProvider = jwtAuthenticationProvider;
-    }
-
-    @Autowired
-    public void setKnoxAuthenticationProvider(KnoxAuthenticationProvider 
knoxAuthenticationProvider) {
-        this.knoxAuthenticationProvider = knoxAuthenticationProvider;
-    }
-
-    @Autowired
-    public void 
setAnonymousAuthenticationProvider(NiFiAnonymousAuthenticationProvider 
anonymousAuthenticationProvider) {
-        this.anonymousAuthenticationProvider = anonymousAuthenticationProvider;
-    }
-
-    @Autowired
-    public void setX509AuthenticationProvider(X509AuthenticationProvider 
x509AuthenticationProvider) {
-        this.x509AuthenticationProvider = x509AuthenticationProvider;
-    }
-
-    @Autowired
-    public void setCertificateExtractor(X509CertificateExtractor 
certificateExtractor) {
-        this.certificateExtractor = certificateExtractor;
-    }
-
-    @Autowired
-    public void setPrincipalExtractor(X509PrincipalExtractor 
principalExtractor) {
-        this.principalExtractor = principalExtractor;
-    }
-
-    @Autowired
-    public void setBearerTokenProvider(final BearerTokenProvider 
bearerTokenProvider) {
-        this.bearerTokenProvider = bearerTokenProvider;
-    }
-
-    @Autowired
-    public void setSaml2WebSsoAuthenticationFilter(final 
Saml2WebSsoAuthenticationFilter saml2WebSsoAuthenticationFilter) {
-        this.saml2WebSsoAuthenticationFilter = saml2WebSsoAuthenticationFilter;
-    }
-
-    @Autowired
-    public void setSaml2WebSsoAuthenticationRequestFilter(final 
Saml2WebSsoAuthenticationRequestFilter saml2WebSsoAuthenticationRequestFilter) {
-        this.saml2WebSsoAuthenticationRequestFilter = 
saml2WebSsoAuthenticationRequestFilter;
-    }
-
-    @Autowired
-    public void setSaml2MetadataFilter(final Saml2MetadataFilter 
saml2MetadataFilter) {
-        this.saml2MetadataFilter = saml2MetadataFilter;
-    }
-
-    @Autowired
-    public void setSaml2LogoutRequestFilter(final Saml2LogoutRequestFilter 
saml2LogoutRequestFilter) {
-        this.saml2LogoutRequestFilter = saml2LogoutRequestFilter;
-    }
-
-    @Autowired
-    public void setSaml2LogoutResponseFilter(final Saml2LogoutResponseFilter 
saml2LogoutResponseFilter) {
-        this.saml2LogoutResponseFilter = saml2LogoutResponseFilter;
-    }
-
-    @Autowired
-    public void setSaml2SingleLogoutFilter(final Saml2SingleLogoutFilter 
saml2SingleLogoutFilter) {
-        this.saml2SingleLogoutFilter = saml2SingleLogoutFilter;
-    }
-
-    @Autowired
-    public void setSaml2LocalLogoutFilter(final Saml2LocalLogoutFilter 
saml2LocalLogoutFilter) {
-        this.saml2LocalLogoutFilter = saml2LocalLogoutFilter;
-    }
-
-    @Qualifier("openSamlAuthenticationProvider")
-    @Autowired
-    public void setOpenSamlAuthenticationProvider(final AuthenticationProvider 
openSamlAuthenticationProvider) {
-        this.openSamlAuthenticationProvider = openSamlAuthenticationProvider;
+        return http.build();
     }
 }
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/NiFiAuthenticationProvider.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/NiFiAuthenticationProvider.java
index ec162c7303..398d88cf2d 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/NiFiAuthenticationProvider.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/NiFiAuthenticationProvider.java
@@ -21,8 +21,6 @@ import org.apache.nifi.authorization.util.IdentityMapping;
 import org.apache.nifi.authorization.util.IdentityMappingUtil;
 import org.apache.nifi.authorization.util.UserGroupUtil;
 import org.apache.nifi.util.NiFiProperties;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.security.authentication.AuthenticationProvider;
 
 import java.util.Collections;
@@ -34,17 +32,11 @@ import java.util.Set;
  */
 public abstract class NiFiAuthenticationProvider implements 
AuthenticationProvider {
 
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(NiFiAuthenticationProvider.class);
+    private final Authorizer authorizer;
 
-    private NiFiProperties properties;
-    private Authorizer authorizer;
-    private List<IdentityMapping> mappings;
+    private final List<IdentityMapping> mappings;
 
-    /**
-     * @param properties the NiFiProperties instance
-     */
     public NiFiAuthenticationProvider(final NiFiProperties properties, final 
Authorizer authorizer) {
-        this.properties = properties;
         this.mappings = 
Collections.unmodifiableList(IdentityMappingUtil.getIdentityMappings(properties));
         this.authorizer = authorizer;
     }
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/anonymous/NiFiAnonymousAuthenticationFilter.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/anonymous/NiFiAnonymousAuthenticationFilter.java
index 2565a58d6d..1136ba5b07 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/anonymous/NiFiAnonymousAuthenticationFilter.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/anonymous/NiFiAnonymousAuthenticationFilter.java
@@ -17,8 +17,6 @@
 package org.apache.nifi.web.security.anonymous;
 
 import org.apache.nifi.web.security.NiFiAuthenticationFilter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.security.core.Authentication;
 
 import javax.servlet.http.HttpServletRequest;
@@ -28,12 +26,9 @@ import javax.servlet.http.HttpServletRequest;
  */
 public class NiFiAnonymousAuthenticationFilter extends 
NiFiAuthenticationFilter {
 
-    private static final Logger logger = 
LoggerFactory.getLogger(NiFiAnonymousAuthenticationFilter.class);
-
     @Override
     public Authentication attemptAuthentication(final HttpServletRequest 
request) {
         // return the anonymous authentication request for this http request
         return new NiFiAnonymousAuthenticationRequestToken(request.isSecure(), 
request.getRemoteAddr());
     }
-
 }
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/AuthenticationSecurityConfiguration.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/AuthenticationSecurityConfiguration.java
index 85f025b369..dd41344361 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/AuthenticationSecurityConfiguration.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/AuthenticationSecurityConfiguration.java
@@ -19,6 +19,7 @@ package org.apache.nifi.web.security.configuration;
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.nar.ExtensionManager;
 import org.apache.nifi.util.NiFiProperties;
+import 
org.apache.nifi.web.security.anonymous.NiFiAnonymousAuthenticationFilter;
 import 
org.apache.nifi.web.security.anonymous.NiFiAnonymousAuthenticationProvider;
 import org.apache.nifi.web.security.logout.LogoutRequestManager;
 import org.apache.nifi.web.security.spring.LoginIdentityProviderFactoryBean;
@@ -26,6 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
+import org.springframework.security.authentication.AuthenticationManager;
 
 /**
  * Spring Configuration for Authentication Security
@@ -57,6 +59,14 @@ public class AuthenticationSecurityConfiguration {
         this.authorizer = authorizer;
     }
 
+    @Bean
+    public NiFiAnonymousAuthenticationFilter 
anonymousAuthenticationFilter(final AuthenticationManager 
authenticationManager) {
+        final NiFiAnonymousAuthenticationFilter anonymousAuthenticationFilter 
= new NiFiAnonymousAuthenticationFilter();
+        anonymousAuthenticationFilter.setProperties(niFiProperties);
+        
anonymousAuthenticationFilter.setAuthenticationManager(authenticationManager);
+        return anonymousAuthenticationFilter;
+    }
+
     @Bean
     public LoginIdentityProviderFactoryBean loginIdentityProviderFactoryBean() 
{
         final LoginIdentityProviderFactoryBean 
loginIdentityProviderFactoryBean = new LoginIdentityProviderFactoryBean();
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtAuthenticationSecurityConfiguration.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtAuthenticationSecurityConfiguration.java
index 7a88a722f2..c89c437ba2 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtAuthenticationSecurityConfiguration.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtAuthenticationSecurityConfiguration.java
@@ -38,6 +38,7 @@ import 
org.apache.nifi.web.security.jwt.key.service.VerificationKeyService;
 import org.apache.nifi.web.security.jwt.provider.BearerTokenProvider;
 import org.apache.nifi.web.security.jwt.provider.StandardBearerTokenProvider;
 import org.apache.nifi.web.security.jwt.provider.SupportedClaim;
+import org.apache.nifi.web.security.jwt.resolver.StandardBearerTokenResolver;
 import org.apache.nifi.web.security.jwt.revocation.JwtLogoutListener;
 import org.apache.nifi.web.security.jwt.revocation.JwtRevocationService;
 import org.apache.nifi.web.security.jwt.revocation.JwtRevocationValidator;
@@ -48,6 +49,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.oauth2.core.DelegatingOAuth2TokenValidator;
 import org.springframework.security.oauth2.core.OAuth2TokenValidator;
 import org.springframework.security.oauth2.jwt.Jwt;
@@ -55,6 +57,8 @@ import org.springframework.security.oauth2.jwt.JwtDecoder;
 import org.springframework.security.oauth2.jwt.JwtValidators;
 import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
 import 
org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationProvider;
+import 
org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter;
+import 
org.springframework.security.oauth2.server.resource.web.BearerTokenResolver;
 
 import java.time.Duration;
 import java.util.Arrays;
@@ -100,6 +104,19 @@ public class JwtAuthenticationSecurityConfiguration {
         this.keyRotationPeriod = 
niFiProperties.getSecurityUserJwsKeyRotationPeriod();
     }
 
+
+    @Bean
+    public BearerTokenAuthenticationFilter 
bearerTokenAuthenticationFilter(final AuthenticationManager 
authenticationManager) {
+        final BearerTokenAuthenticationFilter bearerTokenAuthenticationFilter 
= new BearerTokenAuthenticationFilter(authenticationManager);
+        
bearerTokenAuthenticationFilter.setBearerTokenResolver(bearerTokenResolver());
+        return bearerTokenAuthenticationFilter;
+    }
+
+    @Bean
+    public BearerTokenResolver bearerTokenResolver() {
+        return new StandardBearerTokenResolver();
+    }
+
     @Bean
     public JwtAuthenticationProvider jwtAuthenticationProvider() {
         final JwtAuthenticationProvider jwtAuthenticationProvider = new 
JwtAuthenticationProvider(jwtDecoder());
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/KnoxAuthenticationSecurityConfiguration.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/KnoxAuthenticationSecurityConfiguration.java
index c752bc70ce..da01fecfab 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/KnoxAuthenticationSecurityConfiguration.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/KnoxAuthenticationSecurityConfiguration.java
@@ -18,12 +18,14 @@ package org.apache.nifi.web.security.configuration;
 
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.util.NiFiProperties;
+import org.apache.nifi.web.security.knox.KnoxAuthenticationFilter;
 import org.apache.nifi.web.security.knox.KnoxAuthenticationProvider;
 import org.apache.nifi.web.security.knox.KnoxService;
 import org.apache.nifi.web.security.knox.KnoxServiceFactoryBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
 
 /**
  * Knox Configuration for Authentication Security
@@ -43,6 +45,14 @@ public class KnoxAuthenticationSecurityConfiguration {
         this.authorizer = authorizer;
     }
 
+    @Bean
+    public KnoxAuthenticationFilter knoxAuthenticationFilter(final 
AuthenticationManager authenticationManager) {
+        final KnoxAuthenticationFilter knoxAuthenticationFilter = new 
KnoxAuthenticationFilter();
+        
knoxAuthenticationFilter.setAuthenticationManager(authenticationManager);
+        knoxAuthenticationFilter.setProperties(niFiProperties);
+        return knoxAuthenticationFilter;
+    }
+
     @Bean
     public KnoxAuthenticationProvider knoxAuthenticationProvider() {
         return new KnoxAuthenticationProvider(knoxService(), niFiProperties, 
authorizer);
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/X509AuthenticationSecurityConfiguration.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/X509AuthenticationSecurityConfiguration.java
index 7e668c50f9..5650096113 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/X509AuthenticationSecurityConfiguration.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/X509AuthenticationSecurityConfiguration.java
@@ -19,6 +19,7 @@ package org.apache.nifi.web.security.configuration;
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.util.NiFiProperties;
 import org.apache.nifi.web.security.x509.SubjectDnX509PrincipalExtractor;
+import org.apache.nifi.web.security.x509.X509AuthenticationFilter;
 import org.apache.nifi.web.security.x509.X509AuthenticationProvider;
 import org.apache.nifi.web.security.x509.X509CertificateExtractor;
 import org.apache.nifi.web.security.x509.X509CertificateValidator;
@@ -27,6 +28,7 @@ import 
org.apache.nifi.web.security.x509.ocsp.OcspCertificateValidator;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
 import 
org.springframework.security.web.authentication.preauth.x509.X509PrincipalExtractor;
 
 /**
@@ -47,6 +49,16 @@ public class X509AuthenticationSecurityConfiguration {
         this.authorizer = authorizer;
     }
 
+    @Bean
+    public X509AuthenticationFilter x509AuthenticationFilter(final 
AuthenticationManager authenticationManager) {
+        final X509AuthenticationFilter x509AuthenticationFilter = new 
X509AuthenticationFilter();
+        x509AuthenticationFilter.setProperties(niFiProperties);
+        
x509AuthenticationFilter.setCertificateExtractor(certificateExtractor());
+        x509AuthenticationFilter.setPrincipalExtractor(principalExtractor());
+        
x509AuthenticationFilter.setAuthenticationManager(authenticationManager);
+        return x509AuthenticationFilter;
+    }
+
     @Bean
     public X509AuthenticationProvider x509AuthenticationProvider() {
         return new X509AuthenticationProvider(certificateIdentityProvider(), 
authorizer, niFiProperties);
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/csrf/StandardCookieCsrfTokenRepository.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/csrf/StandardCookieCsrfTokenRepository.java
index eef4e67e8b..9e5d64b9aa 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/csrf/StandardCookieCsrfTokenRepository.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/csrf/StandardCookieCsrfTokenRepository.java
@@ -29,8 +29,6 @@ import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.net.URI;
-import java.util.List;
-import java.util.Objects;
 import java.util.UUID;
 
 /**
@@ -49,17 +47,6 @@ public class StandardCookieCsrfTokenRepository implements 
CsrfTokenRepository {
 
     private static final int MAX_AGE_SESSION = -1;
 
-    private final List<String> allowedContextPaths;
-
-    /**
-     * Standard Cookie CSRF Token Repository with list of allowed context 
paths from proxy headers
-     *
-     * @param allowedContextPaths Allowed context paths from proxy headers
-     */
-    public StandardCookieCsrfTokenRepository(final List<String> 
allowedContextPaths) {
-        this.allowedContextPaths = Objects.requireNonNull(allowedContextPaths, 
"Allowed Context Paths required");
-    }
-
     /**
      * Generate CSRF Token or return current Token when present in HTTP 
Servlet Request Cookie header
      *
@@ -118,7 +105,7 @@ public class StandardCookieCsrfTokenRepository implements 
CsrfTokenRepository {
     }
 
     private String getCookiePath(final HttpServletRequest httpServletRequest) {
-        final RequestUriBuilder requestUriBuilder = 
RequestUriBuilder.fromHttpServletRequest(httpServletRequest, 
allowedContextPaths);
+        final RequestUriBuilder requestUriBuilder = 
RequestUriBuilder.fromHttpServletRequest(httpServletRequest);
         requestUriBuilder.path(ROOT_PATH);
         final URI uri = requestUriBuilder.build();
         return uri.getPath();
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/csrf/StandardCookieCsrfTokenRepositoryTest.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/csrf/StandardCookieCsrfTokenRepositoryTest.java
index 062417e56a..9616d95bcc 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/csrf/StandardCookieCsrfTokenRepositoryTest.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/csrf/StandardCookieCsrfTokenRepositoryTest.java
@@ -27,11 +27,11 @@ import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.springframework.security.web.csrf.CsrfToken;
 
+import javax.servlet.ServletContext;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import java.util.Collections;
 import java.util.UUID;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -45,6 +45,8 @@ import static org.mockito.Mockito.when;
 
 @ExtendWith(MockitoExtension.class)
 public class StandardCookieCsrfTokenRepositoryTest {
+    private static final String ALLOWED_CONTEXT_PATHS_PARAMETER = 
"allowedContextPaths";
+
     private static final int MAX_AGE_SESSION = -1;
 
     private static final int MAX_AGE_EXPIRED = 0;
@@ -69,6 +71,9 @@ public class StandardCookieCsrfTokenRepositoryTest {
     @Mock
     private HttpServletResponse response;
 
+    @Mock
+    private ServletContext servletContext;
+
     @Captor
     private ArgumentCaptor<Cookie> cookieArgumentCaptor;
 
@@ -76,7 +81,7 @@ public class StandardCookieCsrfTokenRepositoryTest {
 
     @BeforeEach
     public void setRepository() {
-        this.repository = new 
StandardCookieCsrfTokenRepository(Collections.emptyList());
+        this.repository = new StandardCookieCsrfTokenRepository();
     }
 
     @Test
@@ -110,6 +115,8 @@ public class StandardCookieCsrfTokenRepositoryTest {
 
     @Test
     public void testSaveToken() {
+        when(request.getServletContext()).thenReturn(servletContext);
+
         final CsrfToken csrfToken = repository.generateToken(request);
         repository.saveToken(csrfToken, request, response);
 
@@ -121,6 +128,8 @@ public class StandardCookieCsrfTokenRepositoryTest {
 
     @Test
     public void testSaveTokenNullCsrfToken() {
+        when(request.getServletContext()).thenReturn(servletContext);
+
         repository.saveToken(null, request, response);
 
         verify(response).addCookie(cookieArgumentCaptor.capture());
@@ -135,13 +144,17 @@ public class StandardCookieCsrfTokenRepositoryTest {
 
     @Test
     public void testSaveTokenProxyContextPath() {
-        this.repository = new 
StandardCookieCsrfTokenRepository(Collections.singletonList(CONTEXT_PATH));
+        this.repository = new StandardCookieCsrfTokenRepository();
 
         final CsrfToken csrfToken = repository.generateToken(request);
         
when(request.getHeader(eq(WebUtils.PROXY_SCHEME_HTTP_HEADER))).thenReturn(HTTPS);
         
when(request.getHeader(eq(WebUtils.PROXY_HOST_HTTP_HEADER))).thenReturn(HOST);
         
when(request.getHeader(eq(WebUtils.PROXY_PORT_HTTP_HEADER))).thenReturn(PORT);
         
when(request.getHeader(eq(WebUtils.PROXY_CONTEXT_PATH_HTTP_HEADER))).thenReturn(CONTEXT_PATH);
+
+        
when(servletContext.getInitParameter(eq(ALLOWED_CONTEXT_PATHS_PARAMETER))).thenReturn(CONTEXT_PATH);
+        when(request.getServletContext()).thenReturn(servletContext);
+
         repository.saveToken(csrfToken, request, response);
 
         verify(response).addCookie(cookieArgumentCaptor.capture());

Reply via email to