【问题标题】:Spring Security 3.0.3 and custom authentication processing filterSpring Security 3.0.3 和自定义认证处理过滤器
【发布时间】:2011-05-07 23:34:58
【问题描述】:

我使用 Spring Security 3.0.3.RELEASE。我想创建一个自定义身份验证处理过滤器。

我创建了一个这样的过滤器:

// imports ommited
public class myFilter extends AbstractAuthenticationProcessingFilter {
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
        // some code here
    }
}

我通过以下方式配置我的security.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:beans="http://www.springframework.org/schema/beans"
         xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/security
         http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <http auto-config="true">
        <!--<session-management session-fixation-protection="none"/>-->
        <custom-filter ref="ipFilter" before="FORM_LOGIN_FILTER"/>
        <intercept-url pattern="/login.jsp*" filters="none"/>
        <intercept-url pattern="/**" access="ROLE_USER"/>
        <form-login login-page="/login.jsp" always-use-default-target="true"/>
        <logout logout-url="/logout" logout-success-url="/login.jsp" invalidate-session="true"/>
    </http>

    <beans:bean id="ipFilter" class="myFilter">
        <beans:property name="authenticationManager" ref="authenticationManager"/>
    </beans:bean>

    <authentication-manager alias="authenticationManager" />
</beans:beans>

一切似乎都是正确的,但是当我尝试访问被称为 myFilter.doFilter 的 myFilter.attemptAuthentication 的受保护页面时。

有什么想法吗?

【问题讨论】:

    标签: java spring jakarta-ee spring-security


    【解决方案1】:

    servlet 容器当然会调用MyFilter.doFilter - 毕竟这是entry point 进入过滤器。

    在您的特定情况下,servlet 容器应该在AbstractAuthenticationProcessingFilter 上调用doFilter(),而不是在MyFilter 上。

    AbstractAuthenticationProcessingFilter.doFilter()又负责调用MyFilter.attemptAuthentication()。

    如果不是这样,也许你在MyFilter 中覆盖了 doFilter()?如果是,最好删除它(或至少致电super.doFilter())。有关详细信息,请参阅AbstractAuthenticationProcessingFilter 的 JavaDocs。

    编辑:MinimeDJ 澄清说一切都如我上面所建议的那样。在这种情况下,我建议检查filterProcessesUrl 属性的值。来自JavaDocs:

    如果请求 URL 与 filterProcessesUrl 属性的值匹配,此过滤器将拦截请求并尝试从该请求执行身份验证。可以通过覆盖方法 requiresAuthentication 来修改此行为。

    所以你可以:

    • 设置适当的filterProcessesUrl 值(通常类似于/j_spring_security_check)
    • 或者您可以覆盖requiresAuthentication 方法以始终返回true。

    如果您仍然遇到问题,那么我建议您使用调试器并逐步检查 spring-security(和您的)代码以查看问题的确切位置。

    【讨论】:

    • 嗨,Neeme,它是 MyFilter。代码中的所有内容都按照您的建议进行,但不知何故没有调用尝试身份验证...还有什么要检查的吗?
    • 在回复中添加了一些建议
    • 好的,我设法让everythinf 工作。我不得不通过 bean 配置删除标准的 配置和配置 spring 安全性。谢谢!
    猜你喜欢
    • 2011-08-23
    • 2014-07-28
    • 2016-03-25
    • 2018-12-11
    • 2013-07-22
    • 2014-10-24
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多