名称
示例
实质重于形式
(1)金融负债与权益工具的区分。(2)合并财务报表合并范围的确定。(3)附有追索权的票据贴现。(4)控股股东代为偿债、债务豁免等
重要性
无论会计差错重要与否均需进行调整:(1)重要的会计差错:追溯重述。(2)不重要的会计差错:无须追溯重述
相关性
(1)区分收入和利得、费用和损失。(2)区分流动资产和非流动资产、流动负债和非流动负债。(3)以及适度引入公允价值等
谨慎性
(1)各类资产计提减值准备。(2)确实无法区分研究阶段的支出和开发阶段的支出,应将其所发生的研发支出全部费用化,计入当期损益。(3)递延所得税资产的确认应以未来可以取得的应纳税所得额为限。(4)企业在销售商品时便根据历史经验对承担的保修义务确认预计负债等
前言随着Web应用和微服务架构的普及,作为Java开发者,如何保证系统免受各种安全威胁(如未经授权的访问、数据泄露、跨站请求伪造等)已成为我们必须解决的问题。
Spring Security作为Spring生态系统中的核心组件,通过提供认证(Authentication)、授权(Authorization)以及针对常见攻击的防护机制,为开发者构建安全稳定的应用提供了强有力的支持。
什么是Spring Security?
官方文档:https://docs.spring.io/spring-security/reference/index.html
Spring Security是一个基于Spring框架的强大安全解决方案,它为应用提供了一整套安全服务,主要包括以下几个方面:
认证(Authentication):确定访问者身份的过程。Spring Security通过多种方式(如表单登录、Basic认证、OAuth2等)实现用户身份验证。
授权(Authorization):根据用户身份和权限确定资源访问级别。开发者可以通过配置或注解的方式,灵活控制不同用户对不同资源的访问权限。
防 ...
1. 前言在实际项目中,安全控制不仅体现在URL拦截层面,方法级安全控制也越来越受到重视。Spring Security提供了多种方式实现方法级安全,通过方法注解体系,这种细粒度控制使得我们能够在方法调用前、调用后,甚至返回值处理阶段实施安全检查,真正成为开发者保护服务接口的重要手段。
相信小伙伴们通过前面章节的学习,发现了博主在方法上进行角色和菜单资源验证时使用的一个注解:@PreAuthorize。那么本章节博主将带着大家剖析**@PreAuthorize**注解的核心原理、SpEL表达式机制,并通过示例代码演示如何在实际项目中灵活运用该注解实现细粒度的权限控制。
2. @PreAuthorize注解简介@PreAuthorize注解可以在方法执行前对传入的参数、当前用户信息、认证状态等进行校验,从而决定是否允许方法执行。常见使用场景包括:
限制某个接口或方法只允许特定角色访问;
根据方法参数和认证信息动态判断权限;
调用自定义的权限判断逻辑(例如上一章节中结合自定义PermissionEvaluator);
Spring Security内部通过AOP拦截被@PreAuth ...
1. 前言又是新的一周,博主继续来给大家更新 Spring Security 实战教程系列啦~ 通过前面的章节教程从认证到授权,相信大家已经基本了解 Spring Security 的工作原理。
但在前后端分离架构成为主流的今天,传统的 Session-Cookie 认证模式面临跨域限制、服务端状态维护等难题。JWT(JSON Web Token)作为无状态令牌方案,凭借其自包含、易扩展的特性,成为现代分布式系统的首选认证方案。
那么本章节,博主就带着大家一起来进行 Spring Security 前后端分离认证实战,手把手教构建安全的 JWT 认证体系!
2. JWT 基本原理JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在各方之间以 JSON 对象安全地传输信息。其主要特点包括:
无状态:服务端无需保存会话信息,降低了服务端压力(传统 Session 是保存服务端)
跨域支持:适用于前后端分离应用场景
JWT 通常由三部分组成:Header、Payload 和 Signature。在认证场景中,用户登录后服务器生成一个包含用户信息的 Toke ...
最新Spring Security实战教程(三):Spring Security的底层原理解析1. 前言相信通过前面两个章节的讲解,大家已经对Spring Security有了一个初步认识。今天这个章节我们主要聊一聊Spring Security的底层原理。为什么我们只要简单的一个配置就可以实现想要的功能?实际上Spring Security的Servlet支持就是基于Servlet过滤器Filter!
官方文档参考:https://docs.spring.io/spring-security/reference/servlet/architecture.html
回顾过滤器Filter以下引入官方文档的示例图来回顾一下单个HTTP请求的处理程序的典型分层:
开发者可以在每个Filter过滤器中对请求进行修改或增强。
委托过滤代理DelegatingFilterProxySpring提供了一个名为DelegatingFilterProxy的Filter实现,它可以在Servlet容器和Spring容器之间建立桥梁:
为什么需要一个桥梁?因为Servlet容器并不知道Spring容器 ...
前言通过上一章节的讲解,相信大家已经认识了Spring Security安全框架。在我们创建的第一个演示项目中,相信大家也发现了默认表单登录的局限性。Spring Security默认提供的登录页虽然快速可用,但存在三大问题:
界面风格与业务系统不匹配
登录成功/失败处理逻辑固定
缺乏扩展能力(如验证码、多因子认证)
本章节我们将对Spring Security默认表单进行登录定制,并深度改造处理逻辑。
改造准备在之前的Maven项目中创建第二个子模块,命名为login-spring-security。由于需要自定义登录页,还需要引入thymeleaf模板框架:
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
完整的Maven项目结构如下:
开始登录页改造创建自定义登录页首先 ...
1. 前言在我们日常开发的后台系统中,”Remember-Me“(记住我)功能是一种常见的安全增强机制,允许用户在关闭浏览器后仍然保持登录状态,而无需重新输入用户名和密码。Spring Security提供了多种Remember-Me方案,最常用的是基于哈希的Token方案和持久化令牌方案。
本章节博主将详细讲解这两种方案的实现,带大家快速入门!在实际开发中,小伙伴们可根据各自需求进行改造。
2. Remember-Me机制概述在Spring Security中,Remember-Me的核心作用是在会话失效后依然允许用户自动登录。其基本工作流程(以更常用的持久化令牌方案为例)如下:
用户登录成功后,如果勾选了”记住我”,服务器会创建一个Remember-Me Token,并存储在客户端的Cookie中。
当用户的会话失效后,系统会检查Cookie是否存在并有效:
如果有效,则自动完成登录;
如果无效或过期,则用户需要重新认证。
Spring Security主要提供两种Remember-Me方案:
方案
实现类
特点
基于Token(默认方案)
TokenBas ...
1. 前言在上一章节中,我们讲解了Spring Security基于内存的用户认证,也提到了实际开发生产中更多使用的还是基于数据库的动态用户认证,因为在企业应用中,用户、角色、权限管理通常都存储在数据库中。
本章节博主将带着大家以MySQL数据库为例,从用户(sys_user)、角色(sys_role)、用户角色(sys_user_role)、系统菜单资源(sys_menu)、角色菜单(sys_role_menu)表出发,演示如何使用Spring Security动态加载用户信息、角色,实现基于数据库的RBAC角色模型认证。
2. 数据库表结构说明本文示例基于整理的MySQL表结构,其中主要表结构如下(大家可以根据自己的业务需求进行扩展):
sys_user:存储用户信息,字段包括user_id、login_name、password等
sys_role:存储角色信息,字段包括role_id、role_name(角色名称)、role_key(角色标识)等
sys_user_role:关联用户和角色的中间表
sys_menu:系统菜单资源表,字段包括menu_id、menu_name( ...
1. 前言今天博主又抽空来给小伙伴们更新Spring Security教程啦!上个章节中我们讲解了如何通过数据库实现基于数据库的动态用户认证。大家可能发现了,项目中是基于RBAC角色模型的权限控制,虽然能满足大多数场景,但在面对复杂、细粒度的权限需求时可能会力不从心。基于属性的访问控制(ABAC)模型则通过评估用户、资源、环境等多种属性,实现更加灵活的权限控制。
例如,某个菜单的访问可能不仅取决于用户角色,还取决于用户的部门、时间或其他属性。因此,需要在权限验证时动态获取这些属性并进行评估。那么本章节我们就来讲解基于数据库的ABAC属性权限模型实战开发。
2. 权限决策依据既然谈到了RBAC和ABAC两个模型,就给大家介绍下两者间的区别:
RBAC
核心思想:以角色作为权限管理的核心,每个用户被赋予一个或多个角色,而角色与权限之间存在固定的映射关系。
决策依据:当用户请求访问资源时,系统根据用户所属角色所拥有的权限进行校验。
粒度:粒度相对较粗,因为权限是绑定在角色上的,无法针对单个请求条件进行动态决策。
ABAC
核心思想:以属性(Attribute)为基础,利用用户属性、资源属 ...
1. 前言在前面学习的章节中,相信大家一定看过一个配置.csrf()。回忆一下之前使用Spring Security默认页登录的时候,该配置Spring Security默认开启,主要用于CSRF防护。如果你现在还不了解什么是CSRF防护,没关系,通过本章节,博主带着大家一起深入学习这个知识点~
2. CSRF攻击原理跨站请求伪造(CSRF)是一种利用受信任用户的身份,诱使用户在已登录的应用中执行非预期操作的攻击手段。
当用户在某个站点(如银行)登录并持有有效Session Cookie后,攻击者可通过精心构造的请求(例如隐藏在图片或表单中的POST请求)在用户不知情的情况下向该站点发起请求,并携带用户的Cookie,从而完成诸如转账、修改邮箱等敏感操作。
2.1 攻击原理图解
用户访问了A站点,获得了Session或Cookie后,用户不经意间访问到了恶意网站,此刻恶意网站伪造对A站点的危险请求
2.2 攻击示例下面示例展示了一个最常见的CSRF攻击场景:用户登录了https://bank.com后,攻击者在自己的网站https://evil.com上放置如下HTML片段:
1 ...














