shiro:RememberMe

1、概念

原始方式:用户选择了记住密码以后,就会将账号和密码存储到cookie,当再次登录的时候输入用户名之后就立即根据用户名获取到对应的密码。

shiro的记住我:

目标:将用户对页面访问的权限分为三个级别:未认证可访问的页面(登录页)、已认证可访问的页面、曾经认证可访问的页面(index,记住我可访问)

2、RememberMe的使用

(1)在过滤器中设置记住我可以访问的url

filterMap.put("/index.html", "user");

user:使用remberme的用户可访问

(2)配置RememberMeManager

  @Bean
    public CookieRememberMeManager getCookieRememberMeManager(){
        CookieRememberMeManager rememberMeManager=new CookieRememberMeManager();
        SimpleCookie simpleCookie=new SimpleCookie("rememberMe");
        simpleCookie.setMaxAge(30*24*60*60);
        rememberMeManager.setCookie(simpleCookie);
        return rememberMeManager;
    }

(3)将配置好的RememberMeManager交给安全管理器

    @Bean//安全管理器
    public DefaultWebSecurityManager getDefaultWebSecurityManager(MyRealm myRealm,EhCacheManager ehCacheManager) {
        DefaultWebSecurityManager defaultSecurityManager = new DefaultWebSecurityManager();
        defaultSecurityManager.setRealm(myRealm);//SecurityManager完成校验需要realm
        defaultSecurityManager.setCacheManager(ehCacheManager);
        defaultSecurityManager.setSessionManager(getDefaultWebSessionManager());
        defaultSecurityManager.setRememberMeManager(getCookieRememberMeManager());
        return defaultSecurityManager;
    }

(4)定义登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
    <form action="/user/login">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        记住我:<input type="checkbox" name="rememberMe">
        <input type="submit" value="提交">
    </form>
</body>
</html>

(5)传递rememberMe参数

在controller层获取到参数rememberMe参数并传递到service层:

    @RequestMapping("login")
    public String login(String username,String password,boolean rememberMe){
        try{
            userService.checkLogin(username,password,rememberMe);
            System.out.println("成功");
            System.out.println(username+password);
            return "index";
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("失败");
            System.out.println(username+password);
            return "login";
        }
    }

service层获取到controller层的数据:

@Service
public class UserService {
    public void checkLogin(String username,String password,boolean rememberme) throws Exception{
        Subject subject= SecurityUtils.getSubject();
        UsernamePasswordToken token=new UsernamePasswordToken(username,password);
        token.setRememberMe(rememberme);
        subject.login(token);
    }
}

(6)测试

输入用户名和密码进行登录:

 登录成功:

关闭浏览器,直接访问index页面:只要cookie还存在就可以在不登录的情况下直接访问index页面

原文地址:https://www.cnblogs.com/zhai1997/p/13753460.html