shiro记住登录状态

UsernamePasswordToken

token记录了主机号、用户名、密码以及rememberMe。通过表单提交我们可以获取到后三者,主机号从request对象中获取。

1
2
3
4
5
6
public class  implements HostAuthenticationToken, RememberMeAuthenticationToken {
private String username;
private char[] password;
private boolean rememberMe;
private String host;
}

配置

Cookie配置

1
2
3
4
5
6
7
8
9
10
11
12
13

public SimpleCookie simpleCookie() {
SimpleCookie cookie = new SimpleCookie("rememberMe");

cookie.setMaxAge(cookieMaxAge * 60 * 60);
// 设置cookie保存路径
cookie.setPath(cookiePath);
// 设置cookie域名,默认为空
cookie.setDomain(cookieDomain);
// 设置httpOnly
cookie.setHttpOnly(cookieHttpOnly);
return cookie;
}

RememberMeManager(管理器)配置

1
2
3
4
5
6
7
8
9

public CookieRememberMeManager rememberMeManager(SimpleCookie simpleCookie) {
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
// 添加cookie配置
cookieRememberMeManager.setCookie(simpleCookie);
// 设置cookie密钥,推荐为每个域名单独使用一个
cookieRememberMeManager.setCipherKey(Base64.decode("fCq+/xW488hMTCD+cmJ3aQ=="));
大专栏  shiro记住登录状态ss="keyword">return cookieRememberMeManager;
}

将RememberMeManager添加至SecurityMananger

1
defaultWebSecurityManager.setRememberMeManager(rememberMeManager);

配置拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

shiroFilterFactoryBean.setSecurityManager(securityManager);

Map urlMap = new LinkedHashMap();

// 登录注册
urlMap.put("/login", "anon");

// 释放静态资源
urlMap.put("/css/**", "anon");
urlMap.put("/js/**", "anon");
urlMap.put("/fonts/**", "anon");
urlMap.put("/jqvmap/**", "anon");

// 登出拦截器
urlMap.put("/logout", "logout");

// 权限拦截,必须为user,authc是无法开启rememberMe的
urlMap.put("/**", "user");

shiroFilterFactoryBean.setFilterChainDefinitionMap(urlMap);

shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setSuccessUrl("/index");

return shiroFilterFactoryBean;
}

最后,从前台将获取到的用户名、密码及是否记住登录状态封装到token,再执行subject.login(token),便大功告成。

猜你喜欢

转载自www.cnblogs.com/wangziqiang123/p/11690387.html