shiro实现记住我的功能
时间: 2024-03-02 08:23:52 浏览: 20
在Shiro中实现记住我的功能,需要进行以下步骤:
1. 在Shiro配置文件中,开启cookie管理器和记住我功能。具体配置如下:
```
# 开启cookie管理器
securityManager.sessionManager.sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
securityManager.sessionManager.sessionIdCookieEnabled = true
securityManager.sessionManager.sessionIdCookie = org.apache.shiro.web.servlet.SimpleCookie
# 开启记住我功能
securityManager.rememberMeManager = org.apache.shiro.web.mgt.CookieRememberMeManager
securityManager.rememberMeManager.cookie = org.apache.shiro.web.servlet.SimpleCookie
securityManager.rememberMeManager.cookie.name = rememberMe
securityManager.rememberMeManager.cipherKey = 4AvVhmFLUs0KTA3Kprsdag==
```
2. 在用户登录时,如果用户选择记住我功能,则创建一个RememberMeCookie,并设置它的属性,如下:
```
if (rememberMe) {
Cookie rememberMeCookie = new SimpleCookie("rememberMe");
rememberMeCookie.setMaxAge(7 * 24 * 60 * 60); // 设置cookie过期时间为一周
rememberMeCookie.setHttpOnly(true);
rememberMeCookie.setValue("加密后的记住我信息");
response.addCookie(rememberMeCookie);
}
```
其中,加密后的记住我信息可以使用Shiro提供的RememberMeManager进行加密。
3. 在Shiro的过滤器链中,添加一个RememberMeFilter,用于判断是否存在记住我功能的cookie,并自动登录用户。具体配置如下:
```
[filters]
rememberMe = org.apache.shiro.web.filter.authc.RememberMeFilter
[urls]
/** = anon
/login = authc
/logout = logout
/** = user, rememberMe
```
其中,user表示需要认证的用户,rememberMe表示需要记住我功能的用户。
4. 在Shiro的自定义Realm中,实现doGetAuthenticationInfo()方法,用于自动登录用户。具体实现如下:
```
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
RememberMeAuthenticationToken rememberMeToken = (RememberMeAuthenticationToken) token;
String rememberMeCookieValue = (String) rememberMeToken.getPrincipal();
// 解密记住我功能的cookie
String username = decryptRememberMeCookie(rememberMeCookieValue);
// 查询用户信息
User user = userService.getUserByUsername(username);
if (user == null) {
throw new UnknownAccountException("用户不存在");
}
// 构造AuthenticationInfo对象
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
user.getUsername(), user.getPassword(), getName());
return authenticationInfo;
}
private String decryptRememberMeCookie(String cookieValue) {
// 使用Shiro提供的RememberMeManager进行解密
CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();
byte[] rememberMeKey = Base64.decode(rememberMeManager.getCipherKey());
CipherService cipherService = new DefaultCipherService();
Cipher cipher = cipherService.createCipher(rememberMeKey);
byte[] decrypted = cipher.decrypt(Base64.decode(cookieValue));
return new String(decrypted);
}
```
其中,decryptRememberMeCookie()方法使用Shiro提供的RememberMeManager进行记住我信息的解密。在解密完成后,根据用户名查询数据库中的用户信息,并构造AuthenticationInfo对象返回。这样,当用户使用记住我功能时,Shiro就能自动登录用户。