• 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页面

  • 相关阅读:
    HDU 2896 病毒侵袭 AC自动机
    AC自动机
    BZOJ2337: [HNOI2011]XOR和路径 期望概率dp 高斯
    BZOJ4008. [HNOI2015]亚瑟王 期望概率dp
    BZOJ 2707: [SDOI2012]走迷宫 拓扑+高斯消元+期望概率dp+Tarjan
    CodeForces743E. Vladik and cards 二分+状压dp
    BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元
    BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp
    CodeForces 167B
    [HEOI2017]分手是祝愿 期望概率dp 差分
  • 原文地址:https://www.cnblogs.com/zhai1997/p/13753460.html
Copyright © 2020-2023  润新知