简介
在开发web应用时,用户登录状态的保持是一个很常见的需求。SpringBoot和Shiro是两个非常流行的Java框架,它们可以很好地结合使用,实现用户登录状态的记住功能(Remember Me)。
Remember Me的作用和原理
Remember Me的作用是在用户登录后,通过保存一个记住我的凭证(通常是一个cookie),使得用户下次访问时可以免登录直接进入系统。
Remember Me的实现原理比较简单:用户登录时生成一个唯一的token,并将该token存储在数据库或缓存中。同时将该token加密后生成一个cookie,发送给用户的浏览器。当用户下次访问系统时,系统会读取cookie中的token并解密,然后根据token找到对应的用户并完成自动登录。
使用SpringBoot和Shiro实现Remember Me
首先,我们需要在SpringBoot项目中添加相应的依赖。可以在pom.xml
文件中添加如下代码:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.7.1</version>
</dependency>
然后,我们需要配置Shiro,并启用Remember Me功能。在application.properties
文件中添加如下配置:
# Shiro配置
shiro.rememberMe.cookie.name=myRememberMeCookie
shiro.rememberMe.cookie.maxAge=2592000
shiro.rememberMe.encryptionKey=6c98c120-1bad-440d-9837-05cd7666a35c
shiro.rememberMe.cipherKey=f1f93a64659e4576abcca8859c96e301
shiro.rememberMe.cipherAlgorithmName=AES/CBC/PKCS5Padding
接下来,我们需要编写相应的代码。首先,我们需要自定义一个Shiro的Realm类,实现用户验证的逻辑,并添加Remember Me的支持。可以参考下面的代码:
@Service
public class UserRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 授权逻辑
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 登录认证逻辑
}
@Override
public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
HashedCredentialsMatcher shaCredentialsMatcher = new HashedCredentialsMatcher();
shaCredentialsMatcher.setHashAlgorithmName(Sha256Hash.ALGORITHM_NAME);
shaCredentialsMatcher.setHashIterations(1024);
super.setCredentialsMatcher(credentialsMatcher);
}
}
然后,在SpringBoot的配置类中配置Shiro的相关Bean。可以参考下面的代码:
@Configuration
public class ShiroConfig {
@Autowired
private UserRealm userRealm;
@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(userRealm);
return securityManager;
}
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
// 配置url权限,默认认证(登录)url为/login
factoryBean.setLoginUrl("/login");
factoryBean.setUnauthorizedUrl("/403");
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/img/**", "anon");
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/**", "user");
factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return factoryBean;
}
}
最后,在LoginController
中处理登录的逻辑,并启用Remember Me功能。可以参考下面的代码:
@Controller
public class LoginController {
@PostMapping("/login")
public String login(HttpServletRequest request, HttpServletResponse response) {
// 处理登录逻辑
Subject currentUser = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
// 设置Remember Me
token.setRememberMe(true);
currentUser.login(token);
} catch (UnknownAccountException uae) {
// 处理未知账户异常
} catch (IncorrectCredentialsException ice) {
// 处理密码错误异常
} catch (LockedAccountException lae) {
// 处理账户被锁定异常
} catch (AuthenticationException ae) {
// 处理其他认证异常
}
return "redirect:index";
}
}
美化标题
为了美化标题,我们可以使用一些HTML的标签和CSS样式。可以将博客的标题改为以下样式:
<h1 style="color:#333;font-size:24px;font-weight:bold;">SpringBoot Shiro Remember Me记住密码</h1>
这样,博客的标题就会以黑色、24px字号和加粗的方式显示在页面上。
总结
记住密码是一个很常见的功能需求,在SpringBoot和Shiro的支持下,实现Remember Me功能非常简单。通过配置Shiro的相应参数,自定义Realm类并添加Remember Me的支持,就可以实现用户的自动登录功能。同时,使用HTML和CSS可以美化博客的标题,增加页面的吸引力。希望本文对大家能有所帮助!
本文来自极简博客,作者:时光隧道喵,转载请注明原文链接:SpringBoot Shiro Remember Me记住密码