Apache Shiro的Java认证指南(Shiro官方文档翻译)

Apache Shiro的Java认证指南

参考:Java Authentication Guide with Apache Shiro | Apache Shiro


认证是身份验证的过程—您尝试证明一个用户就是他们所说的那个人。为此,用户需要提供系统理解和信任的某种身份证明。

本指南的目标是引导您了解如何使用Shiro执行Java中的身份验证。如果你还没有查看Shiro的 10 Minute Tutorial,请花些时间通过此教程,以便你对如何使用Shiro有个基本了解。

需要的术语

Subject

应用程序用户的特定安全“视图”。它可以是人、第三方进程、连接到应用程序的服务器,甚至是cron作业。基本上,它是与你的应用程序通信的任何东西或人。

Principals

Subject识别属性。名字、姓氏、社会安全号码、用户名。

Credentials

用于验证身份的机密数据。密码,生物特征数据,x509证书。

Realms

特定于安全的DAO、数据访问对象、与后端数据源通信的软件组件。如果您在LDAP中拥有用户名和密码,那么您可拥有一个与LDAP通信的LDAP Realm。其想法是您将为每个后端数据源使用一个realm,而Shiro会知道如何与这些Realm协作以完成你必须做的事情。

在Java中如何使用Shiro进行认证

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

  1. 采集Subject的principal和credential
  2. 提交principal和credential至认证系统
  3. 允许访问、重试认证或阻止访问

以下是有关如何在Shiro中具体执行此操作的一些代码。

步骤1 - 采集Subject的principal和credential

//使用最常见场景的示例:字符串用户名和密码。
//以系统特定的方式获取(HTTP请求,GUI等)
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//内置“记住我”功能,只需这样做:
token.setRememberMe(true);

在本例中,我们使用了一个名为UsernamePasswordToken的类。它是框架中最常用的身份验证令牌。

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

在本例中,我们希望应用程序在用户返回时记住用户。因此,创建令牌后,我们使用Shiro内置的“记住我”功能,方法是在令牌上将其设置为true。这是使用token令牌的setRememberMe()方法完成的。

步骤2 - 提交principal和credential至认证系统

我们已将信息收集在token中,并设置其记住返回的用户。认证过程中的下一步是将token提交给认证系统。认证系统在Shiro中由特定于安全的DAO表示,它们称为Realm。有关Realm的更多信息,请查看 Shiro Realm Guide

在Shiro中,我们努力使这部分尽可能快速和简单。我们将其简化为一行Java代码!

//对于Shiro的大多数情况,您总想确保正在与当前执行用户(称为Subject)工作
Subject currentUser = SecurityUtils.getSubject();
//通过传递用户名和密码token到login方法认证
currentUser.login(token);

首先,我们需要获取当前正在执行的用户,也称为subject。在Shiro中,当前执行线程总有一个可用的Subject实例。Subject的概念是Shiro的核心,框架的大部分内容都围绕着如何使用Subject展开。在此示例中,我们将这个Subject实例命名为currentUser。

为了获取Subject,我们使用SecurityUtils类,它也是Shiro API的核心部分。它将通过getSubject()方法调用获取当前执行用户。我们得到的Subject实例表示正在与系统交互的当前用户是谁。此时,在示例中,Subject currentUser是匿名的。还没有与他们相关的身份。

现在有了用户表示,我们通过调用login()方法来验证它们,同时提交我们刚刚构造的token。

步骤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提供的一组丰富的异常,如果需要自定义功能,你可以创建自己的异常。有关详细信息,请参阅有关 AuthenticationException 的链接文档。

提示:安全最佳实践是向用户提供一般的登录失败消息,因为您不希望帮助攻击者试图闯入您的系统。

“记住我”支持

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

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

一个“被记住的”subject有一个身份(非匿名的),它们被称为principal的标识属性从上一个会话期间的成功身份验证中被记住。

已验证的subject已在当前会话中证明了其身份。

如果一个subject被记住,这并不意味着他们被认证了。

记住vs验证

在Shiro中,非常重要的是要注意被记住的Subject不是已验证的Subject。检查isAuthenticated()是一个更严格的检查,因为身份验证是证明你是你所说的人的过程。当用户只是被记住时,记住的身份使系统知道该用户可能是谁,但实际上,无法绝对保证记住的Subject代表当前使用该应用程序的用户。一旦Subject验证过,他们就不再被视为仅被记住,因为其身份将在当前会话期间处于已验证状态。

因此,尽管应用程序的许多部分仍然可以基于记住的principals执行特定于用户的逻辑,例如自定义视图,它不应该执行高度敏感的操作,直到用户认证成功合法地验证了他们的身份。

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

这里有一个场景来帮助说明为什么isAuthenticated和isRemembered之间的区别是重要的。

假设您正在使用亚马逊,您登录并将一些书添加到购物车中。一天过去了,当然,您的用户会话已过期,您已经登出了。但亚马逊“记得”你,用你的名字向你问候,并还在给你个性化的书籍推荐。对于亚马逊,isRemembered()将返回TRUE。如果您试图使用文件中的信用卡或更改您的帐户信息会发生什么呢?虽然亚马逊“记住”了你,isRemembered() = TRUE,但不确定你是否真的是你,isAuthenticated() = FALSE。因此,在您执行敏感操作之前,亚马逊需要通过强制认证过程来验证您的身份,该过程通过登录屏幕进行。登录后,您的身份已经验证,并且isAuthenticated() = TRUE。

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

登出

最后,当用户使用完应用程序后,他们可以登出。在Shiro中,通过单个方法调用即可快速轻松地登出。

currentUser.logout(); //删除所有辨识信息并使其会话失效

当您在Shiro中注销时,它将关闭用户会话并从Subject实例中删除任何关联标识。如果您在Web环境中使用“记住我”,则默认情况下,.logout()也会从浏览器中删除“记住我”cookie。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值