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{ @Override
protected 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、微信登录都是在这个绿色的过滤器链上加过滤器。
Spring Security构建Rest服务-0600-SpringSecurity基本原理的更多相关文章
- Spring Security构建Rest服务-1001-spring social开发第三方登录之spring social基本原理
OAuth协议是一个授权协议,目的是让用户在不将服务提供商的用户名密码交给第三方应用的条件下,让第三方应用可以有权限访问用户存在服务提供商上的资源. 接着上一篇说的,在第三方应用获取到用户资源后,如果 ...
- Spring Security构建Rest服务-1300-Spring Security OAuth开发APP认证框架之JWT实现单点登录
基于JWT实现SSO 在淘宝( https://www.taobao.com )上点击登录,已经跳到了 https://login.taobao.com,这是又一个服务器.只要在淘宝登录了,就能直接访 ...
- Spring Security构建Rest服务-1202-Spring Security OAuth开发APP认证框架之重构3种登录方式
SpringSecurityOAuth核心源码解析 蓝色表示接口,绿色表示类 1,TokenEndpoint 整个入口点,相当于一个controller,不同的授权模式获取token的地址都是 /oa ...
- Spring Security构建Rest服务-0900-rememberMe记住我
Spring security记住我基本原理: 登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFilter,当该过滤器认证成功后,会调用RememberMeS ...
- Spring Security构建Rest服务-1205-Spring Security OAuth开发APP认证框架之Token处理
token处理之二使用JWT替换默认的token JWT(Json Web Token) 特点: 1,自包含:jwt token包含有意义的信息 spring security oauth默认生成的t ...
- Spring Security构建Rest服务-1204-Spring Security OAuth开发APP认证框架之Token处理
token处理之一基本参数配置 处理token时间.存储策略,客户端配置等 以前的都是spring security oauth默认的token生成策略,token默认在org.springframe ...
- Spring Security构建Rest服务-1201-Spring Security OAuth开发APP认证框架之实现服务提供商
实现服务提供商,就是要实现认证服务器.资源服务器. 现在做的都是app的东西,所以在app项目写代码 认证服务器: 新建 ImoocAuthenticationServerConfig 类,@Ena ...
- Spring Security构建Rest服务-1200-SpringSecurity OAuth开发APP认证框架
基于服务器Session的认证方式: 前边说的用户名密码登录.短信登录.第三方登录,都是普通的登录,是基于服务器Session保存用户信息的登录方式.登录信息都是存在服务器的session(服务器的一 ...
- Spring Security构建Rest服务-0702-短信验证码登录
先来看下 Spring Security密码登录大概流程,模拟这个流程,开发短信登录流程 1,密码登录请求发送给过滤器 UsernamePasswordAuthenticationFilter 2,过 ...
随机推荐
- Spring bean加载2--FactoryBean情况处理
Spring bean加载2--FactoryBean情况处理 在Spring bean加载过程中,每次bean实例在返回前都会调用getObjectForBeanInstance来处理Factory ...
- 老刘 Yii2 源码学习笔记之 Action 类
Action 的概述 InlineAction 就是内联动作,所谓的内联动作就是放到controller 里面的 actionXXX 这种 Action.customAction 就是独立动作,就是直 ...
- 使用工厂方法配置bean的两种方式
1.使用静态工厂方法: 对应的配置.xml文件: 2.通过实例工厂的方法来配置bean: 对应的xml文件:
- SpringBoot tomcat
该文的前提是已经可以在控制台运行成功,有些时候想放在tomcat里运行 大致分为如下几步 1.配置文件更改 <dependency> <groupId>org.springfr ...
- WebAPI开发中的定时处理
https://blog.csdn.net/lordwish/article/details/77931897
- 使用vs code开发纸壳CMS并启用Razor智能提示
关于纸壳CMS 纸壳CMS是一个开源免费的,可视化设计,在线编辑的内容管理系统.基于ASP .Net Core开发,插件式设计: 下载代码 GitHub:https://github.com/Seri ...
- SQL学习笔记2
2018.10.16:周二 --进阶 --别名 SELECT StuName,StuNum+','+StuClass+','+StuGender+','+StuPhone AS 信息 FROM S ...
- Oracle树结构查询按层级排序
SQL代码: SELECT t.* FROM pt_org_info t START CONNECT BY t.par_id = PRIOR t.id ORDER SIBLINGS BY t.id; ...
- Font Awesome矢量版,十六进制版,WPF字体使用
我之前在博客中介绍过几个矢量图库网站,在WPF程序中,一般接触到的矢量图标资源有XAML.SVG.字体这三种格式.XAML是标准格式就不说了,SVG并不是直接支持的,不过微软提供了Expression ...
- C#通过rdp账密直接打开远程桌面
思路是首先新建一个vbs脚本,再创建一个bat脚本,再创建rdp文件,运行顺序是vbs->bat->rdp.rdp文件里面包含远程电脑的账密和其它信息,这样就可以不用再输入账密,而在程序里 ...