Shiro快速入門 —— 6.記住我

本系列博文目錄:http://www.javashuo.com/article/p-ewndobct-kn.htmljava

 

Shiro提供了記住我(RememberMe)的功能,關閉了瀏覽器下次再打開時仍是能記住你是誰,下次訪問時無需再登陸便可訪問。spring

建立記住我使用的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攔截器,登陸認證完成和記住我均可以經過。cookie

因此若是不使用「記住我」功能就配置authc攔截器,若是使用記住我就配置user攔截器。ide

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標識須要在登陸攔截器中獲取而且存入tokenspa

頁面提交表單的記住我元素name值必須是「rememberMe」.net

/**
     * 建立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
    }
相關文章
相關標籤/搜索