Java应用程序安全框架

news2024/10/7 20:30:52

《从零打造项目》系列文章

工具

  • 比MyBatis Generator更强大的代码生成器

ORM框架选型

  • SpringBoot项目基础设施搭建
  • SpringBoot集成Mybatis项目实操
  • SpringBoot集成MybatisPlus项目实操
  • SpringBoot集成Spring Data JPA项目实操

数据库变更管理

  • 数据库变更管理:Liquibase or Flyway

  • SpringBoot结合Liquibase实现数据库变更管理

定时任务框架

  • Java定时任务技术分析
  • SpringBoot结合Quartz实现定时任务
  • SpringBoot结合XXL-JOB实现定时任务

缓存

  • 待更新

安全框架

  • Java应用程序安全框架

开发规范

  • 待更新

Java应用安全框架

在构建应用程序时,必须首先考虑其安全性。每个应用程序都是通过网络发布的,随之而来的是安全、隐私和完整性风险的威胁。

根据开放 Web 应用程序安全项目 (OWASP),最重要的安全风险是:

Java 安全框架

大致定义如下:

  • SQL 注入。
  • 损坏的身份验证和会话管理。
  • 跨站点脚本 (XSS)。
  • 不安全的直接对象引用。
  • 安全配置错误。
  • 敏感数据暴露。
  • 缺少功能级别访问控制。
  • 跨站点请求伪造 (CSRF)。
  • 使用具有已知漏洞的组件。
  • 未经验证的重定向和转发。

访问OWASP Top Ten以了解有关这些漏洞的更多信息。

Java 框架提供代码重用能力,同时消除了构建样板代码任务的需要。让我们来看看一些优秀的基于 Java 的框架,以提高应用程序的安全性并加速您的业务增长。

Java 安全框架

JAAS(Java 认证和授权服务)

JAAS 用作保护 Java 应用程序的 API。它包括许多为身份验证和授权而设计的 Java 包。JAAS 是 Java SE 1.3 中的一个可选包,之后,它从 1.4 版开始成为 JDK 的一部分。

JAAS 可用于两个目的:

  • 用于用户身份验证,以可靠且安全地确定当前正在执行 Java 代码的人员,无论该代码是作为应用程序、applet、bean 还是 servlet 运行的;
  • 用于授权用户,以确保它们具有执行所执行操作所需的访问控制权限。

JAAS 中的身份验证以可插入的方式执行。它允许应用程序摆脱基本的身份验证技术。

查看 API 和示例的参考指南。

Spring Security

Spring Security 是一个可以根据企业应用需求进行修改的框架。它克服了身份验证和访问控制的困难。

身份验证是设置主要是他们声明的人(可能是用户、设备或一些可以为您的应用程序执行操作的不同机器)的过程。授权是确定专业是否可以在您的应用程序内执行操作的系统。

详细学习参考官方文档。

Apache Shiro

Apache Shiro 被认为是一个非常有效的 Java 安全框架,它在所有类型的 Java 应用程序上进行加密、授权和会话管理,无论它们的大小如何。

Shiro 被设计成一个直观且易于使用的框架,同时提供强大的安全功能。它是框架中立的,因此可以与任何 Java 支持的框架无缝协作。

有关详细文档,参阅官方网站。

HDIV

HDIV 是一个 Java Web 应用程序安全框架。它通过添加安全功能并维护 API 和框架规范来扩展 Web 应用程序的行为。

它广泛用于基于 Struts、Spring MVC、Grails、JSTL 等构建的应用程序,因为它为开发人员提供了急需的透明度,而不会增加应用程序开发的任何复杂性。

查看官方文档以获取更多详细信息。

OACC

OACC 是用于 Java 的应用程序安全框架,专为细粒度(对象级)访问控制而设计。它专门为每个实施和控制实用程序的身份验证和授权需求提供功能齐全的 API - 它是有效且灵活的安全模型的完整实现。

