Spring Security设置自动登录和显示当前认证用户名

当用户勾选了自动登录,在有效时间内,即使用户关闭了浏览器,下次打开也会处于登录状态(前提是没有清空浏览器cookie)

  

使用Spring Security实现步骤:

  1.在登录页面提供一个选框供用户选择,name的值必须为:remember-me,否则得在remember me过滤器中指定和它对应的名称,value的值必须为:true | on | yes | 1

  <div class="checkbox icheck">
  <label><input type="checkbox" name="remember-me" value="true"> 记住 下次自动登录</label>
  </div>

 2.开启remember me过滤器
<security:http auto-config="true" use-expressions="true">
        <!--省略其余配置-->
        <!--开启remember me过滤器,设置token存储时间,单位为秒-->
        <security:remember-me token-validity-seconds="60"/>
    </security:http>

  3.启动测试

    

     在浏览器可看到cookie已经被保存下来了,有效期为设定的时间,在设定的时间内即使关闭了浏览器,重新打开,依然处于登录状态

remember me 安全性分析:

  记住我功能能够提升用户的体验,但是安全性却令人担忧。因为 Cookie毕竟是保存在客户端的,很容易盗取,而且cookie的值还与用户名、密码这些敏感数据相关,虽然加密了,但是将敏感信息存在客户端,还是不太安全。在使用此功能的时候,要注意用完网站要及时手动退出登录,清空认证信息。
  此外,SpringSecurity还提供了remember me的另一种相对更安全的实现机制 :在客户端的cookie中,仅保存一个无意义的加密串(与用户名、密码等敏感数据无关),然后在db中保存该加密串-用户信息的对应关系,自动登录时,用cookie中的加密串,到db中验证,如果通过,自动登录才算通过。
  实现步骤:

    1.创建一张表,注意这张表的名称和字段都是固定的,不能修改。

CREATE TABLE `persistent_logins` (
    `username` VARCHAR(64) NOT NULL,
    `series` VARCHAR(64) NOT NULL,
    `token` VARCHAR(64) NOT NULL,
    `last_used` TIMESTAMP NOT NULL,
    PRIMARY KEY (`series`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

    2.然后将spring-security.xml中改为:

<security:http auto-config="true" use-expressions="true">
        <!--
            开启remember me过滤器,
            data-source-ref="dataSource" 指定数据库连接池
            token-validity-seconds="60" 设置token存储时间
            remember-me-parameter="remember-me" 指定记住的参数名 可省略
        -->
        <security:remember-me token-validity-seconds="60"
                                data-source-ref="dataSource"
                                remember-me-parameter="remember-me"/>
    </security:http>

    3.最后测试发现数据库中自动多了一条记录:

      选中了记住我功能,表中的数据每登录一次,记录就增多一条,只有主动退出登录,表中的数据才会根据用户名全部清空

      

 显示当前认证用户名

  在jsp页面显示:

    在顶部引入标签

      <%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>

    在需要显示的位置使用

      <security:authentication property="principal.username" /> 或者

      <security:authentication property="name" />

  在后台页面显示:

@RequestMapping("/findAll")
    public String findAll(Model model){
        List<SysUser> list = userService.findAll();
        model.addAttribute("list", list);

        // 从后台获取到当前认证通过后的用户名
        String name = SecurityContextHolder.getContext().getAuthentication().getName();
        System.out.println(name);

        return "user-list";
    }
原文地址:https://www.cnblogs.com/roadlandscape/p/12483208.html