# 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)