Spring Security构建Rest服务-0600-SpringSecurity基本原理
一、引入
只要引入了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基本原理相关推荐
- Spring Security构建Rest服务-0702-短信验证码登录
先来看下 Spring Security密码登录大概流程,模拟这个流程,开发短信登录流程 1,密码登录请求发送给过滤器 UsernamePasswordAuthenticationFilter 2,过 ...
- Spring Security构建Rest服务-0100-前言
一.我的前言 这是看慕课网老师讲的SpringSecurity的学习笔记,老师讲的很好,开篇就说到了我的心里,老师说道: 有一定经验的程序员如何提升自己? 1,每天都很忙,但是感觉水平没有提升 2,不 ...
- Spring Security构建Rest服务-1401-权限表达式
Spring Security 的权限表达式 用法,在自定义的BrowserSecurityConfig extends WebSecurityConfigurerAdapter 配置文件里,每一个a ...
- Spring Security构建Rest服务-1400-授权
安全分为 认证和授权,前边讲的都是认证,现在说授权. 前端业务系统的权限简单些,一般只区分是否登录,复杂点的还会区分 VIP用户等简单的角色,权限规则基本不变. 后台系统比较复杂,角色众多,权限随着业 ...
- 将Spring Security OAuth2授权服务JWK与Consul 配置中心结合使用
将Spring Security OAuth2授权服务JWK与Consul 配置中心结合使用 概述 在前文中介绍了OAuth2授权服务简单的实现密钥轮换,与其不同,本文将通过Consul实现我们的目的 ...
- 1.Spring Cloud 构建微服务应用程序之概览
1.Spring Cloud 构建微服务应用程序之概览 1.1 微服务发展史 1.2 为什么要学习微服务应用开发? 1.3 微服务和分布式之间的关系 1.4 微服务架构下构建分布式系统带来了哪些问题? ...
- Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】
通过上一篇<分布式服务跟踪(整合logstash)>,我们虽然已经能够利用ELK平台提供的收集.存储.搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利.但是,在ELK平台中的数据分析 ...
- Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】
通过之前的<入门示例>,我们已经为两个由SpringCloud构建的微服务项目 trace-1和 trace-2引入了Spring Cloud Sleuth的基础模块 spring-clo ...
- Spring Cloud构建微服务架构:分布式服务跟踪(跟踪原理)
通过上一篇<分布式服务跟踪(入门)>的例子,我们已经通过Spring Cloud Sleuth往微服务应用中添加了实现分布式跟踪具备的基本要素.下面通过本文来详细说说实现分布式服务跟踪的一 ...
最新文章
- 使用复合数据类型——PL/SQL表
- Ubuntu12.04 VMware Tools的安装
- sublime使用正则匹配
- C\C++ 获取当前路径
- 高并发场景下的缓存 + 数据库双写不一致问题分析与解决方案设计
- 在页面里点击一个按钮后出来一个层,可以操作的那么一个层!
- Business Connectivity Services 团队博客简介
- C#多线程操作----处理并发的问题,Lock关键字
- 黑客泄露50多万服务器、路由器和物联网设备的密码
- java 句柄无效_sql报句柄无效。 (异常来自 HRESULT:0x80070006 (E_HANDLE))
- LINUX获得当前用户名
- hdu-1242 dfs+各种剪枝
- AutoHotKey完成ass字幕文件字幕偏移时间修改
- ps4插html屏幕不亮光,ps4连接显示器怎么老是黑屏
- SLIC 2.6:Windows Server 2022 OEM SLP 准备就绪,更新完毕
- 抽象代数笔记2——群
- python多任务爬虫(四、协程池实现爬虫)
- 阿里云数据库(RDS)是什么,与传统数据库有什么区别?
- 黑色渐变遮罩html,巧用CSS遮罩
- vue中runtimecompiler和runtimeonly的区别
热门文章
- SpringBoot 核心原理分析
- java播放声音类和一个简单示例
- action对象 java_struts2通过action返回json对象
- 产品经理之深度学习促进产品之分类(三)
- 一千万条数据去重_simhash算法:海量千万级的数据去重
- php数组转化js数组格式化,php数组转换成js数组
- 网页无障碍php,【译】开发无障碍的Web组件
- 白噪音和粉红噪音煲机_白噪音信号的概念及基本理论
- 【kafka】kerberos认证下 kafka 报错Bootstrap broker host:ip (id: -1 rack: null) disconnected
- 【Flink】Flink 1.13 Flink SQL 新特性 性能优化 时区 时间 纠正