【问题标题】:Make Programmatic Remember Me?让程序化记住我吗?
【发布时间】:2015-07-14 21:08:27
【问题描述】:

大家好 我正在使用弹簧安全 3.0.2 而且我的登录表单不使用spring登录配置,它是一个自定义登录表单(我必须这样做) 我想知道如何以编程方式让用户记住 如果他选中了记住我复选框 注意:我们有另一个登录表单,它使用 spring 登录配置并在记住我服务中使用持久令牌方法。 那么有什么想法吗?

【问题讨论】:

  • 我要做的就是为用户生成cookie(系列,令牌)并将它们保存在数据库中,我的问题是如何生成它们,有什么帮助吗?

标签: jakarta-ee spring-security


【解决方案1】:

如果您想更改记住我的工作方式,您需要扩展 AbstractRememberMeServicesTokenBasedRememberMeServices(具体取决于您要执行的操作)。

然后,您需要通过配置 xml 文件中 remember-me 指令的 services-ref 指令将 Spring 指向您的 Remember Me 实现:

<remember-me services-ref="sword101CustomRememberMeServices" key="{GUID}" token-validity-seconds="3600" data-source-ref="dataSource"/>

如果您可以更具体地了解您的设置和目标,我或许可以提供更详细的帮助。

授予

【讨论】:

    【解决方案2】:

    在手动授权期间,您可以如何手动记住我

    首先,将用户保存在安全上下文中

    @Autowired 
    RememberMeServices rememberMeServices;
    
    @RequestMapping(value = "/login")
    public String login(HttpServletRequest request,HttpServletResponse response) {
    
        Authentication auth = new UsernamePasswordAuthenticationToken(currentUser, null, currentUser.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(auth);
        rememberMeServices.loginSuccess(request, response, auth); 
    

    }

    这里是配置

    @Configuration
    ...
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Autowired
        private UserDetailsService userDetailsService;
        @Autowired
        DataSource dataSource;
        @Bean
        public RememberMeServices rememberMeServices() {
        //      TokenBasedRememberMeServices if you don't want to persist token 
        //      return new TokenBasedRememberMeServices("key", userDetailsService);
        PersistentTokenBasedRememberMeServices rememberMeServices =
                new PersistentTokenBasedRememberMeServices("key", userDetailsService, persistentTokenRepository());
        rememberMeServices.setAlwaysRemember(true);
        return rememberMeServices;
    }
    
    @Bean
    public PersistentTokenRepository persistentTokenRepository() {
        JdbcTokenRepositoryImpl db = new JdbcTokenRepositoryImpl();
        db.setDataSource(dataSource);
        return db;
    }
    

    【讨论】:

      【解决方案3】:

      我假设您使用自定义表单,但仍然调用 spring 登录 url (j_spring_security_check)。

      为什么不在自定义登录表单上使用 RememberMe 字段 (_spring_security_remember_me)?

      【讨论】:

      • 我没有使用 spring 登录 url,我在自定义控制器中进行身份验证,我可以在这里使用 spring 自动记住我吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 2012-05-22
      • 1970-01-01
      相关资源
      最近更新 更多