springboot集成shiro实现RemeberMe

springboot集成shiro实现RemeberMe

基础

本文基于之前的文章:
springboot集成shiro

简介

当用户登录成功后,关闭浏览器,再次打开网页时,仍旧需要登录。
shiro为我们提供了RemeberMe的功能。

修改ShiroConfig

/**
     * cookie对象
     * @return
     */
    public SimpleCookie rememberMeCookie() {
        // 设置cookie名称,对应login.html页面的<input type="checkbox" name="rememberMe"/>
        SimpleCookie cookie = new SimpleCookie("rememberMe");
        // 设置cookie的过期时间,单位为秒,这里为一天
        cookie.setMaxAge(86400);
        return cookie;
    }
    /**
     * cookie管理对象
     * @return
     */
    public CookieRememberMeManager rememberMeManager() {
        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
        cookieRememberMeManager.setCookie(rememberMeCookie());
        // rememberMe cookie加密的密钥
        cookieRememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
        return cookieRememberMeManager;
    }

这里我们还要将CookieRemeberMeManager交给securityManager来管理:

@Bean
    public SecurityManager securityManager(){
        // 配置SecurityManager,并注入shiroRealm
        DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();
        securityManager.setRealm(shiroRealm());
        securityManager.setRememberMeManager(rememberMeManager());
        return securityManager;
    }

我们还要修改权限配置,不太明白的话,可以看前面一篇文章,
filterChainDefinitionMap.put("/**", "authc");修改为filterChainDefinitionMap.put("/**", "user");

修改login.html

<div class="form">
        <input type="text" placeholder="用户名" name="username" required="required"/>
        <input type="password" placeholder="密码" name="password" required="required"/>
        <p><input type="checkbox" name="rememberMe" />记住我</p>
        <button onclick="login()">登录</button>
    </div>

以及ajax

$.ajax({
                type: "post",
                url: ctx + "login",
                data: {"username": username,"password": password,"remeberme": remeberme},
                dataType: "json",
                success: function (r) {
                    if (r.code == 0) {
                        location.href = ctx + 'index';
                    } else {
                        alert(r.msg);
                    }
                }

修改Controller

...
 public ResponseBo login(String username, String password, boolean remeberme) {
        // 密码MD5加密
        password = MD5Utils.encrypt(username, password);
        UsernamePasswordToken token = new UsernamePasswordToken(username, password, remeberme);
        // 获取Subject对象
        Subject subject = SecurityUtils.getSubject();
        ....

当我们选中“记住我”以后,系统会将我们的登录信息保存一段时间。这样我们在登陆后,关闭浏览器再打开时就不需要重复进行登录了。

总结

从整体代码量和配置复杂度上来看,都比较简单,但是这是我们在业务开发中经常会用到的一个功能。

整体思路:使用CookieRemeberMeManager来管理用户Cookie,然后再将CookieRemeberMeManager交给我们的权限管理容器来管理SecurityManager。
最后使用权限配置来完成管理权的移交。
代码地址:github

  • 评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright bcfou.com.Some Rights Reserved.