【问题标题】:SpringSecurity RememberMeServices is not injected via annotationsSpringSecurity RememberMeServices 不是通过注解注入的
【发布时间】:2014-11-05 06:13:20
【问题描述】:

我正在尝试将 SpringSecurity 配置为使用 Remember Me 身份验证。

这是我的 Java 配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UserDetailsService userDetailsService;
    @Autowired
    DatabasePersistentTokeRepositoryImpl databasePersistentTokeRepositoryImpl;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {      
        http
        .authenticationProvider(rememberMeAuthenticationProvider())
        .rememberMe().tokenRepository(databasePersistentTokeRepositoryImpl).tokenValiditySeconds((int) TimeUnit.SECONDS.convert(7, TimeUnit.DAYS))
        .and()
            .csrf().disable();
    }

    @Bean()
    public AuthenticationProvider rememberMeAuthenticationProvider() {
        return new RememberMeAuthenticationProvider("KEY");
    }

    @Bean()
    public TokenBasedRememberMeServices rememberMeServices() {
        TokenBasedRememberMeServices rememberMeServices = new TokenBasedRememberMeServices("KEY", userDetailsService);
        rememberMeServices.setAlwaysRemember(true);
        return rememberMeServices;
    }
}

我看到 rememberMeServices 没有注入到 RememberMeConfigurer 中。这会导致创建 RememberMeAuthenticationFilter 引用错误的 rememberMeServices。

Spring Security 文档中有一个部分使用 XML 描述了这个过程。 http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#session-mgmt

我的注入有什么问题,毕竟没有 XML 可以做到这一点吗?

【问题讨论】:

    标签: java spring spring-mvc dependency-injection spring-security


    【解决方案1】:

    你没有注入它。 RememberMeConfigurer 没有自动装配。还有你为什么要配置这么多bean?

    RememberMeAuthenticationProvider 已为您创建,如果您想使用不同的密钥,请使用 key("KEY") 指定它。这又将用于创建RememberMeServices

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(securedEnabled = true)
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Autowired
        UserDetailsService userDetailsService;
        @Autowired
        DatabasePersistentTokeRepositoryImpl databasePersistentTokeRepositoryImpl;
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {      
            http
            .rememberMe()
                .key("KEY")
                .tokenRepository(databasePersistentTokeRepositoryImpl)
                    .tokenValiditySeconds((int) TimeUnit.SECONDS.convert(7, TimeUnit.DAYS))
            .and()
                .csrf().disable();
        }
    }
    

    如果您确实需要将alwaysRemember 属性设置为true,您可以使用ObjectPostProcessor 对过滤器进行后处理并从那里配置RememberMeServices

    您还会注入错误类型的 RememberMeServices,因为配置的类型不使用 PersistentTokeRepository

    【讨论】:

      【解决方案2】:

      只是提供一个代码示例,@m-deinum 建议将 alwaysRemember 设置为 true 的 ObjectPostProcessor 看起来像这样:

      @Override
      protected void configure(HttpSecurity http) throws Exception {      
          http
          .rememberMe()
              .key("KEY")
              .tokenRepository(databasePersistentTokeRepositoryImpl)
              .tokenValiditySeconds((int) TimeUnit.SECONDS.convert(7, TimeUnit.DAYS))
              .withObjectPostProcessor( new ObjectPostProcessor<RememberMeAuthenticationFilter>() {
      
                  @Override
                  public <O extends RememberMeAuthenticationFilter> O postProcess( O object) {
      
                      RememberMeAuthenticationFilter rmaf = (RememberMeAuthenticationFilter)
                      PersistentTokenBasedRememberMeServices rms = (PersistentTokenBasedRememberMeServices)rmaf.getRememberMeServices();
                      rms.setAlwaysRemember( true );
      
                      return object;
                  }                           
              })
          .and()
              .csrf().disable();
      }
      

      【讨论】:

        猜你喜欢
        • 2013-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多