当前位置: 首页 > article >正文

Shiro认证(Authentication)

一、Shiro简介

Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权、会话管理、加密等功能。它不仅适用于JavaSE环境,也适用于JavaEE环境。Shiro的核心功能点包括Authentication(认证)、Authorization(授权)、Session Manager(会话管理)和Cryptography(加密),这些被Shiro框架的开发团队称为应用安全的四大基石。

二、Shiro认证(Authentication)概述

Shiro的认证功能是指身份验证的过程,即证明一个用户实际上是不是他们所说的他们是谁。通过提交用户的身份和凭证给Shiro,Shiro会判断它们是否和应用程序预期的相匹配。

三、Shiro认证的关键对象及流程

  1. Subject(用户):代表了当前操作用户,可以是任何与应用交互的“用户”,如人、网络爬虫、机器人等。获取当前用户Subject的代码为SecurityUtils.getSubject()

  2. SecurityManager(安全管理器):Shiro的核心,负责与其他组件进行交互,实现Subject委托的各种功能。所有与安全有关的操作都会与SecurityManager交互,且它管理着所有的Subject。

  3. Realms(数据源):Shiro从Realm获取安全数据(如用户、角色、权限)。Realm充当着与安全管理间的桥梁,经过Realm找到数据源进行认证、授权等操作。可以把Realm看成DataSource,即安全数据源。

  4. Authenticator(认证器):用于认证,从Realm数据源取得数据之后进行执行认证流程处理。这是一个扩展点,如果用户觉得Shiro默认的不好,可以自定义实现。

  5. 认证流程

    • 应用程序代码调用Subject.login方法,传递创建好的包含终端用户的Principals(身份)和Credentials(凭证)的AuthenticationToken实例。
    • Subject实例(通常是DelegatingSubject或子类)委托应用程序的SecurityManager通过调用securityManager.login(token)开始真正的验证。
    • SecurityManager接收token,并简单地委托给内部的Authenticator实例通过调用authenticator.authenticate(token)进行认证。这通常是一个ModularRealmAuthenticator实例,支持在身份验证中协调一个或多个Realm实例。
    • 如果应用程序中配置了一个以上的Realm,ModularRealmAuthenticator实例将利用配置好的AuthenticationStrategy来启动Multi-Realm认证尝试。
    • 每个配置的Realm用来帮助看它是否支持提交的AuthenticationToken。如果支持,那么支持Realm的getAuthenticationInfo方法将会伴随着提交的token被调用,以完成身份验证。

四、Shiro认证的特点与优势

  1. 简单的身份验证:Shiro提供了简单的身份验证机制,支持多种数据源。
  2. 细粒度的授权:除了认证,Shiro还支持对角色的简单授权以及细粒度的授权(如方法级别的授权)。
  3. 会话管理:Shiro内置了基于POJO的企业会话管理,适用于Web及非Web环境。
  4. 加密与缓存:Shiro提供了加密解密的工具包,并支持一级缓存以提升应用程序的性能。
  5. 独立运行:Shiro不跟任何框架绑定,可以独立运行。

五、注意事项

  1. 在Web应用程序中,记住身份往往是依靠Cookies。然而,Cookies只能在Response被committed之前被删除,所以强烈建议在调用subject.logout()后立即将终端用户重定向到一个新的视图或页面,以保证任何与安全相关的Cookies都能像预期的一样被删除。
  2. Remembered和Authenticated是互斥的。若其中一个为真,则另一个为假。

综上所述,Shiro认证是一个功能强大且易于使用的Java安全框架的组成部分。通过合理的配置和使用,可以有效地提升应用程序的安全性。


http://www.kler.cn/news/337329.html

相关文章:

  • 录制真人出镜视频一个简单方法
  • Python和C++混淆矩阵地理学医学物理学视觉语言模型和算法模型评估工具
  • JAVA学习-练习试用Java实现“矩形区域不超过 K 的最大数值和 Ⅲ”
  • 什么是网络安全
  • CSS 鼠标悬停时让父元素和子元素以不同的方式进行变换
  • 达梦8-数据守护集群主备故障实验和脑裂处理
  • JavaScript 与 HTML 的结合
  • 大数据行业应用实训室建设方案
  • 鸿蒙next开启地图服务
  • 【CTF Web】Pikachu 远程文件包含 Writeup(文件包含漏洞+GET请求)
  • 无锡卓瓷X哲讯智能科技,SAP项目正式启动!
  • CPU中的寄存器是什么以及它的工作原理是什么?
  • 如何查看app 是否有动态库依赖
  • 【SQL】掌握SQL查询技巧:数据聚合与分析
  • 毕业设计选题:基于ssm+vue+uniapp的模拟考试小程序
  • react项目引入ant-design
  • ​牧​原​二​面​
  • 仿RabbitMQ实现消息队列客户端
  • 【VUE】Vue中template模版编译原理
  • javascript中原型链(__proto__)与原型(prototype)