1

我需要以这种方式自定义我的身份验证过程:

  1. 客户端使用“特殊” URL 参数发送请求(REST API)
  2. 服务器调用第三方服务传递参数并接收用户名
  3. 服务器按名称查找数据库,这是经过身份验证的主体。

我将我的服务器端 (2+3) 分成两部分 - (2) 的自定义过滤器,它获取用户名 - 和一个自定义userdetailservice的 for(3),它通过在数据库中查找名称来构建主体。

但我无法security.xml正确构建我的 - 每次似乎它根本不处理过滤器。我认为问题出在第一个(http)节点上,但我不明白应该为过滤器设置什么位置。这是我的配置:

<http use-expressions="true" auto-config="true" authentication-manager-ref="authenticationManager">
    <intercept-url pattern="/*" access="isAuthenticated" />
    <custom-filter ref="casServiceTicketFilter" position="FIRST"/>
</http>

<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="wliAuthenticationService"/>
</authentication-manager>

<b:bean id="casServiceTicketFilter" class="org.WLICASAuthenticationFilter">
    <b:property name="casTicketValidateURL" value="${cas.ticket.validate.url}"/>
    <b:property name="authenticationManager" ref="authenticationManager"/>
</b:bean>

<b:bean id="wliAuthenticationService" class="org.WLIUserDetailService"/>

PS-请不要告诉我 Spring 具有开箱即用的 CAS 支持。配置有点不同,所以我需要创建自己的服务票证验证器实现

4

1 回答 1

2

您的自定义身份验证过滤器不应位于过滤器链的首位。它需要在SecurityContextPersistenceFilter. 采用

<custom-filter ref="casServiceTicketFilter" after="SECURITY_CONTEXT_FILTER"/>

反而。

如果启用调试日志记录,您应该能够清楚地看到每个请求调用过滤器的顺序以及是否调用了您的过滤器。

于 2013-07-23T13:34:31.697 回答