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

Spring Security自定义RememeAuthenticationFilter

梁锋
2023-03-14

我使用Spring Security 3.1在Spring MVC应用程序中实现了“Remember Me”功能

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:security="http://www.springframework.org/schema/security"
       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.1.xsd">

    <import resource="servlet-context.xml" />
    <security:global-method-security secured-annotations="enabled" />

    <security:http auto-config="true" authentication-manager-ref="am">

    <!-- Restrict URLs based on role -->
    <security:intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <security:intercept-url pattern="/resources/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <security:intercept-url pattern="/**" access="ROLE_USER" />

    <!-- Override default login and logout pages -->
    <security:form-login login-page="/public/login" 
                 login-processing-url="/public/loginProcess" 
                 default-target-url="/public/loginSuccess" 
                 authentication-failure-url="/public/login?login_error=1" 
                 always-use-default-target="true" />
    <security:logout logout-url="/public/logout" logout-success-url="/public/login?logout=1" />
    <security:remember-me services-alias="rmService" data-source-ref="dataSource"/>
    <security:custom-filter position="LAST" ref="httpResponseAuthFilter" />
    </security:http>

    <security:authentication-manager id="am">
    <security:authentication-provider >
        <security:password-encoder ref="passwordEncoder" />
        <security:jdbc-user-service data-source-ref="dataSource" />
    </security:authentication-provider>
    </security:authentication-manager>

    <bean id="httpResponseAuthFilter"
    class="mypackage.HttpResponseAuthenticationFilter" >
     <property name="authenticationManager" ref="am"/>
     <property name="rememberMeServices" ref="rmService"></property>
    </bean> 

</beans>

Filter类的实现方式如下:

    public class HttpResponseAuthenticationFilter extends RememberMeAuthenticationFilter {

    @Override
    protected void onSuccessfulAuthentication(final HttpServletRequest request, final HttpServletResponse response,
            final Authentication authResult) {

        super.onSuccessfulAuthentication(request, response, authResult);

        if (authResult != null) {
            // process post authentication logic here..
        }
    }

}

Remember me功能使用上述配置可以正常工作,但在eclipse调试器中运行时,我发现HttpResponseAuthenticationFilter.onSuccessfulAuthentication()没有被调用。

编辑

    <security:http auto-config="true" authentication-manager-ref="am">
    <!-- Restrict URLs based on role -->
    <security:intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <security:intercept-url pattern="/resources/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <security:intercept-url pattern="/**" access="ROLE_USER" />

    <!-- Override default login and logout pages -->
    <security:form-login login-page="/public/login" 
                         login-processing-url="/public/loginProcess" 
                         default-target-url="/public/loginSuccess" 
                         authentication-failure-url="/public/login?login_error=1" 
                         always-use-default-target="true" />

    <security:remember-me services-ref="rememberMeService"/>
    <security:logout logout-url="/public/logout" logout-success-url="/public/login?logout=1" />
    <security:custom-filter position="LAST" ref="httpResponseAuthFilter" />
</security:http>

<security:authentication-manager id="am">
    <security:authentication-provider >
        <security:password-encoder ref="passwordEncoder" />
        <security:jdbc-user-service data-source-ref="dataSource" />
    </security:authentication-provider>
    <security:authentication-provider ref="rememberMeAuthenticationProvider" />
</security:authentication-manager>

<bean id="rememberMeAuthenticationProvider" class=
        "org.springframework.security.authentication.RememberMeAuthenticationProvider">
        <property name="key" value="riskAnalysis" /> 
</bean>

<bean id="httpResponseAuthFilter"
    class="mypacakge.HttpResponseAuthenticationFilter" >
     <property name="authenticationManager" ref="am"/>
     <property name="rememberMeServices" ref="rememberMeService"></property>
</bean> 

<bean id="rememberMeService"
    class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
    <property name="userDetailsService" ref="userDetailsService" />
    <property name="key" value="riskAnalysis" />
</bean>

<bean id="userDetailsService"
  class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <property name="dataSource" ref="dataSource"/>
</bean>    

谢谢,塔伦

共有1个答案

蒋高超
2023-03-14

remember-me命名空间元素已经插入了rememmeAuthenticationFilter,因此它仍然优先于您的命名空间元素,因为它在筛选器链中位于它之前。

如果希望使用自定义筛选器,则应该删除namespace元素,并对相关服务使用标准Spring bean。参考手册(第11.4.1节)中有一个示例,显示了所需的bean。

 类似资料:
  • 问题内容: 这是我的情况: 一个Web应用程序对许多应用程序执行某种SSO 登录的用户,而不是单击链接,该应用就会向正确的应用发布包含用户信息(名称,pwd [无用],角色)的帖子 我正在其中一个应用程序上实现SpringSecurity以从其功能中受益(会话中的权限,其类提供的方法等) 因此,我需要开发一个 自定义过滤器 -我猜想-能够从请求中检索用户信息,通过自定义 DetailsUserSe

  • 我们使用Spring Security OAuth2保护我们的REST服务(用于服务器到服务器通信,不涉及用户)。但是,当您尝试访问浏览器中的受保护资源时,它将显示: 我们希望这是我们自己选择的自定义页面。有办法吗? 设置“拒绝访问”页面不起作用。首先,它需要定义一个登录页面,我们没有,因为这是一个纯服务器到服务器的通信。另一个原因是,这个属性自Spring 3.0..或类似的版本以来就被弃用了。

  • 问题内容: 我已Spring Boot启用基本身份验证的应用程序。从数据库消耗。为了进行单元测试,我想对其进行模拟,以便从其他地方使用数据。 我该怎么做? 我的问题不是如何模拟自身,而是如何模拟使用它来通过基本身份验证测试Controller的方式。 以下是我的SpringSecurity配置: 总之,我怎么能嘲笑UserServiceDetails到SpringSecurity配置,所以我能单元

  • 感谢SpanInjector和SpanExtractor,您可以自定义spans的创建和传播方式。 目前有两种在进程之间传递跟踪信息的内置方式: 通过Spring Integration 通过HTTP Span ids从Zipkin兼容(B3)头(Message或HTTP头)中提取,以启动或加入现有跟踪。跟踪信息被注入到任何出站请求中,所以下一跳可以提取它们。 与以前版本的Sleuth相比,重要的

  • whistle提供了插件的方式扩展协议,具体参考:插件开发

  • 问题内容: 美好的一天。 如果可以根据需要更改JLabel和JTextField字体大小,是否还可以更改JTable的列名和元素的字体样式(大小,外观,颜色)? 另外,我正在使用Windows的外观。 谢谢, 问题答案: 有默认值,以及和。您可以使用与键来覆盖默认。

  • 问题内容: 美好的一天。 如果可以根据需要更改JLabel和JTextField字体大小,是否还可以更改JTable的列名和元素的字体样式(大小,外观,颜色)? 另外,我正在使用Windows的外观。 谢谢, 问题答案: 有默认值,以及和。您可以使用与键来覆盖默认。

  • 问题内容: 我正在尝试在发送XHR之前先听它们。该方法类似于jQuery的beforeSend。 我的目标是在发送所有XHR之前监听它们。我想最接近的事情是检查上面是否? 上面的代码是否会因为我使用原型而导致诸如jQuery之类的ajax库出现故障? 问题答案: 我正在尝试在发送XHR之前先听它们。 然后尝试欺骗该方法,而不是一种。 上面的代码是否会因为我在XMLHttpRequest上使用原型而