嗨 Spring Security 专家。
我的要求。
我有两组用户界面。一组是登录和注销,需要使用基本身份验证(使用用户名密码凭据)由 spring security 保护。我使用 HybridAuthenticationProvider
实现AuthenticationProvider
并实现了它。
第二个和其余的 UI 需要通过在 HTTP Header 中传递令牌来支持。我使用CustomAuthenticationEntryPoint
实现AuthenticationEntryPoint
+GenericFilterBean
并且可以实现它。
现在我想制作单个 spring-security.xml 来实现以上两个功能。最终,我结合了一组 UI 页面,其中我想通过凭据 ( AuthenticationProvider
) 保护登录/注销页面和我想用令牌 ( AuthenticationEntryPoint
) 保护的其余 UI。
当我将所有内容放在 spring-security.xml 中(如下所述)时,我得到以下异常。
例外 :
例外是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0' 的 bean 时出错:无法解析对 bean 'org.springframework.security.authentication.ProviderManager#0 的引用' 同时设置 bean 属性 'authenticationManager'; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“org.springframework.security.authentication.ProviderManager#0”的 bean 时出错:无法解析匹配的构造函数(提示:为简单参数指定索引/类型/名称参数避免类型歧义)在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
示例 Spring-security.xml
<security:http auto-config="true" authentication-manager-ref="hybridAuthenticationProvider">
<security:intercept-url pattern="/auth/login" access="ROLE_USER" />
</security:http>
<security:http realm="Protected API" use-expressions="true"
auto-config="false" create-session="stateless" entry-point-ref="CustomAuthenticationEntryPoint">
<security:custom-filter ref="authenticationTokenProcessingFilter"
position="FORM_LOGIN_FILTER" />
<security:intercept-url pattern="/welcome"
access="isAuthenticated()" />
</security:http>
<bean id="CustomAuthenticationEntryPoint"
class="com.ckatudia.tutorial.authentrypoint.CustomAuthenticationEntryPoint" />
<bean id="authenticationTokenProcessingFilter"
class="com.ckatudia.tutorial.authentrypoint.AuthenticationTokenProcessingFilter" />
<bean id="TokenUtils"
class="com.ckatudia.tutorial.authentrypoint.TokenUtils" />
<bean id="authenticationManager"
class="com.ckatudia.tutorial.auth.TokenAuthenticationProvider" />
<bean id="hybridAuthenticationProvider"
class="com.ckatudia.tutorial.auth.HybridAuthenticationProvider">
</bean>
<security:authentication-manager>
<security:authentication-provider ref="hybridAuthenticationProvider"/>
</security:authentication-manager>
我删除了 authentication-manager-ref="hybridAuthenticationProvider" 然后我在部署时遇到了以下异常。
例外 :
org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.security.filterChainProxy”的bean时出错:调用init方法失败;嵌套异常是 java.lang.IllegalArgumentException:通用匹配模式 ('/**') 在过滤器链中的其他模式之前定义,导致它们被忽略。请检查您的安全性中的顺序:http 命名空间或 FilterChainProxy bean 配置