也就是说,当需要真正与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从为一个应用程序配置的一个或多个Realms中查找其中的许多内容 。
从这个意义上说,领域本质上是特定于安全性的DAO:它封装了数据源的连接详细信息,并根据需要使关联数据可用于Shiro 。在配置Shiro时,您必须至少指定一个领域用于身份验证和/或授权 。可以配置多个Realm,但至少需要一个 。
Shiro提供了开箱即用的领域,可以连接到许多安全数据源(又名目录),例如LDAP,关系数据库(JDBC),文本配置源(例如INI和属性文件)等等 。
如果默认的Realms不能满足您的需求,那么您可以插入自己的Realm实现以表示自定义数据源 。
下面的清单4是配置Shiro(通过INI)以将LDAP目录用作应用程序的领域之一的示例 。
- 清单4.示例领域配置
[main]ldapRealm = org.apache.shiro.realm.ldap.JndiLdapRealmldapRealm.userDnTemplate = uid={0},ou=users,dc=mycompany,dc=comldapRealm.contextFactory.url = ldap://ldapHost:389ldapRealm.contextFactory.authenticationMechanism = DIGEST-MD5 现在,我们已经了解了如何设置基本的Shiro环境,让我们讨论您作为开发人员如何使用该框架 。详细架构下图显示了Shiro的核心架构概念,并简要概述了每个架构:

文章插图
详细架构
下面我们对除了核心组件的部分做一下简单的介绍:
Authentication(身份验证)身份验证是验证用户身份的过程 。
也就是说,当用户通过应用程序进行身份验证时,他们在证明自己实际上就是他们所说的身份 。有时也称为“登录” 。
这通常是一个三步过程 。
- 收集用户的识别信息(称为主体)和支持身份证明的凭据(称为凭据) 。
- 将主体和凭据提交到系统 。
- 如果提交的凭据与系统对该用户身份(本金)的期望匹配,则认为该用户已通过身份验证 。如果不匹配,则认为该用户未通过身份验证 。
Shiro以简单直观的方式支持相同的工作流程 。
正如我们所说,Shiro具有以主题为中心的API-在运行时,您与Shiro所做的几乎所有事情都是通过与当前正在执行的Subject进行交互来实现的 。
因此,要登录主题,您只需调用其登录方法,并传递一个AuthenticationToken实例,该实例代表所提交的主体和凭据(在本例中为用户名和密码) 。
此示例在下面的清单5中显示 。
- 列表5 主题登录
//1. Acquire submitted principals and credentials:AuthenticationToken token =new UsernamePasswordToken(username, password);//2. Get the current Subject:Subject currentUser = SecurityUtils.getSubject();//3. Login:currentUser.login(token);如您所见,Shiro的API可以轻松反映常见的工作流程 。您会继续将这种简单性视为主题操作的所有操作的主题 。
当调用登录方法时,SecurityManager将接收AuthenticationToken并将其分发给一个或多个配置的领域,以允许每个领域根据需要执行身份验证检查 。
每个领域都可以根据需要对提交的AuthenticationToken做出反应 。
但是,如果登录尝试失败会怎样?
如果用户指定了错误的密码怎么办?
您可以通过对Shiro的运行时AuthenticationException做出反应来处理故障,如清单6所示 。
- 列表6-处理失败的场景
//3. Login:try { currentUser.login(token);} catch (IncorrectCredentialsException ice) { …} catch (LockedAccountException lae) { …}…catch (AuthenticationException ae) {…} 您可以选择捕获AuthenticationException子类之一并作出具体反应,或者一般性地处理任何AuthenticationException(例如,向用户显示通用的“用户名或密码错误”消息) 。选择取决于您,具体取决于您的应用程序需求 。
主题成功登录后,它们被认为已通过身份验证,通常您允许他们使用您的应用程序 。
推荐阅读
- 什么是2021年最佳的后端开发框架
- Shiro框架详解
- 食品安全|购买150份扣肉的职业打假人,真的一无是处吗?
- 用 C# 实现一个简单的日志框架
- 提高微服务安全性的11个方法
- 物业安全管理影响因素和发展要点
- 宝宝没有安全感怎么办?
- 使用 gosec 检查 Go 代码中的安全问题
- 探索3种顶级「集成框架」Apache、Spring和Mule
- 基于阿里Ant Design构建的高颜值开源管理后台UI框架
