我正在使用Jersey RESTful应用程序构建一个带有Spring Security的身份验证层。 Jersey应用程序是一个“版本化”API,它根据Content-Type
路由到正确的版本处理程序。
我的问题是:由于不同的API版本将具有不同的身份验证机制,在Spring Security中处理此问题的最佳方法是什么?我是否应该为每种身份验证机制使用不同的AuthenticationFilter
?我是否应该在Spring Security层构建知识,其中AuthenticationFilter
应该应用于每个版本(Content-Type
)?
谢谢!
答案 0 :(得分:2)
您可以为不同的API版本定义不同的过滤器链,并使用RequestMatcher
根据请求的Content-Type
标头进行匹配。
<bean id="apiV1Matcher" class="org.springframework.security.web.util.ELRequestMatcher">
<constructor-arg value="hasHeader('Content-Type','<pattern for api v1>')"/>
</bean>
<bean id="apiV2Matcher" class="org.springframework.security.web.util.ELRequestMatcher">
<constructor-arg value="hasHeader('Content-Type','<pattern for api v2>')"/>
</bean>
<security:http request-matcher-ref="apiV1Matcher" ...>
<!-- config for api v1 requests -->
</security:http>
<security:http request-matcher-ref="apiV2Matcher" ...>
<!-- config for api v2 requests -->
</security:http>
如果导致重复过多,请尽可能使用命名空间配置并在过滤器链之间共享bean。