OACC 利用抽象的援助来保护实用项目。这一关键抽象允许 OACC 提供丰富的 API,包括授予、撤销和查询功能,用于存储和处理应用程序的安全关系。

查看官方文档以获取更多详细信息。

如何选择安全框架

上述有五种安全框架,实际应用中该如何选择呢?首先声明,本人对 Spring Security 和 Apache Shiro 有所了解,具体使用过 Spring Security,其他三种首次听说。

JAAS(Java 认证和授权服务)

JAAS 虽然作为 JDK 的一部分,但我对它知之甚少,详细介绍可以参考官方文档,如何使用可以参考这篇文章。

为什么企业级应用不使用 JAAS,我也没找到专业解释,自己琢磨了一番,发现了点门道。

先对 JAAS API 中常用的一些类和接口做个简单的说明。

  • LoginModule :确认用户的合法性(使用CallbackHandler或者其他类方法),并分配访问权限principal给subject;

  • LoginContext:为了实现用户鉴别,建立相应的环境,从配置文件中导入规则;

  • CallbackHandler:回调处理器,负责与用户(代码拥有者和执行者)交互,确认其身份的合法性;

  • Subject:表示登陆处理的目标,即一个被鉴别的用户。并可关联一个或多个pirncipal;

  • Principal:表示具有访问权限的一个实体,可以看作是可以执行某种操作的证件。

这些类和接口的关系有个生动的比喻:一个学校,入学的时候校方(LoginModule)根据学生(Subject)的入学通知来确定其合法 性,这个过程交由某工作人员(CallbackHandler)执行,(CallbackHandler)确认后,(LoginModule)给不同 (Subject)根据其身份发给相关的证件(Principal),有了该证件就可以访问对应的资源,(Subject)根据自己的 (Principal)的级别可以使用和访问学校不同资源。

而上述这些 JAAS 的核心类,在 Spring Security 中有类似存在,Spring Security 提供了一个包来将身份验证请求委托给 Java 身份验证和授权服务 (JAAS)。比如说抽象类 AbstractJaasAuthenticationProvider 和 接口 JaasAuthenticationCallbackHandler

package org.springframework.security.authentication.jaas;

import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.springframework.security.core.Authentication;

public interface JaasAuthenticationCallbackHandler {
  void handle(Callback callback, Authentication auth) throws IOException, UnsupportedCallbackException;
}

对比 JAAS 中的 CallbackHandler

package javax.security.auth.callback;
public interface CallbackHandler {
  void handle(Callback[] callbacks)
    throws java.io.IOException, UnsupportedCallbackException;
}

更多介绍推荐阅读官方文档。

由上可知,我们出于某些原因,没有直接使用 JAAS,但是如果使用了 Spring Security,也算是间接地使用 JAAS。

Spring Security

Spring Security 最早不叫 Spring Security ,叫 Acegi Security,叫 Acegi Security 并不是说它和 Spring 就没有关系了,它依然是为 Spring 框架提供安全支持的。事实上,Java 领域的框架,很少有框架能够脱离 Spring 框架独立存在。

Acegi Security 基于 Spring,可以帮助我们为项目建立丰富的角色与权限管理,但是最广为人诟病的则是它臃肿繁琐的配置,这一问题最终也遗传给了 Spring Security。

但是和 Shiro 相比,人们对 Spring Security 的评价依然中重量级、配置繁琐,对于初学者来说比较难。直到 Spring Boot 横空出世,这些问题统统都得到缓解。在 Spring Boot 或者 Spring Cloud 中,如果想选择一个权限管理框架,几乎毫无疑问的选择 Spring Security,Shiro 在这个环境下已经不具备优势了。

综上,如果你所接触的项目多是 SpringBoot 或者 SpringCloud,那么推荐学习使用 Spring Security。

Apache Shiro

无论是 Shiro 还是 Spring Security,最最核心的功能,无非就是两方面:

  • 认证
  • 授权

