Java-常见面试题收集(十一)

十九 Shiro

1 什么是 shiro

  Shiro是Apache下的一个开源项目,它是一个强大的且易用的Java安全框架,执行身份验证、授权、密码和会话管理。Shiro框架可以非常容易的开发出足够好的应用安全性,其整体架构及API的易用性简化了很多在Java应用软件安全方面的编码复杂性。对于如认证、授权、加密和会话管理这些任何应用都需要的安全操作,Shiro提供了清晰和优雅的API进行调用。

2 Shiro 核心概念

  Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如爬虫、机器人等;即一个抽象概念;所有Subject 都 绑 定 到 SecurityManager , 与 Subject 的 所 有 交 互 都 会 委 托 给
SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者。

  SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;可以看出它是 shiro 的核心, SecurityManager 相当于 spring mvc 中的 dispatcherServlet 前端控制器。

  Realm:域,shiro 从 Realm 获取安全数据(如用户、角色、权限),就是说SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色/权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源。

3 shiro 注解

1@RequiresAuthentication : 表示当前 Subject 已经通过 login 进行了身份验证;即 Subject.isAuthenticated() 返回 true

2@RequiresUser : 表示当前 Subject 已经身份验证或者通过记住我登录的

3@RequiresGuest : 表示当前 Subject 没有身份验证或通过记住我登陆过,即是游客身份

4@RequiresRoles(value = { “admin”, “user” }, logical = Logical.AND) : 表示当前 Subject 需要角色 admin 和 user

5@RequiresPermissions(value = { “user:a”, “user:b” }, logical =Logical.OR) : 表示当前 Subject 需要权限 user:a 或 user:b

4 shiro 优点

  易于使用:Shiro的API设计直观易用,即便对于没有安全经验的新手来说,也能够快速上手。它提供了简单清晰的接口,让开发者能够轻松地实现身份验证、授权、密码加密和会话管理等关键安全功能。简单的身份验证,支持多种数据源

  功能强大:Shiro提供了丰富的功能集,涵盖了应用安全所需的各种场景。除了基本的身份验证和授权功能外,它还支持多角色管理、细粒度的权限控制、会话超时与失效管理、加密与解密等多种安全特性。 对角色的简单授权,支持细粒度的授权(方法)

  灵活扩展:Shiro的模块化设计使得它可以根据实际需求进行灵活扩展。开发者可以根据项目的需要,选择使用Shiro的特定组件或自定义实现,以满足不同的安全要求。

  集成方便:Shiro可以轻松地与各种Java框架集成,如Spring、Struts等。它提供了良好的兼容性,使得开发者能够方便地将Shiro集成到现有的项目中,而无需对原有代码进行大量的修改。非常简单的 API 加密

  性能高效:Shiro在性能方面也表现出色。它采用了轻量级的设计,对系统资源的占用较少,能够提供高效的安全服务。这使得Shiro成为构建高性能应用程序的理想选择。支持一级缓存,以提升应用程序的性能

  社区支持:Shiro拥有庞大的用户社区和活跃的开发者群体,这为解决问题和获取帮助提供了便利。开发者可以通过社区论坛、文档和示例代码等资源,获取关于Shiro使用的指导和帮助。

5 shiro 安全数据源

  数据库;静态 ini 文件;会话

6 Shiro 认证过程

  Shiro的认证过程是一个确保用户身份合法性的关键步骤。以下是Shiro认证过程的主要步骤:

  用户登录:用户通过登录界面输入用户名和密码,提交认证请求。

  Shiro Filter过滤器:Shiro Filter过滤器是Shiro框架的核心组件,它接收用户的请求并判断用户是否已经登录。如果用户尚未登录,Shiro Filter会将其重定向到登录界面进行认证。

  创建Subject对象:应用程序接收到用户提交的身份信息后,将其封装为Subject对象。Subject是访问系统的用户,可以是用户、程序等实体。

  SecurityManager开始认证:SecurityManager是Shiro框架中的核心组件,它接收到Subject提交的身份信息后,开始进行身份验证。

  调用Authenticator进行身份验证:SecurityManager会调用配置好的Authenticator进行身份验证。Authenticator使用Realm(可能是单个Realm或多个Realm的组合)从数据源中获取用户的身份信息。

  Realm获取用户身份信息:Realm是连接Shiro和安全数据源的桥梁,它负责从数据源(如数据库、LDAP等)中检索用户的身份信息。

  验证身份信息:Authenticator获取到用户的身份信息后,会与用户提交的信息进行比对,以验证用户的身份是否合法。

  处理认证结果:如果身份验证成功,用户将获得访问系统资源的权限;如果验证失败,系统会返回相应的错误信息,并拒绝用户的访问请求。

  Shiro提供了丰富的认证策略和配置选项,以满足不同场景下的认证需求。同时,Shiro也支持与其他安全框架或组件进行集成,以实现更强大的安全功能。在整个认证过程中,Shiro确保了用户身份的合法性和安全性,为系统的稳定运行和数据安全提供了重要保障。

