当前位置: 首页 > 知识库问答 >
问题:

如何在spring security中同时实现AuthenticationEntryPoint和AuthenticationProvider

曾实
2023-03-14

嗨,Spring Security专家。

我的要求。

我有两套UI。其中一组是登录和注销,需要使用基本身份验证(使用用户名密码凭据)由spring security进行保护。我使用了HybridAuthenticationProvider实现AuthenticationProvider,并实现了它。

第二个和其余的UI需要通过在HTTP Header中传递令牌来支持。我使用CustomAuthentiationEntryPoint实现AuthenticationEntryPointGenericFilterBean并且可以实现它。

现在我想做单Spring安全。xml实现上述两种功能。最终,我将一组UI页面组合在一起,在这些页面中,我希望通过凭证(AuthenticationProvider)保护登录/注销页面,而我希望通过令牌(AuthenticationEntryPoint)保护其余UI。

当我把所有的一切都放在Spring的安全。xml(如下所述),我得到以下异常。

例外情况:

异常是org.springframework.beans.factory.BeanCreationException:创建名为'org.springframework.security.web.authentication.UsernamePasswordAuthentiationFilter#0'的bean时出错:无法解析对bean'org.springframework.security.authentication.ProviderManager#0'的引用,同时设置bean属性'身份验证管理器';嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'org.springframework.security.authentication.ProviderManager#0'的bean时出错:无法解析org.springframework.beans.factory.support.的匹配构造函数(提示:为简单参数指定index/type/name参数以避免类型歧义)BeanDecitionValueResolver.resolve参考(BeanDecitionValueResolver.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时出错:初始化方法调用失败;嵌套异常java.lang.IllegalArgumentException:在过滤器链中的其他模式之前定义了通用匹配模式 ('/**') ,导致它们被忽略。请检查安全性中的顺序:http命名空间或FilterChainProxy bean配置

共有1个答案

强阳曜
2023-03-14

您有此异常,因为超文本传输协议元素的de"模式"属性默认为 "/**". 由于您有两个没有特定模式的"超文本传输协议"元素,因此采用默认值,并且它们各自涵盖相同的uis集。

尝试在两者上添加不同的图案:

<http pattern="/foo/**" ... >
  ...
</http>

<http pattern="/bar/**" ... >
  ...
</http>
 类似资料:
  • 在WAR的情况下,它试图将请求转发到/error页面,并寻找它的处理程序方法(请参见底部的日志)。 最后我得到以下回应: 我该换什么才能得到401?

  • 在Java,你可以做这样的事情: 在Kotlin有可能做同样的事情吗?假设是抽象的,并且不实现

  • 我的环境:windows10和python 3.6 目的:我想建立一个在线聊天室,当客户端连接到服务器上,并向服务器发送消息时,服务器将向所有与它有联系的客户端广播消息。 关键点:所以有一个问题,我想让客户机监听服务器,同时等待输入。(代码发布在下面) 我的解决方案:当我试图通过python的线程来解决这个问题时,结果是,假设客户机A和客户机B都连接到服务器,并且客户机A发送多条消息,而客户机B只

  • 问题内容: 我想拥有一个在Java中同时实现Map和List接口的对象。这个想法与以下问题类似:Java OrderedMap 我想将名称/值对添加到列表中,并让列表保留序列,但还可以按名称进行查找: 这是问题所在:创建此类时: 我收到一个编译错误: 如果我没有实现Map和List接口,那么有很多Java集合方法无法在此数据结构上使用。 (此外,上面的Java Ordered Map中提出的解决方

  • 问题内容: 在Java中,您可以执行以下操作: 在Kotlin中可以做同样的事情吗?假设是抽象的并且没有实现 问题答案: 接口实现和类继承之间在语法上没有区别。只需列出冒号后用逗号分隔的所有类型,如下所示: 禁止多个类继承,而单个类可以实现多个接口。

  • 我们的软件使用api(filenet p8),需要配置log4j。我们使用logBack和Spring Boot。我注意到,要在Spring Boot中使用log4j,我们必须排除logBack。这是不可能的。有没有办法在Spring Boot中并行运行log4j和logBack?谢啦