`
pengfeifei26
  • 浏览: 244299 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

spring REMEMBER ME配置过程

 
阅读更多
为了避免用户重复登录,系统在使用过程中用户可能需要保持登录。Spring提供了remember me的配置,在项目中我使用了基于cookie的保持登录功能。根据spring的安全文档,要实现remember me配置只要做以下几件事情:

1、登录页

<form action="${ctx}/j_spring_security_check" method="post">
           <input type="text" class="standard-textfield" name="j_username" />

          <input type="password" class="standard-textfield" name="j_password" />
          <input type="checkbox" id="_spring_security_remember_me"  /> 保持登录

</form>
[/html]
2、在spring-security.xml文件中需要加入:
     <http>

                <remember-me user-service-ref="userDetailManager" key="e37f4b31-0c45-11dd-bd0b-0800200c9a66"/>

      </http>

  

      其中的key是用于混淆加密串的,key也可以不设置。user-service-ref是用来指定具体使用的登录验证类。由于我们系统的用户认证是通过自己的业务逻辑实现的,此时就需要提供一个UserDetailsService 的一个实现类,这个类就是重载了loadUserByUsername的方法,根据我们内容的业务逻辑实现如下:
@Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException {
        UserInfoManager userInfoManager = ContextLoader.getCurrentWebApplicationContext().getBean(UserInfoManager.class);
        UserInfo user = userInfoManager.findUserInfo(userName);
        // 鍒ゆ柇鐢ㄦ埛鐨勮处鍙锋槸鍚﹁繃鏈?
        List<GrantedAuthority> authsList = new ArrayList<GrantedAuthority>();
        authsList.add(new GrantedAuthorityImpl("ROLE_ADMIN"));
        if (user != null) {
            if (user.getEndDate() != null) {
                String endDate = OrganizationConstant.dateToString(user.getEndDate());
                if (endDate.equals(OrganizationConstant.STRIBF_END_DATE)) {
                    org.springframework.security.core.userdetails.User authUser = new org.springframework.security.core.userdetails.User(userName, user
                            .getPassWord(),
                            true, true, true,
                            true,
                            authsList.toArray(new GrantedAuthority[0]));
                    return authUser;
                } else {
                    throw new UsernameNotFoundException("娌℃湁杩欎釜鐢ㄦ埛");
                }
            } else {
                throw new UsernameNotFoundException("娌℃湁杩欎釜鐢ㄦ埛");
            }
        } else {
            throw new UsernameNotFoundException("娌℃湁杩欎釜鐢ㄦ埛");
        }
    }

自己实现的UserDetailsService 也需要在spring-security.xml文件中加以声明:
<authentication-manager alias="authenticationManager">
  <authentication-provider user-service-ref="userDetailManager">
   <password-encoder hash="md5" base64="true"/>  
  </authentication-provider>
 </authentication-manager>
    
  <beans:bean id="userDetailManager"
  class="cn.ac.sec.limulus.framework.main.service.UserDetailManager" />

2、

这样配置之后,每次用户进入系统后,一旦session过期,就会从cookie中获取用户信息,用户就永远保持登录。但如果仅仅这样配置,在后面使用过程中就会遇到新的问题,一旦用户点了logout,我们一般都会使用spring 的j_spring_security_logout则系统退出登录的时候就会删除本地的cookie,也就是说下次登录并不能记住用户,如果就实现到目前状态保持登录对用户来说没有任何意义!

这时候我们可以通过提供一个自己实现的SecurityContextLogoutHandler类,这个类继承了org.springframework.security.web.authentication.logout.LogoutHandler,实现了  
public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
        Assert.notNull(request, "HttpServletRequest required");
        if (this.invalidateHttpSession) {
            HttpSession session = request.getSession(false);
            if (session != null) {
                session.invalidate();
            }
        }
        org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices service;
        SecurityContextHolder.clearContext();
    }

这时候我们退出系统只是将当前用户的session设成无效,而不会去删除coookie,用户退出系统后再登录,spring就会在cookie中读取用户信息

3、

需要保持登录,用户每次进入登录页面,都应该默认显示登录用户的名字,用户应该只需要填写密码就能登录系统,这时候就需要action先从cookie中读取用户名后再返回给登录页显示即可;

4、

如果用户不想保持登录,在不勾选保持登录的时候需要将本地的cookie删除,目前找不到合适的获取勾选框值的方法,所以最后我决定在用户执行勾选框勾中或不勾中的时通过执行ajax实现cookie的删除



至此整个保持登录的功能就已经实现了,但还是有一些安全的隐患在里面,由于用户使用了保持登录功能,如果用户跳过登录页面,直接访问系统的一个有效链接,由于spring的安全机制决定其会从cookie中获取用户信息,所以系统可以有效访问,也就是只要用户没有清除cookie,那么用户在任何时间都可以无需登录访问系统。
分享到:
评论

相关推荐

    《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)附前四章doc文件

    《Spring Security3》第四章第四部分主要探讨了Remember me服务的后台存储机制以及如何结合SSL(Secure Sockets Layer)来增强应用的安全性。这一部分的知识点涵盖了Spring Security中Remember me的功能,用户身份...

    Spring Security Remember me使用及原理详解

    .rememberMe() .userDetailsService(myUserDetailServiceImpl) .tokenRepository(persistentTokenRepository()) .tokenValiditySeconds(60 * 60) .and() .authorizeRequests() .antMatchers(SecurityConst....

    acegi rememberMe和退出

    而Acegi Security的"rememberMe"服务就实现了这一功能,为用户提供便捷的登录体验。 在Acegi Security中,"Remember Me"功能主要通过RememberMeServices接口实现,该接口定义了处理Remember Me令牌的方法。通常,这...

    springsecurity使用配置详解

    9. **记住我功能(Remember Me)**: 用户可以选择记住登录状态,以便在下次访问时无需重新登录。Spring Security支持这种功能,通过`RememberMeServices`接口实现。 10. **自定义逻辑**: 如果默认的配置无法...

    Spring Security学习之rememberMe自动登录的实现

    本文将深入探讨如何在Spring Security中配置和使用`rememberMe`自动登录,以及其背后的持久化令牌方案。 ### 一、`rememberMe`基础配置 在Spring Security中,启用`rememberMe`功能非常直观。首先,你需要在`...

    spring security 3.0x remember-me 免登陆

    .rememberMe().rememberMeServices(rememberMeServices()) .key("key") // 同上面的key .rememberMeParameter("remember-me") // 前端提交的参数名 .tokenRepository(persistentTokenRepository()) ....

    Spring Security 构建rest服务实现rememberme 记住我功能

    "Spring Security 构建 REST 服务实现 RememberMe 记住我功能" Spring Security 是一个功能强大且灵活的安全框架,广泛应用于 Java Web 应用程序中。在本文中,我们将介绍如何使用 Spring Security 构建 REST 服务...

    spring_security 配置

    可以通过`rememberMe()`配置实现"记住我"功能,让用户的登录状态在一段时间内保持有效。 7. **异常处理** 默认情况下,Spring Security会返回403(禁止访问)和401(未授权)错误页面。可以自定义这些错误页面或...

    Spring Security3配置使用.rar

    3. **配置过程** - **security.xml**:配置文件,定义了Spring Security的核心组件和规则。 - **http元素**:配置安全的HTTP请求,包括URL过滤、访问控制等。 - **form-login元素**:配置表单登录,指定登录页面...

    spring security3配置

    &lt;remember-me/&gt; &lt;!-- 自定义过滤器 --&gt; &lt;!-- 自定义过滤器 --&gt; &lt;beans:bean id="myFilter" class="springSecurity.MyFilter"&gt; &lt;!-- 自定义访问决策管理器 --&gt; ...

    Spring Security 基本使用和配置代码

    http.rememberMe().key("yourUniqueKey").tokenValiditySeconds(86400); // 一天有效期 ``` 通过以上步骤,你已经掌握了Spring Security的基本配置和使用。不过,Spring Security的功能远不止这些,它还包括CSRF...

    Spring Security3 配置使用

    - Spring Security提供了“Remember Me”服务,使用户在一段时间内无需重新登录。 - 配置`PersistentTokenBasedRememberMeServices`来持久化记住我状态。 7. **自定义登录页面** - 可以通过配置`form-login`元素...

    acegi rememberMe

    3. **安全配置**: 在Spring Security或Acegi Security的配置中,你需要启用"rememberMe"服务,并指定RememberMe Services的实例以及相关的参数,如token有效期、key等。 4. **Web表单集成**: "记住我"选项需要集成...

    spring_security3.2_详细配置_培训笔记

    此外,Spring Security还支持各种其他功能,如记住我(remember-me)服务、CSRF保护、自定义权限表达式等。你可以通过添加额外的元素和属性来启用和配置这些特性。 总的来说,Spring Security 3.2 提供了一个全面的...

    spring_security3_0_5安全配置手册

    - 记住我功能(rememberMe) 这些机制能够在auto-config='true'的情况下自动配置,以便快速实现安全控制。 #### 8. Spring Security原则 文档中提到,Spring Security采用就近原则进行权限验证,意味着用户访问...

    从入门到高级实战-深度探索SpringSecurity安全框架视频.zip

    05.Spring Security 登录表单配置细节 06.Spring Security 表单登录源码 07.Spring Security 中的 JSON 交互 08.Spring Security 授权 09.Spring Security 用户数据入库 10.Spring Security+Spring Data Jpa 11....

    Spring Security3.2搭建LDAP认证授权

    2. 配置Spring Security的XML或Java配置,包括安全拦截规则、LDAP设置和Remember-me配置。 3. 编写自定义的`LdapAuthoritiesPopulator`,以处理角色映射。 4. 测试认证和授权流程,确保用户能正确登录,并在下次访问...

    SpringSecurity function ModifyAuthroties RemebeMe

    在处理Spring Security的RememberMe功能时,你需要确保正确配置RememberMeServices,比如设置适当的token validity seconds(令牌有效期),并使用安全的密钥来签署RememberMe cookie。同时,还需要注意与数据库中的...

    spring-security cookie认证

    - 使用`http.formLogin()`来配置表单登录,并通过`http.rememberMe()`来启用Remember-Me功能。 - 配置Remember-Me时,需要提供Token的持久化方式,例如数据库连接和表结构。 4. **Cookie的安全性**: - Cookie应...

    acegi rememberMe和匿名登录

    总的来说,Acegi Security通过其丰富的特性和高度可配置性,为开发者提供了处理用户认证和授权的强大工具,包括"rememberMe"和匿名登录功能。理解并熟练运用这些功能,可以有效地提高Web应用的安全性和用户体验。在...

Global site tag (gtag.js) - Google Analytics