Apache Shiro 的Remember Me

来源:互联网 发布:安卓导航栏源码 编辑:程序博客网 时间:2024/05/22 16:03

在Shiro中提供“记住我”的功能,其与已认证有着明显的区别:

Remembered(记住我):一个记住我的Subject 不是匿名的,而且有一个已知的身份ID(也就是subject.getPrincipals()是非空的)。但是这个被记住的身份ID 是在之前的session 中被认证的。如果subject.isRemembered()返回true,则Subject 被认为是被记住的。

Authenticated(已认证):一个已认证的Subject 是指在当前Session 中被成功地验证过了(也就是说,login方法被调用并且没有抛出异常)。如果subject.isAuthenticated()返回true 则认为Subject 已通过验证。

需要注意的是,Remembered和Authenticated 是互斥的——若其中一个为真则另一个为假,反之亦然。

 

可以通过一个例子来说明

下面是一个相当普遍的情况,有助于说明Remembered 和Authenticated之间区别的重要性。比方说,你正在访问Amazon.com。你已经登录成功并添加了几本书到你的购物车。但你心烦意乱地跑出去开会,却忘了注销。会议结束后,已经到了回家的时候,于是你离开了办公室。

第二天你工作的时候,你意识到你没有完成购买,于是你返回到amazon.com。这一次,Amazon“记得”你是谁,给出了你的欢迎页面,并仍然为你提供一些个性化的建议书籍。对Amazon而言,subject.isRemembered()将返回true。

但是,当你尝试访问你的帐户来更新你的信用卡信息为你书付账时会发生什么呢?尽管Amazon“记住”你(isRemembered()= = true),它不能保证你就是实际上的你(例如,也许一个同事正在使用你的计算机)。所以,在你能够执行像更新信用卡信息等敏感行为之前,Amazon 将强制让你登录,使它们能够保证你的身份。在登录后,你的身份已经被核实,同时对Amazon 而言,isAuthenticated()现在返回是true。

这种情况在许多类型的应用中发生的是如此的频繁,所以这些功能被内置在Shiro 中,这样你就能利用它来为你的应用服务了。现在,无论你使用的是isRemembered()还是isAuthenticated()来定制你的视图和工作流都由你来决定,但Shiro 将维持这一基本情况以防你需要它。


原创粉丝点击