gpt4 book ai didi

java - 在 Karaf 的 JAX-RS 包上使用 Spring Security

转载 作者:IT老高 更新时间:2023-10-28 20:42:22 28 4
gpt4 key购买 nike

我有一个 OSGi 包,它使用 JAX-RS 来处理一些 REST 服务。此 bundle 在带有 Apache CXF 的 Karaf 中运行。我需要对某些路径/方法组合应用基本的 http 身份验证。我一直在修改 Spring Security,看起来新的 3.1 版本可以让你做到这一点,但是我在 OSGi 中工作时遇到了很多麻烦。

作为一个测试,我创建了一个非常简单的 beans.xml 文件:

<beans>
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-http.xml"/>
<import resource="classpath:META-INF/cxf/osgi/cxf-extension-osgi.xml"/>

<jaxrs:server id="serverTest" address="/test">
<jaxrs:serviceBeans>
<ref bean="tstSvr"/>
</jaxrs:serviceBeans>
</jaxrs:server>

<bean id="tstSvr" class="com.demo.Test"/>

<security:http auto-config="true">
<security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" method="PUT" />
<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>

<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="user" password="pass" authorities="ROLE_USER"/>
<security:user name="admin" password="pass" authorities="ROLE_ADMIN"/>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
</beans>

现在,有趣的部分来了……从我一直在做的所有阅读中,我需要一个 web.xml 来让这些工作。例如我尝试使用的这个示例:

<web-app>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

使用这两个文件的组合不起作用。 “没用”,我的意思是什么都没发生。没有错误消息,没有异常, bundle 的功能就像我尝试添加 Spring 安全性之前一样。我假设问题是捆绑需要是 WAR 或 WAB 才能加载 web.xml。这是正确的吗?

更重要的是,有没有办法让 spring 在没有 web.xml 的情况下工作?

我正在假设我需要将 bundle 保留为 bundle 以供 CXF 加载,因此我无法将其转换为 WAR 或 WAB,但我不确定情况是否如此。

感谢您提供的任何帮助!

更新:在做了一堆额外的谷歌搜索后,我找到了 forum post提到将 Web-FilterMappings: springSecurityFilterChain;url-patterns:="/*" 添加到 list 中,而不是使用 web.xml。但是,您似乎仍然需要使用 WAB 而不是普通 bundle 。我已将该行添加到我的 list 中以防万一,但它没有效果。看来我的问题正在变成:如何将 WAB 与 CXF 一起使用?

更新 2:因为这个问题还不够长......我决定尝试使用 Spring Security 注释而不是拦截 URL 只是为了看看会发生什么。当我尝试访问安全路径时,我得到了这个有趣的堆栈跟踪:

Caused by: org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:323)
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:196)
at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)[46:org.springframework.aop:3.0.5.RELEASE]

spring 网站表示,第一次尝试匿名连接到安全服务时会发生这种情况,第二次不会发生这种情况。好吧,它每次都发生在我身上。从异常(exception)情况来看,我在 list 中的条目似乎正在被拾取,并且问题可能与我想象的不同。有人对为什么会这样有任何想法吗?我是否缺少 beans.xml 中的一些条目以使基本的 http auth 工作?

最佳答案

首先你需要清楚地了解spring和web.xml是做什么的。

  • Web.xml 是配置 servlet 容器的标准文件,通常是 Jboss、Glassifsh、Jetty、Tomcat 等应用服务器...
  • 你的 beans.xml 是 spring 应用程序上下文的配置文件,看到你没有为它使用任何命名空间,这意味着 Karaf 使用 spring oob。

如果你想使用 servlet 做 Http,没有容器,我想你必须注册一个 HttpService,见:http://karaf.apache.org/manual/latest-2.2.x/users-guide/http.html

您的异常发生了,因为当它到达映射方法时,SecurityContext 中没有 Authentication bean。你没有在你的映射中定义任何匿名访问,也许这就是它失败的原因。

基本上,要么定义一个 AnonymousAuthenticationFilter,要么在你的 http 配置中定义一个带有 permitAll 的 URL 模式。否则,当您第一次尝试匿名连接同一 session 时,您将不断收到该异常。

关于java - 在 Karaf 的 JAX-RS 包上使用 Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6681904/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com