其功能特点如下图所示:

Shiro核心功能

Shiro 比 Spring 更容易使用,功能强大、且 简单、灵活。是 Apache 下的项目比较可靠,且不跟任何的框架或者容器绑定,可以独立运行。如果是 Spring 项目,不建议使用 Shiro。

HDIV

HDIV 之前根本没有听说过,官网介绍写的比较厉害:Hdiv 抵御了 OWASP 前 10 名中包含的 90% 的应用程序安全风险——对最关键的 Web 应用程序安全漏洞的广泛共识——例如 SQL 注入、跨站点脚本、跨站点请求伪造、数据篡改和暴力攻击. Hdiv 提供了比当前任何可用的解决 Web 应用程序安全风险的解决方案更高的有效性。

同时还为一些知名企业提供安全服务,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aAUJOfmg-1669618897120)(https://camo.githubusercontent.com/5e1d5e9c11c99f3dc8f505d3a875280378d1da48a8ed77042a23cfca2b035f0e/68747470733a2f2f6864697673656375726974792e636f6d2f696d672f737570706f727465642d746563686e6f6c6f676965732e706e67)]

而且在 Github 介绍中提到已与 SpringMVC 集成,相较于 Spring Security 功能不够完整,且学习成本较大,以及适用范围不够广,所以不推荐使用。

OACC

OACC (读音 Oak)是 Object Access Control serviCe 的缩写。它是一个高级的 Java™ 应用安全框架. OACC 提供高性能 API ,为 Java应用程序提供了基于权限的授权服务。简而言之,OACC 可以让你的应用通过发出问题来保证安全:“实体 ‘A’ 是否被允许在实体 ‘B’ 上进行操作 ‘p’。

在官网可以看到,OACC 很早就不再更新了。

OACC版本更新

此外,如果你想使用 OACC,还需要在对应的数据库中执行必要的脚本,比如说 MySQL 数据库。

OACC MySQL执行脚本

OACC表结构

这意味着你需要按照 OACC 的要求来设计表结构,这是不能容忍的。理所当然,我们不考虑该框架。

小结

综上,Spring Security 和 Shiro 是目前最受欢迎的两款安全框架,但因为 SpringBoot 和 SpringCloud 的火热,让同为 Spring 家族的 Spring Security 也变得火热起来,所以推荐学习使用 Spring Security。

参考文献

Java 安全框架

构建安全应用程序的前 5 个 Java 应用程序安全框架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Word控件Spire.Doc 【图像形状】教程(11): 如何在 C# 中为 Word 中的图像设置 Transeperant 颜色

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

A-Level经济题解析及练习Policy options for Common Resources

今日知识点:Policy options for Common Resources 例题 There is a medieval town where sheep graze on common land. As the population grows, the number of sheep grows. However, the amount of land is fixed, the grass begins to disappear from overgra…

SwiftUI 中为什么应该经常用子视图替换父视图中的大段内容?

概览 在 SwiftUI 官方教程中,Apple 时常提出“化整为零”的界面布局思想。简单来说,Apple 推荐 SwiftUI 视图的构建方式是:用若干自定义小视图来构成上层的功能视图。 这是为什么呢? 在本篇博文中,我们将用一个通俗…

[Java反序列化]—CommonsCollections6

先贴个图 0x01: CC 6 应该是CC1 和 URLDNS 的综合,有一定联系,审一下吧 JDK版本需低于 8u71 AnnotationInvocationHandler类的readObject()方法在8u71以后逻辑就发生了改变,不能再利用了,所以就需要找一个绕过高版本的利用链…

Cadence Virtuoso Layout 版图绘制的使用技巧及其相关快捷键

1.版图前准备操作 画好原理图,打好pin脚(pin最好以全大写的形式书写,以防后续操作中可能出现Bug) 查看所使用工艺库的design rule文件,确定栅格单位设置大小 在准备绘制的原理图界面启动layout XL/GXL 在layout界面…

JS 正则表达式常用方法

1. JS 正则表达式 2. 使用字符串方法 3. 使用 RegExp 方法 1. JS 正则表达式 JS 正则表达式语法: # JS 的正则表达式不需要使用引号包裹,PHP 需要使用引号包裹。修饰符是可选的,可写可不写/正则表达式主体/修饰符JS 中使用正则表达式的方法比较多&am…

【强化学习论文合集】九.2018AAAI人工智能大会论文(AAAI2018)

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

Python中的Apriori关联算法-市场购物篮分析

数据科学Apriori算法是一种数据挖掘技术,用于挖掘频繁项集和相关的关联规则。本模块重点介绍什么是关联规则挖掘和Apriori算法,以及Apriori算法的用法。 去年,我们为一家公司进行了短暂的咨询工作,该公司正在构建一个主要基于Apr…

使用DIV+CSS技术设计的非遗文化网页与实现制作(web前端网页制作课作业)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

m基于自适应遗传优化的IEEE-6建设费用和网络损耗费用最小化电网规划算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 电力工业是当今世界各国经济的重要组成部分,随着世界经济的不断发展,电网的建设和中长期规划和经济发展之间的矛盾变得越来越突出,对电力系统的需求也变得越来…

微服务框架 SpringCloud微服务架构 16 SpringAMQP 16.7 DirectExchange

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构16 SpringAMQP16.7 DirectExchange16.7.1 发布订阅 - DirectExchange16.7.…

基于遗传优化算法的小车障碍物避障路线规划matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 一种通过模拟自然进化过程搜索最优解的方法,对于一个最优化问题,该算法通过一定数量的候选解种群迭代地执行选择、交叉、变异、评价等操作使得种群向更好的解进化。 遗传算…

MyBatisPlus简述

文章目录一、MyBatisPlus入门案例与简介1.入门案例2.springboot整合mybatis的方式3.springboot整合mybatisplus步骤1.创建环境,上面我们已经创建过了步骤2.创建数据库及表步骤2.pom.xml补全依赖步骤3.添加MP的相关配置信息步骤4.根据数据库表创建实体类步骤5.创建Da…

linux安装redis哨兵

安装环境 服务器一台: 服务器IP:172.169.3.251主从端口:6379、6380、6381哨兵端口,26379、26380、26381安装目录:/usr/local/redis配置文件目录:/usr/loca/redis/conf redis安装 1、下载redis wget ht…

设计模式--策略模式

文章目录前言一、未使用设计模式二、策略模式1.定义2.结构三、应用场景四、优缺点优缺参考资料前言 需求: 一天,产品经理走过来对你说。猫啊(自称),帮我设计一个计算器,需要的功能有求最大值,最…

【JavaEE-Servlet】Filter过滤器详解

Filter过滤器熟悉的关键字-Filter(回顾-联系-可以不看)Filter概述何时使用?Filter生命周期过滤器单个实现doFilter方法关于Filter的配置路径Filter的执行顺序在web.xml文件中进行配置的时候,Filter的执行顺序是什么?使…

HTML期末学生大作业-班级校园我的校园网页设计与实现html+css+javascript

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

[附源码]Python计算机毕业设计Django停车场管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

使用 JavaScript 检测用户是否在线

有时您可能希望增强您的应用程序以通知用户他们可能已经失去了互联网连接。 用户可能正在访问您的网站并收到缓存版本,因此通常看起来他们的互联网仍在工作。 然而,他们失去了引擎盖下的连接,并且不会加载任何新内容。 在这里向他们显示一些…

博客系统(页面设计)

努力经营当下,直至未来明朗! 文章目录前言一、【博客列表页】blog_list.html参考代码:二、【博客详情页】 blog_detail.html参考代码:三、【博客登录页】login.html参考代码:四、【博客编辑页】参考代码:【…