授权与认证
说到授权认证,可能会第一时间想到登录,那么登录不就是账号密码输入,然后加密到数据库里匹配是否正确吗?有什么难的,其实登录很重要:
- 登录认证模式多样
- QQ登录
- 短信登录
- 微信登录
- 支持的前端渠道多样
- 网页端
- APP端
- 支持集群环境,跨应用工作,Session控制,控制用户权限,说防护与身份认证相关的攻击
认证和授权如此复杂,因此也诞生了作者对SpringSecurity系列的学习。本系列将主要从SpringSecurity,Spring Social,Spring Security OAuth来给大家进行讲解。
SpringSecurity:Spring Social和Spring Security OAuth的底层实现是它,我们主要研究它实现用户名+密码认证和手机号+短信认证的,和底层代码实现。Spring Social主要用于第三方认证,比如QQ,微信的接入。Spring Security OAuth来创建、分发、管理Token信息,因为APP和后端服务器通讯的时候无法存储Session的问题,所以我们采用Token的方式来存储登录用户的认证信息,就需要用到OAuth

如上图,也可以清除看出来三个安全组件的职责
开发架构搭建
既然要学习SpringSecurity,肯定需要例子进行学习,这里我们会创建一个主模块用来管理依赖,4个从模块用来写业务代码,使用SpringBoot2.x进行整合,如下:

spring-security:主模块,主要用于依赖管理spring-security-app:app相关代码spring-security-browser:浏览器安全相关代码spring-security-core:核心业务逻辑代码spring-security-demo:样例代码
下面我们开始搭建,这里我们主要是将所需依赖进行引入,即修改pom文件
spring-security
这里引入spring.io是因为他集成了非常多的依赖,比如SpringBoot,SpringSecurity,oauth2等等,这里Cairo-SR7版本使用了SpringBoot2.0.8版本,用作依赖管理,之后在子模块引入依赖时就不需要添加版本了
引入Cloud也只是用作依赖管理,没有进行使用
1 | <dependencyManagement> |
spring-security-core
对于核心代码,这里引入了最关键的oauth2以及social相关的依赖
并且引入了redis和jdbc依赖,因为到时候业务需要存储Session或token时,需要保存到redis或mysql
1 | <dependencies> |
spring-security-app
对于app模块,只需引用核心模块即可,因为引用都包含在core中了,所以它的pom.xml很简单
1 | <dependencies> |
spring-security-browser
browser也是引用核心模块,但是稍有不同的是因为它是浏览器,所以需要使用session,依赖需要添加一个session
1 | <dependencies> |
spring-security-demo
这里我们暂时先引入browser,后期在讲token方面的东西的时候会引入app,另外我们这里还加入了spring-boot-maven-plugin,让我们打包成可运行的jar包,如果说大家不加后面的build,可以看到你打出来的jar包是没有把相关的依赖放进去的,是没法直接执行的。
1 | <dependencies> |
Hello World
既然我们创建好了工程,那么肯定要先写一个helloworld运行一下
创建启动器类
1 |
|
这里如果我们直接启动,一定会报错,因为我们添加了数据库依赖,但没有配置数据库连接信息
添加配置文件
1 | =com.mysql.jdbc.Driver |
添加完配置文件后,可以重新启动,发现启动成功,这时访问http://localhost:8080/helloworld

会发现跳转到login页面,这是因为在springboot环境下,spring security会被自动装配,即默认开启
这里的用户名密码可以通过查看SecurityProperties类发现:

用户名默认为user,密码是UUID自动生成的,会打印在控制台,这里输入用户名密码即可看到打印的信息

关闭Security自动装配
在springboot2.x版本之前的关闭方法:
- 配置文件中添加:
security.basic.enabled=false
在springboot2.x之后版本关闭方法:
- 在启动器类上添加注解,排除
Security的自动装配
1 | (exclude = { |
重新启动后访问

成功访问,并且控制台没有打印UUID生成的密码了
本篇文章,我们主要是简单介绍Security和使用springboot2.0先把基本框架搭建好,后面的文章中,我们将深入Security进行研究。