权限分类

用户访问页面分为3中级别
未认证可以访问的页面 比如登录、注册页面
“记住我”(曾登录过)访问的页面 index.html
以认证可访问的页面 转账页面等
记住密码的流程

​ 第一次登录login.html页面时,点击“登录”会把用户的username和password存入cookie中,第二次登录login.html页面时输入username后,会调用js方法获取cookie里的密码并自动把密码填写到input标签里。

shiro的“记住我”流程

​ 现在上述功能交给shiro的SecurityManager实现,只需要告诉shiro把UsernamePasswordToekn类型token传入SecurityManager中,就会自动检测。

流程示意图

avatar

rememberMe实现

​ 在ShiroConfig中设置过滤器的权限,让访问index.html页面是以登录或曾登录用户的才能访问。设置过滤filterMap规则。

1
filterMap.put("/index.html","user");

​ 并且设置cookie管理器,设置cookie的名字和存在时间。并且把rememberMe管理器传送给shiro的SecurityManager

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Bean
public CookieRememberMeManager getCookieRememberMeManager() {
CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
simpleCookie.setMaxAge(5*60);
rememberMeManager.setCookie(simpleCookie);
return rememberMeManager;
}
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(MyRealm myRealm, EhCacheManager ehCacheManager) {
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
defaultWebSecurityManager.setRealm(myRealm);
defaultWebSecurityManager.setCacheManager(ehCacheManager);
defaultWebSecurityManager.setRememberMeManager(getCookieRememberMeManager());
return defaultWebSecurityManager;
}

​ 并设置当subject.login(token)时,不仅要传username和password还要穿rememberMe

1
2
3
4
5
6
7
8
9
10
11
@Service
public class UserServiceImpl {
@Resource
private UserDao userDao;
public void checkLogin(String username, String pwd, boolean rememberMe) throws Exception {
UsernamePasswordToken token = new UsernamePasswordToken(username, pwd);
Subject subject = SecurityUtils.getSubject();
token.setRememberMe(rememberMe);
subject.login(token);
}
}

检测

​ login.html页面,填写好了username和password后点击“记住我”,进入index.html后,关闭所有页面,重新打开浏览器登录localhost:8080/index.html。

avatar

avatar