7 Shiro 授权流程

  Shiro的授权流程是一个关键的安全过程,它决定了哪些用户可以访问哪些资源以及他们可以对这些资源执行哪些操作。以下是Shiro授权流程的主要步骤:

  资源定义:在Shiro中,资源可以是系统中的任何对象,如用户、功能、页面、URL等。这些资源通常表示为权限字符串,即用户在访问某些资源时需要拥有的权限。资源的定义可以在配置文件中进行,也可以在应用程序的代码中进行。

  角色定义:角色是一组权限的集合,可以根据不同的用户类型或应用程序角色进行定义。角色用于区分用户的权限级别,将不同的权限分配给不同的用户。

  权限分配:权限字符串通常使用“资源标识:操作权限”的格式来表示,如“user:create”或“order:read”。这一步是将这些权限分配给之前定义的角色。

  用户身份验证:在用户尝试访问系统资源之前,他们首先需要通过身份验证。这通常涉及用户名和密码的验证,或其他身份验证机制,如证书或令牌。

  角色分配给用户:一旦用户通过身份验证,根据他们的身份验证信息,将相应的角色分配给他们。这可以在代码中完成,也可以在Shiro的配置文件中进行。

  访问控制:当用户尝试访问某个资源时,Shiro会检查用户所分配的角色是否拥有对该资源的访问权限。如果用户具有所需的权限,则允许他们访问资源;否则,将拒绝访问并可能返回错误消息。

  整个授权流程确保了只有具有适当权限的用户才能访问系统资源,从而维护了系统的安全性和数据的完整性。Shiro提供了灵活的配置选项和强大的API,使开发人员能够轻松地实现复杂的授权逻辑。

二十 Actviti

1 介绍 Actviti

  Activiti是一个开源的工作流引擎,主要用于管理和执行各种业务流程。它提供了一套强大的工具和API,使得设计、部署和执行工作流变得简单高效。Activiti支持各种工作流模式,如串行、并行和条件分支等,可以满足复杂的业务流程需求。

  Activiti的主要特性包括流程定义和设计、流程部署和管理以及任务分配和执行。它提供了一个图形化的流程设计器,用户可以使用该设计器来创建和定义工作流程。流程定义完成后,可以将其部署到工作流引擎中,并通过Activiti提供的API进行流程的启动、暂停、恢复、终止等操作。同时,Activiti还支持将任务分配给不同的用户或用户组,并提供了一套任务管理工具来管理和执行任务。

  在Activiti中,流程实例是一个重要的概念,它包括了所有的运行节点。通过流程实例,我们可以了解当前流程执行的进度等信息。当流程定义部署在Activiti后,就可以在系统中通过Activiti去管理该流程的执行。例如,部署一个出差流程后,如果某用户要申请出差,这时就需要执行这个流程。每次执行都是一个单独的流程实例,互不影响。

  Activiti的底层使用mybatis操作数据库,它支持数据库表的操作,包括流程的存储、查询和管理等。此外,Activiti还提供了流程控制的功能,如使用BPMN(业务流程建模与标注)来描述流程的基本符号,并通过图元组合成一个业务流程图。

  总的来说,Activiti是一个功能强大、灵活易用的工作流引擎,适用于各种需要管理和执行复杂业务流程的场景。无论是企业内部的业务流程管理,还是跨组织的协同工作,Activiti都能提供有效的支持。

