一、引入

只要引入了spring-boot-starter-security,所有的服务都会被保护起来。启动项目,打开时所有的controller会被保护起来,随便访问一个,如http://localhost:8080/user就是这个效果,让我们输入用户名密码,默认的用户名是user,密码会在应用启动时在控制台打印:Using default security password: 1e520d65-b38b-4522-a340-fbe2612821fc

然后才能正常访问接口:

在application.properties里可以关闭这个默认值:security.basic.enabled = false,就不会有登录认证了。

表单登录

受保护的接口,需要登录才能访问的,一般都是跳转到登录页,springboot默认那个弹框原来是http basic认证(网上找的以前我还真不知道这个):

在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中,如当用户名为anjuta,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据时,将密文附加于请求头(Request Header)中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

下边就来让springboot去做表单登录这件事:

在browser项目新建一个配置类:

package com.imooc.security.browser;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration //这是一个配置
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter{@Overrideprotected void configure(HttpSecurity http) throws Exception {//实现需要认证的接口跳转表单登录,安全=认证+授权//http.httpBasic() //这个就是默认的弹框认证http.formLogin() //表单认证
            .and().authorizeRequests() //下边的都是授权的配置.anyRequest()        //任何请求 .authenticated();    //都需要身份认证
    }
}

这样springboot就会跳转到默认的登录页面了:

springboot做了一个跳转,再跳到/user:

二、SpringSecurity基本原理

SpringSecurity就是一组过滤器,是一个过滤器链。应用启动的时候SpringBoot会自动给配置进去,所有请求和响应都会经过过滤器链。

绿色的一系列过滤器:可配置,作用就是认证用户的身份,检查当前的请求里是否有过滤器所需要的信息。

      如UsernamePasswordAuthenticationFilter:处理表单登录,会检查请求是否是登录请求,有的话是否带用户名密码,有的话就用用户名密码做登录,否则就放过,执行下一个过滤器,如http basic过滤器。

      BasicAuthenticationFilter处理http basic登录。

FilterSecurityInterceptor:不可配置,过滤器最后的守门员, 到达controller之前,会经过这个过滤器。他决定是否能访问Controller,依据就是上边BrowserSecurityConfig 配置类里的配置(这个配置可以按需配置,如可以配置权限VIP用户才能访问等)飘红部分是说所有的请求都需要经过认真才能访问,所以FilterSecurityInterceptor就判断请求是否已经经过了一个过滤器的认证。判断的结果就是过或者不过,过的话就能访问controller了,不过的话就会根据不能访问的原因抛出相应的异常,如没有经过身份认证就抛出没身份认证异常,如通过了身份认证没有经过权限认证就抛出没有权限异常等。

ExceptionTranslationFilter:不可配置,处理FilterSecurityInterceptor抛出的异常,根据不同的异常进行相应处理。如未登录抛的异常,就跳到登录页或进行httpbasic弹框认证。

SpringSecurity提供的所有的功能特性都是建立在这个过滤器链基础上的,手机验证码登录、qq、微信登录都是在这个绿色的过滤器链上加过滤器。

转载于:https://www.cnblogs.com/lihaoyang/p/8481821.html

