SpringBoot+shiro 实现rememberMe

ShiroConfig.java

@Configuration
public class ShiroConfig {

    //注入自定义的realm,告诉shiro如何获取用户信息来做登录或权限控制
    @Bean
    public Realm realm() {
        return new MyRealm();
    }

    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;
    }

    @Bean
    public SessionsSecurityManager securityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //将自定义的realm交给SecurityManager管理
        securityManager.setRealm(realm());
        // 使用记住我
        securityManager.setRememberMeManager(rememberMeManager());
        return securityManager;
    }


    @Bean
    public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
        /**
         * setUsePrefix(false)用于解决一个奇怪的bug。在引入spring aop的情况下。
         * 在@Controller注解的类的方法中加入@RequiresRole注解,会导致该方法无法映射请求,导致返回404。
         * 加入这项配置能解决这个bug
         */
        creator.setUsePrefix(true);
        return creator;
    }

    /**
     * 这里统一做鉴权,即判断哪些请求路径需要用户登录,哪些请求路径不需要用户登录。
     * 这里只做鉴权,不做权限控制,因为权限用注解来做。
     * @return
     */
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chain = new DefaultShiroFilterChainDefinition();
        //哪些请求可以匿名访问
        chain.addPathDefinition("/login", "anon");
        chain.addPathDefinition("/userLogin", "anon");
        chain.addPathDefinition("/static/**", "anon");

        //除了以上的请求外,其它请求都需要登录
        chain.addPathDefinition("/**", "user");
        return chain;
    }


}

Controller

@RequestMapping("userLogin")
    @ResponseBody
    public Result userLogin(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam(value = "rememberme",required = false) String rememberme,HttpSession session){
        Subject currentUser = SecurityUtils.getSubject();
        try {
            String depassword = null;//解密密码
            try {
                depassword = AesUtil.aesDecrypt(password); //解密web传值的密码
            } catch (Exception e) {
                e.printStackTrace();
            }
            UsernamePasswordToken token = new UsernamePasswordToken(username, depassword);
            rememberme = rememberme == null ? "false" : rememberme;   //null=>false
            token.setRememberMe(Boolean.parseBoolean(rememberme));
            //登录
            currentUser.login(token);
            //从session取出用户信息
            User user = (User) currentUser.getPrincipal();
            session.setAttribute("user",user);
            if (user==null) throw new AuthenticationException();
            //返回登录用户的信息给前台,含用户的所有角色和权限
            return ResultGenerator.genSuccessResult();
        } catch ( UnknownAccountException uae ) {
            return ResultGenerator.genFailResult("登录失败,用户或密码错误!");
        } catch ( IncorrectCredentialsException ice ) {
            return ResultGenerator.genFailResult("登录失败,用户或密码错误!");
        } catch ( AuthenticationException ae ) {
            return ResultGenerator.genServiceErrorResult();
        }
    }

注意,User类需要实现

Serializable

增加属性

private static final long serialVersionUID = 1L;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿S先森丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值