Shiro 集成 Spring 之记住我

我们经常在登陆网站时看到一个选项,就是 记住我n天内自动登陆。本章我们使用 Shiro 来实现这个功能。

首先需要在 spring-shiro.xml 中配置:

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

<bean id="cookie" class="org.apache.shiro.web.servlet.SimpleCookie">
    <!-- cookie 名称 -->
    <property name="name" value="rememberMe"/>
    <!-- cookie 过期时间 -->
    <property name="maxAge" value="86400"/>
</bean>

并将 rememberMeManager 添加到 securityManager中:

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

在之前的章节中我们提到了过滤器链中的 user 过滤器,以及注解中的 @RequiresUser 都是用来表示已登陆或 rememberMe 状态可访问。

我们新建一个页面 remember.jsp,并为其配置 user 过滤器:

remember.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>记住我</title>
</head>
<body>
    RememberMe Page
</body>
</html>

过滤器

/remember.jsp = user

当然,还要通过表单的单选框来告诉 Shiro,当前用户是否使用 rememberMe 功能,修改后的login.jsp

<html>
<body>
<form action="login" method="post">
    username : <input type="text" name="username">
    <br>
    password : <input type="password" name="password">
    <br>
    rememberMe: <input type="checkbox" name="rememberMe">
    <br>
    <input type="submit" value="Login">
</form>
</body>
</html>

并在 Controller 层接受后,将复选框选中结果配置给 Shiro:

@RequestMapping("login")
@ResponseBody
public String login(User user) {
    Subject subject = SecurityUtils.getSubject();
    UsernamePasswordToken token =
        new UsernamePasswordToken(user.getUsername(), user.getPassword(), user.getRememberMe());
    try {
        subject.login(token);
    } catch (AuthenticationException e) {
        return e.getMessage();
    }
    return "login success";
}

一切配置完成后启动项目,登陆时勾选 rememberMe,然后关闭浏览器,重新打开,再访问 remember.jsp 看是否可以访问,并对比其他配置 authc 或需要授权的页面,是否可以访问。

其实他的原理就是通过 cookie 实现,勾选 remberMe 后登陆成功会给浏览器设置一个 cookie,以及其到期时间,请求页面时验证该 cookie 的内容是否是服务器颁发的,如果是则通过,不是则跳回登陆页面。

也可能你配置了 rememberMe 功能但未生效,也没有报错,那么可能是以下两种原因。

  • 检查浏览器是否禁用了 Cookie
  • 检查是否使用了注解 @RequiresUser并同时在过滤器链中配置了 /** = authc,原因是过滤器链的优先级高于 @RequiresUser,在 /** = authc 时,表示所有请求都要认证,所以还没有到注解的验证就已经被拦截并跳回到登陆页面了。

不过 rememberMe 功能要慎用,且过期时间不要设置太久,因为这样即使修改密码后,原先的 cookie 在过期之前还是可以使用的。还有一个问题是,rememberMe 状态下无法获取用户的 Session 信息,从而也会引发其他的问题。

本章代码地址 : https://github.com/zhaojun1998/Premission-Study/tree/master/Permission-Shiro-11/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

配置共享服务器模式

两者完成相同的任务,即处理所有指定的SQL操作。假定从客户端提交一个任意查询(DQL)到数据库服务器不论是专用模式还是共享

29330
来自专栏行者常至

数据库连接池简单连接

模型      -----     Model 视图      -----     View 控制器  -----     Controller

10630
来自专栏cloudskyme

shiro(1)-简介

简介 apache shiro 是一个功能强大和易于使用的Java安全框架,为开发人员提供一个直观而全面的的解决方案的认证,授权,加密,会话管理。 在实际应用中...

35350
来自专栏Android干货

Android项目实战(二十五):Android studio 混淆+打包+验证是否成功

36670
来自专栏Netkiller

PHP高级编程之守护进程

PHP高级编程之守护进程 http://netkiller.github.io/journal/php.daemon.html 摘要 2014-09-01 发表...

41070
来自专栏bboysoul

如何黑入安卓手机(ezsploit)

安装很简单clone git clone https://github.com/rand0m1ze/ezsploit.git cd ezsploit ch...

18720
来自专栏上善若水

057 组件化的Android

Android中一切都是组件, 程序是由组件组成,比如四大组件:Activity Service BroadcastReceiver ContentProv...

14030
来自专栏蓝天

mono-3.0.2安装指南

mono是一个由Novell公司主持的一个致力于开创.net在Linux、FreeBSD、Mac OS X和Solaris上使用的开源工程。

12120
来自专栏Samego开发资源

如何搭建私密云存储之ownCloud

81240
来自专栏我和未来有约会

Silverlight 3.0 中的 Local Connection

现在很多的需求中需要一个插件实例和另一个实例进行通讯。在同一个页面中调用Html、js等来通讯,而这个往往有一些限制,需要专门的去设置一些权限。在Silverl...

22470

扫码关注云+社区

领取腾讯云代金券