Spring Security构建Rest服务-0600-SpringSecurity基本原理相关推荐

  1. Spring Security构建Rest服务-0702-短信验证码登录

    先来看下 Spring Security密码登录大概流程,模拟这个流程,开发短信登录流程 1,密码登录请求发送给过滤器 UsernamePasswordAuthenticationFilter 2,过 ...

  2. Spring Security构建Rest服务-0100-前言

    一.我的前言 这是看慕课网老师讲的SpringSecurity的学习笔记,老师讲的很好,开篇就说到了我的心里,老师说道: 有一定经验的程序员如何提升自己? 1,每天都很忙,但是感觉水平没有提升 2,不 ...

  3. Spring Security构建Rest服务-1401-权限表达式

    Spring Security 的权限表达式 用法,在自定义的BrowserSecurityConfig extends WebSecurityConfigurerAdapter 配置文件里,每一个a ...

  4. Spring Security构建Rest服务-1400-授权

    安全分为 认证和授权,前边讲的都是认证,现在说授权. 前端业务系统的权限简单些,一般只区分是否登录,复杂点的还会区分 VIP用户等简单的角色,权限规则基本不变. 后台系统比较复杂,角色众多,权限随着业 ...

  5. 将Spring Security OAuth2授权服务JWK与Consul 配置中心结合使用

    将Spring Security OAuth2授权服务JWK与Consul 配置中心结合使用 概述 在前文中介绍了OAuth2授权服务简单的实现密钥轮换,与其不同,本文将通过Consul实现我们的目的 ...

  6. 1.Spring Cloud 构建微服务应用程序之概览

    1.Spring Cloud 构建微服务应用程序之概览 1.1 微服务发展史 1.2 为什么要学习微服务应用开发? 1.3 微服务和分布式之间的关系 1.4 微服务架构下构建分布式系统带来了哪些问题? ...

  7. Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】

    通过上一篇<分布式服务跟踪(整合logstash)>,我们虽然已经能够利用ELK平台提供的收集.存储.搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利.但是,在ELK平台中的数据分析 ...

  8. Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】

    通过之前的<入门示例>,我们已经为两个由SpringCloud构建的微服务项目 trace-1和 trace-2引入了Spring Cloud Sleuth的基础模块 spring-clo ...

  9. Spring Cloud构建微服务架构:分布式服务跟踪(跟踪原理)

    通过上一篇<分布式服务跟踪(入门)>的例子,我们已经通过Spring Cloud Sleuth往微服务应用中添加了实现分布式跟踪具备的基本要素.下面通过本文来详细说说实现分布式服务跟踪的一 ...

最新文章

  1. 使用复合数据类型——PL/SQL表
  2. Ubuntu12.04 VMware Tools的安装
  3. sublime使用正则匹配
  4. C\C++ 获取当前路径
  5. 高并发场景下的缓存 + 数据库双写不一致问题分析与解决方案设计
  6. 在页面里点击一个按钮后出来一个层,可以操作的那么一个层!
  7. Business Connectivity Services 团队博客简介
  8. C#多线程操作----处理并发的问题,Lock关键字
  9. 黑客泄露50多万服务器、路由器和物联网设备的密码
  10. java 句柄无效_sql报句柄无效。 (异常来自 HRESULT:0x80070006 (E_HANDLE))
  11. LINUX获得当前用户名
  12. hdu-1242 dfs+各种剪枝
  13. AutoHotKey完成ass字幕文件字幕偏移时间修改
  14. ps4插html屏幕不亮光,ps4连接显示器怎么老是黑屏
  15. SLIC 2.6:Windows Server 2022 OEM SLP 准备就绪,更新完毕
  16. 抽象代数笔记2——群
  17. python多任务爬虫(四、协程池实现爬虫)
  18. 阿里云数据库(RDS)是什么,与传统数据库有什么区别?
  19. 黑色渐变遮罩html,巧用CSS遮罩
  20. vue中runtimecompiler和runtimeonly的区别

热门文章

  1. SpringBoot 核心原理分析
  2. java播放声音类和一个简单示例
  3. action对象 java_struts2通过action返回json对象
  4. 产品经理之深度学习促进产品之分类(三)
  5. 一千万条数据去重_simhash算法:海量千万级的数据去重
  6. php数组转化js数组格式化,php数组转换成js数组
  7. 网页无障碍php,【译】开发无障碍的Web组件
  8. 白噪音和粉红噪音煲机_白噪音信号的概念及基本理论
  9. 【kafka】kerberos认证下 kafka 报错Bootstrap broker host:ip (id: -1 rack: null) disconnected
  10. 【Flink】Flink 1.13 Flink SQL 新特性 性能优化 时区 时间 纠正