Spring Security认证流程分析(6)
1.认证流程分析 Spring Security中默认的一套登录流程是非常完善并且严谨的。但是项目需求非常多样化, 很多时候,我们可能还需要对Spring Secinity登录流程进行定制,定制的前提是开发者先深刻理解Spring Security登录流程,然后在此基础之上,完成对登录流程的定制。本文将从头梳理 Spring Security登录流程,并通过几个常见的登录定制案例,深刻地理解Spring Security登录流程。 本章涉及的主要知识点有: 登录流程分析。 配置多个数据源。 添加登录验证码。 1.1登录流程分析要搞清楚Spring Security认证流程,我们得先认识与之相关的三个基本组件(Authentication 对象在前面文章种己经做过介绍,这里不再赘述):AuthenticationManager、ProviderManager以及AuthenticationProvider,同时还要去了解接入认证功能的过滤器 AbstractAuthenticationProcessingFilter,这四个类搞明白了,基本上认证流程也就清楚了,下面我们逐个分析 ...
Spring Security自定义登录认证与数据持久化(5)
1.用户定义 在前面的案例中,我们的登录用户是基于配置文件来配置的(本质是基于内存),但是在实际开发中,这种方式肯定是不可取的,在实际项目中,用户信息肯定要存入数据库之中。 Spring Security支持多种用户定义方式,接下来我们就逐个来看一下这些定义方式。通过前面的介绍(参见3小节),大家对于UserDetailsService以及它的子类都有了一定的了解, 自定义用户其实就是使用UserDetailsService的不同实现类来提供用户数据,同时将配置好的 UserDetailsService 配置给 AuthenticationManagerBuilder,系统再将 UserDetailsSeivice 提供给 AuthenticationProvider 使用, 1.1 基于内存前面案例中用户的定义本质上还是基于内存,只是我们没有将InMemoryUserDetailsManager类明确抽出来自定义,现在我们通过自定义InMemoryUserDetailsManager来看一下基于内存的用户是如何自定义的。 重写 WebSecurityConfigurerA ...
Spring Security登录用户数据获取(4)
1. 登录用户数据获取 登录成功之后,在后续的业务逻辑中,开发者可能还需要获取登录成功的用户对象,如果不使用任何安全管理框架,那么可以将用户信息保存在httpsSession中,以后需要的时候直接从httpsSession中获取数据。在Spring Security中,用户登录信息本质上还是保存在 httpsSession中,但是为了方便使用,Spring Security对httpsSession中的用户信息进行了封装, 封装之后,开发者若再想获取用户登录数据就会有两种不同的思路: 从 SecurityContextHolder 中获取 从当前请求对象中获取。 这里列出来的两种方式是主流的做法,开发者也可以使用一些非主流的方式获取登录成功后的用户信息,例如直接从httpsSession中获取用户登录数据, 无论是哪种获取方式,都离不开一个重要的对象:Authentication。在Spring Security中, Authentication对象主要有两方面的功能: 作为AuthenticationManager的输入参数,提供用户身份认证的凭证,当它作为一个 输入参数时, ...
Spring Security登录表单配置(3)
1. 登录表单配置1.1 快速入门理解了入门案例之后,接下来我们再来看一下登录表单的详细配置,首先创建一个新的Spring Boot项目,引入Web和Spring Security依赖,代码如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency> 项目创建好之后,为了方便测试,需要在application.yml中添加如下配置,将登录用户名和密码固定下来: spring: securit ...
Spring Security基本认证(2)
对于安全管理框架而言,认证功能可以说是一切的起点,所以我们要研究Spring Security, 就要从最基本的认证开始。在Spring Security中,对认证功能做了大量的封装,以至于开发者只需要稍微配置一下就能使用认证功能,然而要深刻理解其源码却并非易事。本文从最基本的用法开始讲解,最终再扩展到对源码的理解。 本章涉及的主要知识点有: Spring Security 基本认证。 登录表单配置。 登录用户数据获取。 用户的四种定义方式。 1.Spring Security 基本认证1.1 快速入门在Spring Boot项目中使用Spring Security非常方便,创建一个新的Spring Boot项目,我 们只需要引入Web和Spring Security依赖即可,具体代码如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> ...
Spring Security的认证和授权(1)
1.Spring Security 简介Java企业级开发生态丰富,无论你想做哪方面的功能,都有众多的框架和工具可供选择, 以至于SUN公司在早些年不得不制定了很多规范,这些规范在今天依然影响着我们的开发, 安全领域也是如此,然而,不同于其他领域,在Java企业级开发中,安全管理方面的框架非常少,一般来说,主要有三种方案: Shiro Spring Security 开发者自己实现 Shiro本身是一个老牌的安全管理框架,有着众多的优点,例如轻量、简单、易于集成、 可以在JavaSE环境中使用等。不过,在微服务时代,Shiro就显得力不从心了,在微服务面前, 它无法充分展示自己的优势。 也有开发者选择自己实现安全管理,这一部分人不在少数,但是一个系统 的安全,不仅仅是登录和权限控制这么简单,我们还要考虑各种各样可能存在的网络攻击以及防御策略,从这个角度来说,开发者自己实现安全管理也并非是一件容易的事情,只有大公司才有足够的人力物力去支持这件事情。Spring Security作为Spring家族的一员,在和Spring家族的其他成员如Spring Boot、Spring C ...
Spring Security- SpringBoot(18)
由于Spring Security内容较多,本人决定先学Spring Security然后继续更新springboot1.认识Spring Security Spring Security提供了声明式的安全访问控制解决方案(仅支持基于Spring的应用程序),对访问权限进行认证和授权,它基于Spring AOP和Servlet过滤器,提供了安全性方面的全面解决方案。 除常规的认证和授权外,它还提供了 ACLs、LDAP、JAAS、CAS等高级特性以满足复杂环境下的安全需求。 1.1 核心概念Spring Security的3个核心概念。 Principle:代表用户的对象Principle ( User),不仅指人类,还包括一切可以用于验证的设备。 Authority: 代表用户的角色Authority ( Role ),每个用户都应该有一种角色,如管理员或是会员。 Permission:代表授权,复杂的应用环境需要对角色的权限进行表述。 在Spring Security中,Authority和Permission是两个完全独立的概念,两者并没有必然的联系。它们之间需要 ...
RESTful与Swagger(接口架构风格)- SpringBoot(17)
1.认识REST1.1什么是REST REST是软件架构的规范体系结构,它将资源的状态以适合客户端的形式从服务器端发送到客户端(或相反方向)。在REST中,通过URL进行资源定位,用https动作GET、POST、DELETE、PUSH等)描述操作,完成功能。 道循RESTful风格,可以使开发的接口通用,以便调用者理解接口的作用。基于REST构建的 API 就是 RESTful ( REST 风格)API. 各大机构提供的API基本都是RESTful风格的。这样可以统一规范,减少沟通、学习和开发 的成本。 1.2 REST的特征 客户一服务器(client-server):提供服务的服务器和使用服务的客户端需要被隔离对待。 无状态(stateless):服务器端不存储客户的请求中的信息,客户的每一个请求必须包含服务器处理该请求所需的所有信息,所有的资源都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而变化。 Restful是典型的基于https的协议。https连接最显著的特点是:客户端发送的每次请求都需要服务器回送响应;在请求结束后,主动释 ...
Mybatis与实现分页- SpringBoot(16)
1.认识Mybatis MyBatis和JPA一样,也是一款优秀的持久层框架,它支持定制化SQL、存储过程,以及高级映射。它可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs ( Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 MyBatis 3提供的注解可以取代XML例如,使用注解@Select直接编写SQL完成数据查询; 使用高级注解@SelectProvider还可以编写动态SQL,以应对复杂的业务需求。 2.Mybatis详细介绍2.1 CRUD注解増加、删除、修改和查询是主要的业务操作,必须掌握这些基础注解的使用方法。MyBatis提供的操作数据的基础注解有以下4个。 @Select:用于构建查询语句。 @Insert:用于构建添加语句。 @Update:用于构建修改语句。 @Delete:用于构建删除语句。 下面来看看它们具体如何使用,见以下代码: package com.itheima.mapper;import com.itheima.domain.User;import org.apac ...
ORM ( Object Relation Mapping )和JPA—Java持久层API- SpringBoot(15)
1.认识ORM ORM ( Object Relation Mapping )是对象/关系映射。它提供了概念性的、易于理解的数据模型,将数据库中的表和内存中的对象建立映射关系。它是随着面向对象的软件开发方法的发展而产生的,面向对象的开发方法依然是当前主流的开发方法。 对象和关系型数据是业务实体的两种表现形式。业务实体在内存中表现为对象,在数据库中表现为关系型数据。内存中的对象不会被永久保存,只有关系型数据库(或NoSQL数据库,或文件) 中的对象会被永久保存。 对象/关系映射(ORM)系统一般以中间件的形式存在,因为内存中的对象之间存在关联和继承关系,而在数据库中,关系型数据无法直接表达多对多的关联和继承关系。对象、数据库通过ORM 映射的关系如图所示。 2.JPA2.1认识 Spring DataSpring Data是Spring的一个子项目,旨在统一和简化各类型数据的持久化存储方式,而不拘泥于是关系型数据库还是NoSQL数据库。无论是哪种持久化存储方式,数据访问对象(Data Access Objects, DAO)都会提供对对象的增加、删除、 ...
JDBCTemplate- SpringBoot(14)
1.认识 JDBCTemplate1.了解 JDBC 学习使用 JDBCTempIate 之前,我们先来了解一下 JDBC( Java DataBase Connectivity )。 它是Java用于连接数据库的规范,也就是用于执行数据库SQL语句的Java API。从JDBC的名称上看,它似乎没有指定某种数据库。可以猜想它可以为多种数据库提供统一访问的接口,这更符合程序设计的模式。实际上,它由一组用Java语言编写的类和接口组成,为大部分关系型数据库提供访问接口。 JDBC需要每次进行数据库连接,然后处理SQL语句、传值、关闭数据库。如果都由开发人员编写代码,则很容易岀错,可能会出现使用完成之后,数据库连接忘记关闭的情况。这容易导致连接被占用而降低性能,为了减少这种可能的错误,减少开发人员的工作量,JDBCtemplate就被设计岀来了 2.了解 JDBCTemplate JDBCTemplate=JDBC+Template的组合,是对JDBC的封装。它更便于程序实现,替我们完成所有的JDBC底层工作。因此,对于数据库的操作,再不需要每次都进行连接、打开、关闭了。 ...
单元测试- SpringBoot(13)
1.单元测试单元测试(unit test)是为了检验程序的正确性。一个单元可能是单个程序、类、对象、方法 等,它是应用程序的最小可测试部件。 单元测试的必要性如下: 预防Bug。 快速定位Bug。 提高代码质量,减少耦合。 减少调试时间。 减少重构的风险。 2.Spring Boot的测试库Spring Boot提供了 spring-boot-starter-test启动器。通过它,能引入一些有用的测试库, 如下所示。 Spring Test&Spring Boot Test: Spring Boot提供的应用程序功能集成化测试支持。 Junit: Java应用程序单元测试标准类库。 AssertJ:轻量级的断言类库。 Hamcrest:对象匹配器类库。 Mockito: Java Mock 测试框架。 JsonPath: JSON 操作类库。 JSONassert:用于JSON的断言库。 2.1回归测试框架JUnitJUnit是对程序代码进行单元测试的Java框架。它用来编写自动化测试工具,降低测试的难度、 减少烦琐性,并有效避免岀现程序错误。 JUnit测试是白盒测 ...















