ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Shiro快速入门 —— 6.记住我

2021-01-11 14:58:00  阅读:221  来源: 互联网

标签:拦截器 name rememberMe user filterChainDefinitionMap 记住 Shiro 入门


Shiro提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。

创建记住我使用的Cookie

spring boot配置

/**
 * 创建保存记住我信息的Cookie
 */
@Bean(name = "rememberMeCookie")
public SimpleCookie getSimpleCookie() {
    SimpleCookie simpleCookie = new SimpleCookie();
    simpleCookie.setName("rememberMe");//cookie名字
    simpleCookie.setHttpOnly(true); //设置cookieHttpOnly,保证cookie安全
    simpleCookie.setMaxAge(604800); //保存7天 单位秒
    return simpleCookie;
}

/**
 * 创建记住我管理器
 */
@Bean(name = "rememberMeManager")
public CookieRememberMeManager getCookieRememberMeManager(SimpleCookie rememberMeCookie) {
    CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
    byte[] cipherKey = Base64.decode("wGiHplamyXlVB11UXWol8g==");//创建cookie秘钥
    cookieRememberMeManager.setCipherKey(cipherKey); //存入cookie秘钥
    cookieRememberMeManager.setCookie(rememberMeCookie); //存入记住我Cookie
    return cookieRememberMeManager;
}

/**
 * 创建默认的安全管理类
 * 整个安全认证流程的管理都由此类负责
 */
@Bean(name = "securityManager")
public DefaultWebSecurityManager securityManager(ShiroRealm shiroRealm,EhCacheManager shiroCacheManager,CookieRememberMeManager rememberMeManager) {
    DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(); //创建安全管理类
    ......
    defaultWebSecurityManager.setRememberMeManager(rememberMeManager);//配置记住我cookie管理类
    return defaultWebSecurityManager;
}

配置拦截规则

authc拦截器负责拦截需要登录认证的路径,但是记住我不能够被识别通过。

user拦截器内部会执行authc拦截器,登录认证完成和记住我都可以通过。

所以如果不使用“记住我”功能就配置authc拦截器,如果使用记住我就配置user拦截器。

Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
filterChainDefinitionMap.put("/", "anon"); //无需登录认证和授权就可访问的路径使用anon拦截器
filterChainDefinitionMap.put("/home/**", "user");//需要登录认证的路径使用authc或user拦截器
filterChainDefinitionMap.put("/user/**", "user,perms[user]");//需要权限授权的路径使用perms拦截器
filterChainDefinitionMap.put("/admin/**", "user,perms[admin]");//authc和perms拦截器可同时使用
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);//设置拦截规则

存入Token

是否记住我rememberMe标识需要在登录拦截器中获取并且存入token

页面提交表单的记住我元素name值必须是“rememberMe”

/**
 * 创建Token
 */
@Override
protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {
    String username = getUsername(request);//获取用户名 表单name:username
    String password = getPassword(request);//获取密码 表单name:password
    boolean rememberMe = isRememberMe(request);//获取是否记住我 表单name:rememberMe
    String captchaId = WebUtils.getCleanParam(request, "captchaId");//获取验证码id
    String captcha = WebUtils.getCleanParam(request, "captcha");//获取用户输入的验证码字符

    return new CaptchaAuthenticationToken(username, password,captchaId, captcha, rememberMe);//存入自己定义的包含验证码的Token
}

标签:拦截器,name,rememberMe,user,filterChainDefinitionMap,记住,Shiro,入门
来源: https://blog.csdn.net/imlichao/article/details/112469416

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有