2 Actviti 常见的类

  ProcessEngine:这是Activiti的核心对象,用于检查环境是否正确并管理各种服务。通过ProcessEngine,你可以访问Activiti提供的各种服务和组件。

  RepositoryService:仓库服务对象,负责管理部署信息。你可以使用此类来部署新的流程定义,查询已部署的流程定义等。

  RuntimeService:运行时服务对象,负责管理流程的启动、流转等操作。你可以使用此类来启动新的流程实例,查询正在执行的流程实例等。

  TaskService:任务服务对象,用于管理任务。Task表中的数据是Execution表的扩展,包含任务的创建时间和办理人等信息。你可以使用此类来查询任务、创建任务、完成任务等。

3 流程实例和执行对象的区别

  流程实例是指从流程开始到结束的最大分支。在一个流程中,流程实例只有一个。它包括了所有的运行节点,因此,我们可以利用这个对象来了解当前流程实例的进度等信息。例如,用户或程序按照流程定义内容发起一个流程,这就是一个流程实例。每个用户发起流程时,都会创建一个新的流程实例,这些实例之间互不影响,各自独立运行。

  执行对象则是按照流程定义的规则执行一次的操作。在一个流程中,执行对象可以有多个。它们代表流程中的单个步骤或任务,按照定义的顺序执行。

  流程实例是整个流程的完整执行过程,而执行对象则是流程中的单个执行步骤。流程实例是对整个流程运行的描述,而执行对象则关注于流程中的具体执行细节。

4 流程变量在项目中的作用

  它们主要用于传递业务参数,指定连线完成任务(如同意和拒绝),以及动态指定任务的办理人。

  以请假流程为例,流程变量可以包括请假天数、请假原因等参数。这些参数在整个工作流中扮演着关键的角色,确保流程能够按照预定的规则和业务逻辑正确执行。流程变量的作用域范围是只对应一个流程实例,也就是说各个流程实例的流程变量是不互相影响的。这意味着每个流程实例都有其自己的流程变量集合,这些变量只在该实例的执行过程中有效。

  在项目开发中,流程变量使得Activiti能够应用于更为复杂的业务中,使得流程变得更加灵活可控。通过动态设置和获取流程变量,开发人员可以实现对业务流程的精确控制,以满足项目中的实际需求。

  此外,流程变量在任务分配和权限控制方面也发挥着重要作用。通过流程变量,可以动态地确定任务的办理人,以及为不同的用户或角色分配不同的权限。这有助于确保任务能够按照预定的规则被正确地分配给相应的人员,从而提高工作效率和准确性。

  总之,流程变量在项目中的作用主要体现在以下几个方面:传递业务参数、控制流程执行、动态分配任务和权限,以及提高流程的灵活性和可控性。它们是实现高效、准确和灵活的业务流程管理的重要工具。

5 排他网关和并行网关的功能

  排他网关,也被称为异或网关(XOR gateway),主要用于在流程中实现一组分支的唯一决策。当执行到达这个网关时,所有出口顺序流会按照它们定义的顺序进行计算。条件计算为true的顺序流(当没有设置条件时,认为顺序流定义为true)会被选择用于继续流程。排他网关只会选择一条顺序流继续执行,即使多条顺序流的条件都计算为true,也只有XML中定义的第一条会被选择。如果没有可选的顺序流,会抛出异常。

  并行网关则用于无条件的合并分支,允许流程多进一出,引出的多个分支被工作流引擎并发执行。并行网关在流程模型中用于对并发进行建模处理,可以将单条线路拆分成多个路径并行执行,或者将多个路径合并处理。它基于进入和外出顺序流,具有分支和合并两种行为。在分支时,会为所有外出顺序流分别创建一个并发分支,且并行网关对外出顺序流上的条件是忽略的,每个后继分支路径都被无条件执行。在合并时,所有到达并行网关的分支路径都汇聚于此等待,只有当所有进入顺序流的分支都到达后,流程才会通过并行网关。

  排他网关主要用于在流程中实现决策和唯一路径选择,而并行网关则用于处理并发情况,实现流程的拆分和合并。两者都是工作流引擎中重要的组成部分,用于实现复杂的业务流程逻辑。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰勒疯狂展开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值