📜  apache shiro remember me 是如何工作的 - Java (1)

📅  最后修改于: 2023-12-03 14:59:20.903000             🧑  作者: Mango

Apache Shiro Remember Me 是如何工作的 - Java

Apache Shiro Remember Me 是一个用于在无法访问用户凭证的情况下记住用户身份的机制。在用户登录成功后,为了避免每次访问资源时都需要重新登录,我们可以使用 Remember Me 机制来保存用户身份信息,并在下一次访问时自动登录。

Remember Me 工作流程

Apache Shiro Remember Me 的工作流程如下:

  1. 用户登录成功后,系统会生成一个随机的 token(记住我 token),并将该 token 存储到用户的 Cookie 中,并保存到数据库中。

  2. 用户在下一次访问系统时,系统会自动从用户的 Cookie 中获取记住我 token,并通过 token 查询数据库中是否存在该 token,如果存在,则验证 token 是否过期,如果没有过期,则系统会自动为用户登录,加载用户的权限信息,完成用户身份的认证。

配置 Remember Me

Apache Shiro Remember Me 的配置非常简单,只需在 shiro.ini 或者 shiro-config.xml 文件中添加如下配置:

# Shiro Remember Me cookie name, the default is JSESSIONID
shiro.authc.rememberMe.cookie.name = rememberMe

# Cookie max age time, the default is one month
shiro.authc.rememberMe.cookie.maxAge = 2592000

# Remember Me encryption key
shiro.authc.rememberMe.cipherKey = kPH+bIxk5D2deZiIxcaaaA==

# Remember Me Cookie decode value
shiro.authc.rememberMe.cookie.value = base64 encoded cookie value

其中,rememberMe 是 Cookie 的名称,maxAge 是 Cookie 的过期时间(默认为一个月),cipherKey 是加密串,value 是 Cookie 的值。

Remember Me 的实现代码

Remember Me 的具体实现代码如下:

  1. 设置 Remember Me:
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(true);
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token);
  1. 配置 Remember Me 记住登录:
<bean id="mySecurityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="rememberMeManager" ref="cookieRememberMeManager"/>
</bean>

<bean id="cookieRememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
    <property name="cookie" ref="rememberMeCookie"/>
</bean>

<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
    <constructor-arg value="rememberMe"/>
    <property name="maxAge" value="2592000"/>
</bean>
  1. 配置 Remember Me 读取 Cookie:
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
    <constructor-arg value="rememberMe"/>
    <property name="httpOnly" value="true"/>
    <property name="maxAge" value="2592000"/>
</bean>

<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
    <property name="cipherKey" value="KjI9eMfQTphOJY875hir4A=="/>
    <property name="cookie" ref="rememberMeCookie"/>
</bean>

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="rememberMeManager" ref="rememberMeManager"/>
    <property name="realm" ref="myRealm"/>
</bean>

以上是 Apache Shiro Remember Me 的简单介绍,希望对各位程序员有所帮助!