【Shiro】二、Apache Shiro验证功能的主要流程

一、Apache Shiro身份验证功能

Shiro框架旨在使身份验证尽可能简洁直观,同时提供丰富的功能。下面是Shiro身份验证功能的特点。

  • 基于主体的-您在Shiro中所做的几乎所有操作都基于当前正在执行的用户,即主体。而且,您可以轻松地在代码中的任何位置检索主体。这使您可以更轻松地在您的应用程序中理解和使用Shiro。

  • 单一方法调用-身份验证过程是单一方法调用。只需要一个方法调用就可以使API保持简单,并且您的应用程序代码干净,从而节省了时间和精力。

  • 丰富的异常层次结构-Shiro提供了丰富的异常层次结构,以提供有关登录失败原因的详细说明。层次结构可以帮助您更轻松地诊断与身份验证有关的代码错误或客户服务问题。此外,丰富性还可以帮助您根据需要创建更复杂的身份验证功能。

  • Shiro API中内置的“记住我”功能-如果用户返回到您的应用程序,可以记住他们。您可以用最少的开发精力为他们提供更好的用户体验。

  • 可插拔数据源-Shiro使用称为Realms的可插拔数据访问对象(DAO)连接到LDAP和Active Directory等安全数据源。为了帮助您避免自己构建和维护集成,Shiro为LDAP,Active Directory和JDBC等流行数据源提供了开箱即用的领域。如果需要,您还可以创建自己的领域,以支持基本领域中未包含的特定功能。

  • 使用一个或多个领域登录-使用Shiro,您可以轻松地针对一个或多个领域对用户进行身份验证,并返回其身份的统一视图。另外,您可以使用Shiro的身份验证策略概念来自定义身份验证过程。可以在配置文件中设置策略,因此更改无需修改源代码,从而降低了复杂性和维护工作。

二、身份验证的步骤

在Shiro的框架以及与此相关的大多数其他框架中,Java身份验证过程可以分为三个不同的步骤。

2.1 获取主体的登录信息和凭证

//Example using most common scenario: 
//String username and password.  Acquire in 
//system-specific manner (HTTP request, GUI, etc)
UsernamePasswordToken token = new UsernamePasswordToken( username, password );

//”Remember Me” built-in, just do this: 
token.setRememberMe(true);

使用一个名为UsernamePasswordToken的类。它是框架中使用的最常见的身份验证令牌。

我们使用此令牌来捆绑以某种方式在Java应用程序中获取的用户名和密码。也许是通过用户Web表单,HTTP标头或命令行提交的。在Shiro中,如何获取它们并不重要-它与协议无关。

在此示例中,我们决定希望应用程序在用户返回时记住他们。因此,一旦创建了令牌,我们就可以通过在令牌上将Shiro设置为true来使用Shiro内置的“记住我”功能。这是使用令牌的setRememberMe()方法完成的。

2.2 将主体和凭据提交到身份验证系统

我们以令牌的形式收集了信息,并将其设置为记住回头用户。身份验证过程中的下一步是将令牌提交给身份验证系统。Shiro中的身份验证系统由特定于安全性的DAO(称为Realms)表示。

在Shiro中,我们尝试使这一部分尽可能人性化快速简便。我们将其简化为一行Java代码!

//With most of Shiro, you'll always want to make sure you're working with the currently 
//executing user, referred to as the subject 
Subject currentUser = SecurityUtils.getSubject();

//Authenticate the subject by passing 
//the user name and password token 
//into the login method 
currentUser.login(token);

首先,我们需要获取当前正在执行的用户,称为主体。主体只是用户的安全特定视图-它可以是人员,流程,日常任务,都没有关系。在Shiro中,始终有一个主体实例可用于当前正在执行的线程。主体的概念是Shiro的核心,并且大多数框架都围绕着与主体合作。在此示例中,我们将命名此主体currentUser的实例。

要获取该主体,我们使用SecurityUtils类,它也是Shiro API的核心部分。它将通过getsubject()方法调用获取当前执行的用户。然后,我们返回一个主体实例,该实例表示当前用户是谁,谁正在与系统进行交互。在示例中,此时,主体currentUser是匿名的。没有与他们相关联的身份。

