SpringBoot Shiro Remember Me记住密码

时光隧道喵 2024-02-25 ⋅ 18 阅读

简介

在开发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可以美化博客的标题,增加页面的吸引力。希望本文对大家能有所帮助!


全部评论: 0

    我有话说: