`
zqb666kkk
  • 浏览: 732178 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

apache shiro RememberMe 为false的一个问题解说

阅读更多
刚刚有一个网友 问我一个问题说他登录的时候 设置了
UsernamePasswordToken token = new UsernamePasswordToken(
currUser.getAccount(), currUser.getPwd());
token.setRememberMe(true);

然后 在登录方法里看到 token 对象里的isRememberMe()方法返回的也是true
为什么到其他action方法里 返回SecurityUtils.getSubject().isRemembered()是false?

起初我也很奇怪 难道他们是两个不同的 调用?
带着这个疑问我查看了 shiro的源码

我首先看了 登录方法里的set方法
实在UsernamePasswordToken.class类里的
  /**
     * Returns <tt>true</tt> if the submitting user wishes their identity (principal(s)) to be remembered
     * across sessions, <tt>false</tt> otherwise.  Unless overridden, this value is <tt>false</tt> by default.
     *
     * @return <tt>true</tt> if the submitting user wishes their identity (principal(s)) to be remembered
     *         across sessions, <tt>false</tt> otherwise (<tt>false</tt> by default).
     * @since 0.9
     */
    public boolean isRememberMe() {
        return rememberMe;
    }

    /**
     * Sets if the submitting user wishes their identity (pricipal(s)) to be remembered across sessions.  Unless
     * overridden, the default value is <tt>false</tt>, indicating [i]not[/i] to be remembered across sessions.
     *
     * @param rememberMe value inidicating if the user wishes their identity (principal(s)) to be remembered across
     *                   sessions.
     * @since 0.9
     */
    public void setRememberMe(boolean rememberMe) {
        this.rememberMe = rememberMe;
    }




没看出什么

然后我进 boolean re=SecurityUtils.getSubject().isRemembered();
isRemembered();这个方法里看了下
发现是在Subject.class里面的
    * {@link #getPrincipals() principals}, such as customized views, it should never perform highly-sensitive
     * operations until the user has legitimately verified their identity by executing a successful authentication
     * attempt.
     * <p/>
     * We see this paradigm all over the web, and we will use [url=http://www.amazon.com]Amazon.com[/url] as an
     * example:
     * <p/>
     * When you visit Amazon.com and perform a login and ask it to 'remember me', it will set a cookie with your
     * identity.  If you don't log out and your session expires, and you come back, say the next day, Amazon still knows
     * who you [i]probably[/i] are: you still see all of your book and movie recommendations and similar user-specific
     * features since these are based on your (remembered) user id.
     * <p/>
     * BUT, if you try to do something sensitive, such as access your account's billing data, Amazon forces you
     * to do an actual log-in, requiring your username and password.
     * <p/>
     * This is because although amazon.com assumed your identity from 'remember me', it recognized that you were not
     * actually authenticated.  The only way to really guarantee you are who you say you are, and therefore allow you
     * access to sensitive account data, is to force you to perform an actual successful authentication.  You can
     * check this guarantee via the {@link #isAuthenticated() isAuthenticated()} method and not via this method.
     *
     * @return {@code true} if this {@code Subject}'s identity (aka {@link #getPrincipals() principals}) is
     *         remembered from a successful authentication during a previous session, {@code false} otherwise.
     * @since 1.0
     */
    boolean isRemembered();


点进去看实现方法是这样写的:
    public boolean isRemembered() {
        PrincipalCollection principals = getPrincipals();
        return principals != null && !principals.isEmpty() && !isAuthenticated();
    }


这样应该很清楚原因了 !


他的返回有三个条件 合并起来的 第一个和第二个都是一个意思 就是 该用户信息不为空,
第三个条件代表的意思是 当前用户是通过认证的!

因为我是刚刚登录不久  肯定这个条件是为isAuthenticated();肯定是true
但是他前面加了一个感叹号("!")  那合起来就是false了 三个条件 合起来
true&&true&&false

结果当然就是false

它的意思 就是  因为该用户是 认证通过的所以是 false
我们可以回过头看看这两个标签的解释
user标签 
认证通过或已记住的用户

    <shiro:user>  
        Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login.  
    </shiro:user> 


authenticated标签 
已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。

    <shiro:authenticated>  
        [url=updateAccount.jsp]Update your contact information[/url].  
    </shiro:authenticated>  

就是说 如果是 authc的情况下 是不能和user并存的 而user级别 恰恰就是 RememberMe =true



很多时候 我们遇到问题的时候往往先把自己往错误的地方带 往错误的方向去走
这样才会迷茫 ,我们要先弄懂 原因必须追根溯源




0
0
分享到:
评论

相关推荐

    跟我学Shiro第13章Demo(RememberMe)

    "跟我学Shiro第13章Demo(RememberMe)"是一个实战教程,旨在帮助开发者理解并实现Shiro中的RememberMe特性。RememberMe功能允许用户在一段时间内免于重新登录,提高了用户体验。 在这个Demo中,我们将探讨以下几个...

    Apache shiro1.2.4反序列化漏洞介绍.docx

    Apache Shiro是一个全面的Java安全框架,用于处理应用程序的安全需求,包括身份验证、授权、密码管理和会话管理。它的核心功能之一是“RememberMe”服务,该服务允许用户在关闭浏览器后仍然保持登录状态,无需在下次...

    Apache Shiro教程

    Apache Shiro是一个强大的Java安全框架,它为应用程序提供了身份验证、授权、会话管理和加密等功能。这个教程将帮助你深入理解和有效地使用Shiro框架。在本文中,我们将详细探讨Shiro的核心概念、主要功能和常见用法...

    Apache Shiro API(Apache Shiro开发文档).CHM

    Apache Shiro。 官网 Apache Shiro API。 Apache Shiro开发文档。

    Apache shiro 1.13.0源码

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,简化了企业级应用的安全实现。Shiro 1.13.0 是其一个重要的版本,包含了多项更新和改进。在这个版本中,开发者可以深入理解其...

    Apache_Shiro_使用手册(一)Shiro架构介绍

    配置 Shiro 时,至少需要指定一个 Realm,用于认证和(或)授权。 除了上述三个核心组件之外,Shiro 还包含以下关键组件: - **Authenticator**:认证器,负责执行用户身份的验证。认证过程中最常见的例子是用户...

    Apache Shiro中文开发文档.pdf

    - **入门指南**:本教程将引导你创建一个简单的由Apache Shiro保护的应用程序,通过实际操作加深对Shiro的理解。 - **环境准备**:需要Java 1.5及以上版本,推荐使用Apache Maven作为构建工具,但也可以手动集成...

    Apache Shiro中文版使用手册

    这些功能使得 Shiro 成为了一个全面的安全解决方案,适用于各种类型的应用程序。 - **认证**:是指确认用户的身份,通常指的是用户的登录过程。 - **授权**:即访问控制,决定某个用户是否有权访问特定资源或执行...

    apache shiro 实例

    Apache Shiro 是一个强大且易用的Java安全框架,它提供了认证、授权、加密和会话管理功能,简化了企业级应用的安全实现。本实例将深入探讨 Apache Shiro 的核心概念和常见用法。 1. **认证**:Shiro 提供了用户身份...

    apache shiro 管理用户权限与数据库交互

    Apache Shiro是一个强大且易用的Java安全框架,它提供了身份验证、授权、加密和会话管理等功能。本文将深入探讨如何使用Apache Shiro管理用户权限,并与数据库进行交互,以便实现动态、灵活的安全策略。 ### 一、...

    Apache_Shiro参考手册中文版.zip

    Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。 Apache Shiro 的首要目标是易于使用和理解。安全有时候是很复杂的,甚至是痛苦的,但它没有必要这样。框架应 ...

    Apache Shiro核心jar包:shiro-core-1.3.2

    Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。 使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

    让Apache Shiro保护你的应用

    随着项目的不断发展和完善,它最终演变为今天的**Apache Shiro**,不仅解决了最初的问题,还具备了更多的特性和优势。 #### 三、为什么选择Apache Shiro? 1. **易于使用**:Apache Shiro将易用性作为首要目标之一...

    apache shiro maven包

    Shiro 是一个 Apache Incubator 项目,旨在简化身份验证和授权。在本文中,了解 Apache Shiro 并通过示例来在一个 Groovy web 应用程序中尝试使用 Shiro 进行身份验证和授权

    整合Apache Oltu 与 Shiro. 提供一个轻量的OAUTH2应用框架

    Apache Shiro是一个强大且易用的Java安全框架,处理认证(验证用户身份)、授权(确定用户权限)、会话管理和加密等任务。Shiro的设计目标是保持简单性和直观性,使得开发者能够快速理解并集成到现有的应用中。它...

    Apache Shiro 集成-spring

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。Shiro 不仅可以用于Java Web 应用,也可以用于独立的Java应用。在集成Spring时,Shiro ...

    spring mvc、apache shiro、mysql 框架搭建,基于maven构建

    本项目结合了Spring MVC、Apache Shiro和MySQL这三个强大的技术,通过Maven进行项目管理,旨在提供一个完整的后端开发解决方案。下面将详细介绍这三个框架以及Maven在其中的作用。 **Spring MVC** Spring MVC是...

    Shiro-EXP:Apache Shiro 反序列化漏洞检测与利用工具,一键注入内存马

    与项目相关文章首发于:Shiro exp使用手册Shiro rememberMe反序列化漏洞漏洞原理Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie,服务端对rememberMe的cookie值...

    SHIRO-550:Shiro RememberMe 1.2.4反序列化突破

    Shiro RememberMe 1.2.4反序列化突破(SHIRO-550)commons-collections-3.2.1.jar java -jar ysoserial-0.0.6-SNAPSHOT-all.jar JRMPClient "10.10.20.166:12345" |python exp.py java -cp ysoserial-0.0.6-SNAPSHOT...

    Apache_Shiro参考手册中文版

    为了加深对Shiro的理解,可以通过一个教程来快速搭建一个由Apache Shiro担保的初始应用程序。教程以一个非常简单的命令行应用程序为例,它将运行并迅速退出,让开发者感受Shiro的API。这个示例可以适用于任何应用...

Global site tag (gtag.js) - Google Analytics