现在,有了用户表示形式,我们只需调用login())方法来对它们进行身份验证,然后提交刚刚创建的令牌。

2.3 根据验证结果控制用户的访问权限

用户权限主要有允许访问,重试身份验证或阻止访问。

如果login()方法调用成功,则用户已登录并与用户帐户或身份相关联。从这里开始,由于我们在示例中设置了“记住我”,因此用户可以继续使用您的应用程序并保留他们的身份,甚至可以保留整个会话的时间。

但是,如果身份验证尝试失败了怎么办?如果他们给您输入了错误的密码,或者他们访问了系统太多次,也许他们的帐户已被锁定,该怎么办?在这种情况下,Shiro将引发异常。这就是Shiro丰富的异常层次结构发挥作用的地方。

try {
    currentUser.login(token);
} catch  ( UnknownAccountException uae ) {
     ...
} catch  ( IncorrectCredentialsException ice ) { 
    ...
} catch  ( LockedAccountException lae ) {
    ...
} catch  ( ExcessiveAttemptsException eae ) { 
    ...
}
 ...  your own ...
} catch ( AuthenticationException ae ) {
    //unexpected error?
}
//No problems, show authenticated view…

您可以采用该方法调用并将其包装在try / catch块中,并且如果要处理它们并做出相应的反应,则可以捕获各种异常。除了Shiro提供的一系列丰富的例外,如果需要自定义功能,则可以创建自己的例外。

如上例所示,除了正常的登录过程之外,Shiro还支持“记住我”的概念。

在Shiro中,Subject对象支持两种方法:isRemembered()isAuthenticated()

“记住的”主体具有身份(不是匿名的),并且其识别属性(称为主体)在上一个会话期间的成功身份验证中会被记住。

经过身份验证的主体在当前会话中证明了自己的身份。

如果某个主体被记住,则并不意味着它们已通过认证。

在shiro中,非常重要的一点是要注意,记住的主体不是经过验证的主体。进行检查isAuthenticated()是一项更为严格的检查,因为身份验证是证明您是您所说的身份的过程。当仅记住用户时,记住的身份使系统了解该用户可能是谁,但实际上,它无法绝对保证所记住的主体是否代表当前正在使用该应用程序的用户。主体通过身份验证后,就不会再将它们视为仅被记住,因为它们的身份在当前会话中已经过验证。

因此,尽管应用程序的许多部分仍可以基于记住的原则(例如自定义视图)执行特定于用户的逻辑,但是在用户通过执行成功的身份验证尝试合法地验证其身份之前,它永远不应执行高度敏感的操作。

例如,检查对象是否可以访问财务信息的检查几乎总是取决于而isAuthenticated()不是isRemembered(),以确保身份经过验证。

这是一个有助于说明为什么isAuthenticated和isRemembered之间的区别很重要的方案。

假设您正在使用Amazon.com。您登录,然后将一些书添加到购物车中。一天过去了。当然,您的用户会话已过期,并且您已经注销。但是亚马逊“记住”您,用名字向您打招呼,并且仍在为您提供个性化的书本推荐。到亚马逊,isRemembered()将返回TRUE。如果您尝试使用已记录的其中一张信用卡或更改您的帐户信息,该怎么办?尽管亚马逊“记住”了您,isRemembered() = TRUE但不确定您实际上就是您isAuthenticated()=FALSE。因此,在您执行敏感操作之前,亚马逊需要通过在登录屏幕上强制执行身份验证过程来验证您的身份。登录后,您的身份已通过验证isAuthenticated()=TRUE。

这种情况经常在网络上发生,因此Shiro内置了该功能,可帮助您轻松地自己区分。

三、注销

当用户使用完应用程序后,他们可以注销。在Shiro中,我们只需一个方法调用即可使注销变得快速而轻松。

currentUser.logout(); //removes all identifying information and invalidates their session too.

当您注销Shiro时,它将关闭用户会话并从主题实例中删除任何关联的身份。如果您在网络环境中使用RememberMe,则.logout()默认情况下还将从浏览器中删除RememberMe cookie。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值