# security5demo
**Repository Path**: codezhx/security5demo
## Basic Information
- **Project Name**: security5demo
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-05-15
- **Last Updated**: 2021-05-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 安全框架的对比
我们为了项目的安全考虑,一般会为项目引入对应的安全框架,当然大牛也会自己来实现安全框架, 现在市面上有两款比较流行的安全框架(Java 体系),一款是shiro,一款是Spring security,在springboot项目以前,shiro一直被大众接受, 因为security配置太复杂了,shiro学习成本低,出活速度快.
这一切都在springboot后发生了改变,借助于springboot的自动装配特性,springsecurity基本可以变得开箱即用,非常易学, 并且其概念相对来说也与spring体系相辅相成, 其次, 现在很多项目实际上都在沿用security, 譬如 springbootadmin, activiti7, eureka, nacos等,可以看得出,基本上是必须去了解去学习的.
::: danger 注意
spring体系内部学习security一定没错
:::
::: warning 提示
计算机的安全攻防是一个非常专业的事情, 我们仅能实现自己能考虑到的部分, 大型的系统和机构都具备成熟的风控以及管理手段,大家从这个里面能了解到基础的安全知识就好(传统功夫点到为止).
:::
### security 现状简介 (基于spring security 5.4)
目前在spring security下我们可以简单理解为分为三部分项目在同时进行:
1. spring-security 主版本,后续将作为主要的框架作为使用, 下面包含了oauth2-client等包.
2. spring-oauth2 (spring-security-oauth2-autoconfigure, spring-cloud-security等)都归为此类,此类与19年开始表示将废弃,
如今最新的2.5.1版本包内所有类都已经添加废弃标识, 其包含了完整的oauth2服务端实现, real-pro用户中心基于此实现
3. 授权服务器(已发布1.0,但不可商用) 后续替代spring-oauth2的授权服务器项目
>较为详细的内容大家可以看这一篇博客[Spring官方宣布:新的Spring OAuth2.0授权服务器已经来了](https://www.jianshu.com/p/09fcd1e26c76)
## 学习Security之前必须了解的概念
### 认证/授权
Authentication: 认证
Authorization: 授权
::: tip 提示
这两个英文一定要学会,基本贯穿了整个security的学习过程
:::
### FilterChain
Security与其他大量的spring项目一样,内部也是由大量的过滤链来实现的, 大部分源码跟踪都是在跟踪里面的Filter.
### 必须要了解的源码包(Spring security 5.4版本)
# 版本简介
当前使用所有框架版本:
1. spring-boot版本: 2.4.5
1. spring-security: 5.4.6
::: tip 提示
> 在我们开始前,你必须具备如下知识:
>1. 熟练的使用Idea
>2. 熟练的使用maven创建项目
>3. 对springboot具备一定的了解
:::
# 正式开始建立项目
## 思路清晰 先说业务
我们现在首先将构建一个Springboot项目, 在这个项目里面我们需要实现三个简单的接口:
1. 不需要登录就可以访问的登录
2. 需要登录才能访问的接口
3. 需要授权才能访问的接口
>推荐这一步大家自己来实现一次,我也将实现一个简单的demo
## 基础Demo开始建立
maven pom.xml 引用
```
1.8
UTF-8
UTF-8
2.4.5
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
1.8
1.8
UTF-8
org.springframework.boot
spring-boot-maven-plugin
2.4.5
com.zhx.hello.security5.Security5Application
repackage
repackage
```
启动 Application 应用 在src根目录写一个Application启动类 `StartApplication`
```
/**
* @author zhanghaixuan
* @version 1.0
* date 2021/5/17-2:00 下午
* description security5demo
*/
@SpringBootApplication
public class StartApplication {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class,args);
}
}
```
实现三个接口 `UserController`
```
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/dontneedAuth")
public String dontneedAuth(){
return "dontneedAuth";
}
@GetMapping("/needAuth")
public String needAuth(){
return "needAuth";
}
@GetMapping("/needAuthAndRole")
public String needAuthAndRole(){
return "needAuthAndRole";
}
}
```
启动项目 访问接口`http://127.0.0.1:8080/user/dontneedAuth` ,项目建立完毕,下面开始引入security
## 开始引入 Security
### 基础说明
当前我们发现,系统非常简陋,在访问接口的时候连基础的身份认证都没有, 我们现在引入security, 开始建立最基础的认证过程.
### 开始改造项目
**pom.xml引入security**
```
org.springframework.boot
spring-boot-starter-security
true
```
**什么都不需要做,直接启动项目即可**
>启动的时候看一下控制台的输出
```
Connected to the target VM, address: '127.0.0.1:50928', transport: 'socket'
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.5)
2021-05-19 10:15:08.143 INFO 56665 --- [ main] c.z.security.StartApplication : Starting StartApplication using Java 1.8.0_275 on zhanghaixuandeMacBook-Pro.local with PID 56665 (/Users/zhanghaixuan/selfproject/security5demo/hellosecurity/target/classes started by zhanghaixuan in /Users/zhanghaixuan/selfproject/security5demo)
2021-05-19 10:15:08.146 INFO 56665 --- [ main] c.z.security.StartApplication : No active profile set, falling back to default profiles: default
2021-05-19 10:15:09.131 INFO 56665 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-05-19 10:15:09.144 INFO 56665 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-05-19 10:15:09.144 INFO 56665 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.45]
2021-05-19 10:15:09.212 INFO 56665 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-05-19 10:15:09.212 INFO 56665 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1016 ms
2021-05-19 10:15:09.521 INFO 56665 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-05-19 10:15:09.730 INFO 56665 --- [ main] .s.s.UserDetailsServiceAutoConfiguration :
/** 注意这句,UserDetailsServiceAutoConfiguration输出了一个密码 **/
Using generated security password: b5b4be14-d467-49ef-99f8-ee1256360f2e
2021-05-19 10:15:09.862 INFO 56665 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@47547132, org.springframework.security.web.context.SecurityContextPersistenceFilter@7207cb51, org.springframework.security.web.header.HeaderWriterFilter@57ce634f, org.springframework.security.web.csrf.CsrfFilter@3721177d, org.springframework.security.web.authentication.logout.LogoutFilter@35ff8fc9, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@cc239ba, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@476a736d, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@655523dd, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@6f0cb5a1, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@6892cc6f, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4e2916c3, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6f7e336b, org.springframework.security.web.session.SessionManagementFilter@35835fa, org.springframework.security.web.access.ExceptionTranslationFilter@6edcd0d8, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@236134a1]
2021-05-19 10:15:09.949 INFO 56665 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-05-19 10:15:09.974 INFO 56665 --- [ main] c.z.security.StartApplication : Started StartApplication in 2.382 seconds (JVM running for 3.015)
```
再次访问接口`http://127.0.0.1:8080/user/dontneedAuth`
发现现在访问接口的时候就会自动跳转到默认的登录页面, 并且需要输入用户名密码, 这里security默认的用户是user,密码就是控制台输出的密码
输入用户名密码, 发现就可以访问到之前的接口了.
到此为止,我们已经利用security完成了对接口的认证保护了.
[ 源码地址,使用hello security分支](https://gitee.com/codezhx/security5demo)