乐趣区

关于shiro:Shiro使用之记住用户会话显示用户名

Shiro 应用之记住用户、会话、显示用户名

    在登录用户时,点击记住我,从而下次登录时能够间接登录

一、记住用户

1、在 SpringShiroConfig 配置 rememberMe 对象

        /**
     * 配置记住我的管理器对象
     */
    @Bean
    public RememberMeManager rememberMeManager() {CookieRememberMeManager cManager = new CookieRememberMeManager();
        //    用户信息保留在 cookie 中
        SimpleCookie cookie = new SimpleCookie("rememberMe");
        //    保留工夫
        cookie.setMaxAge(7 * 24 * 60 * 60);
        cManager.setCookie(cookie);
        return cManager;
    }

2、将 rememberMe 注入 securityManager

@Bean
public org.apache.shiro.mgt.SecurityManager securityManager(Realm realm, CacheManager cacheManager,
        RememberMeManager rememberMeManager) {DefaultWebSecurityManager sManager = new DefaultWebSecurityManager();
    // 写完 realm 后把它注入给 securityManager
    sManager.setRealm(realm);
    sManager.setCacheManager(cacheManager);
    sManager.setRememberMeManager(rememberMeManager);
    return sManager;
}

3、Controller 层增加 rememberMe 判断

@RequestMapping("doLogin")
public JsonResult doLogin(boolean isRemember, String username, String password) {
    // 获取 subject 对象,负责提交客户端的账号信息
    Subject subject = SecurityUtils.getSubject();
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    // 记住我
    if (isRemember) {token.setRememberMe(true);
    }
    // 给 securityManager 提交用户信息
    subject.login(token);
    return new JsonResult("login ok");

}

4、在 ShiroFilterFactoryBean 中增加 rememberMe 登录权限

 LinkedHashMap<String,String> map=
new LinkedHashMap<>();
// 动态资源容许匿名拜访:"anon"
map.put("/bower_components/**","anon");
map.put("/build/**","anon");
map.put("/dist/**","anon");
map.put("/plugins/**","anon");
map.put("/user/doLogin","anon");
map.put("/doLogout", "logout");// 主动查 LoginUrl
// 除了匿名拜访的资源, 其它都要认证 ("authc") 后拜访
map.put("/**","user");
sfBean.setFilterChainDefinitionMap(map);
return sfBean;
}

会话

1、配置 SpringShiroConfig

@Bean 
public SessionManager sessionManager() {
DefaultWebSessionManager sManager=
new DefaultWebSessionManager();
//  设置保留工夫;默认是 30 分钟
sManager.setGlobalSessionTimeout(60*60*1000);
return sManager;
}

2、注入到 securityManager

@Bean
public org.apache.shiro.mgt.SecurityManager securityManager(Realm realm, CacheManager cacheManager,
        RememberMeManager rememberMeManager, SessionManager sessionManager) {DefaultWebSecurityManager sManager = new DefaultWebSecurityManager();
    // 写完 realm 后把它注入给 securityManager
    sManager.setRealm(realm);
    sManager.setCacheManager(cacheManager);
    sManager.setRememberMeManager(rememberMeManager);
    sManager.setSessionManager(sessionManager);
    return sManager;

}

三、依据登录用户在头像处显示用户名

  • 首先在进入零碎的显示页面管制层增加获取用户信息的办法,而后借助 Modle 存入域中
@RequestMapping("doIndexUI")
public String doIndexUI(Model model) {
    //    从 shiro 框架中的 session 对象中取用户
    SysUser user = (SysUser)SecurityUtils.getSubject().getPrincipal();
    model.addAttribute("user",user);
    model.addAttribute("username",user.getUsername());
    return "starter";    
}
  • 在前端页面中显示姓名的元素中从域中取出存入的用户名

登录 admin 用户

退出移动版