门户网站建设情况自查报告,必要 网站,建设网站的功能定位是什么原因,电脑自带的做网站叫什么软件一.简介
这篇文章来学习下security的认证方式其中的HTTP基本认证。
二.Spring Security的认证方式
2.1什么是认证
认证: 就是用来判断系统中是否存在某用户#xff0c;并判断该用户的身份是否合法的过程#xff0c;解决的其实是用户登录的问题。认证的存在#xff0c;是…一.简介
这篇文章来学习下security的认证方式其中的HTTP基本认证。
二.Spring Security的认证方式
2.1什么是认证
认证: 就是用来判断系统中是否存在某用户并判断该用户的身份是否合法的过程解决的其实是用户登录的问题。认证的存在是为了保护系统中的隐私数据与资源只有合法的用户才可以访问系统中的资源。
2.2认证的方式
在Spring Security中常见的认证方式可以分为HTTP层面和表单层面常见的认证方式如下:
HTTP基本认证Form表单认证HTTP摘要认证
这篇文章先讲HTTP基本认证
三. HTTP基本认证
3.1HTTP基本认证概念
在Spring Security 4.x版本中默认采用的登录方式是Http基本认证该方式会弹出一个对话框要求用户输入用户名和密码。在每次进行基本认证请求时都会在Authorization请求头中利用Base64对 “用户:密码” 字符串进行编码。这种方式并不安全并不适合在Web项目中使用但它是一些现代主流认证的基础而且在Spring Security的OAuth中内部认证的默认方式就是用的Http基本认证。
3.2HTTP基本认证核心API
在基本认证时系统中所涉及到的各种核心API及其执行流程在这篇文章中我们先对这些有基本了解即可。 简单的执行流程如下:
Filter-构造Token-AuthenticationManager-转给Provider处理-认证处理成功后续操作或者不通过抛异常3.3HTTP基本认证步骤(重点)
HTTP基本认证是在RFC2616标准中定义的一种认证模式它以一种很简单的方式与用户进行交互。HTTP基本认证可以分为如下4个步骤
客户端首先发起一个未携带认证信息的请求然后服务器端返回一个401 Unauthorized的响应信息并在WWW-Authentication头部中说明认证形式当进行HTTP基本认证时WWW-Authentication会被设置为Basic realm“被保护的页面”接下来客户端会收到这个401 Unauthorized响应信息并弹出一个对话框询问用户名和密码。当用户输入后客户端会将用户名和密码使用冒号进行拼接并用Base64编码然后将其放入到请求的Authorization头部并发送给服务器最后服务器端对客户端发来的信息进行解码得到用户名和密码并对该信息进行校验判断是否正确最终给客户端返回响应内容。
3.4HTTP基本认证的弊端
HTTP基本认证是一种无状态的认证方式与表单认证相比HTTP基本认证是一种基于HTTP层面的认证方式无法携带Session信息也就无法实现Remember-Me功能。另外用户名和密码在传递时仅做了一次简单的Base64编码几乎等同于以明文传输极易被进行密码窃听和重放攻击。所以在实际开发中很少会使用这种认证方式来进行安全校验。
接下来就用代码来实现下HTTP基本认证的功能。
四. 创建SpringSecurity项目
参考之前的文章这边不做叙述。
五.代码实现
5.1创建SecurityConfig配置类
创建SecurityConfig类继承自WebSecurityConfigurerAdapter父类代码如下: import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {//1.配置基本认证方式http.authorizeRequests()//对任意请求都进行认证.anyRequest().authenticated().and()//开启basic认证.httpBasic();}}这段代码中httpBasic()方法就是用来开启基本认证的而且默认采用的就是基本认证
5.2创建web接口
HelloController类的代码如下 import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;RestController
public class HelloController {GetMapping(/hello)public String hello() {return 德玛西亚;}}5.3yml配置文件
创建一个application.yml配置文件配置如下:
spring:security:user:name: demaxiyapassword: 123四.功能验证
4.1启动项目
接着把项目启动起来打开浏览器及调试窗口然后访问/hello接口这时候就可以看到浏览器中弹出了一个登陆窗口截图如下 提示输入自己的用户名和密码认证成功后即可访问自己的web接口。
五. Basic认证详解
对上面的认证过程进行详细的分析。
5.1Basic Authorization
此时我们在自己的浏览器调试窗口中查看响应头可以看到WWW-Authenticate认证信息:
WWW-AuthenticateBasic realm“Realm”截图如下:
5.1.1各响应信息含义如下
WWW-Authenticate: 表示服务器告知浏览器进行代理认证工作。Basic: 表示认证类型为Basic认证。realm“Realm”: 表示认证域名为Realm域。
5.1.2 realm的概念
realm“Realm”: 指认证域名为RealmHttpBasic默认的realm名为Realm。在未认证用户请求不同的接口时后台会根据分配给该接口的域响应不同的realm名称并且用不同的用户名/密码进行认证。所以用户每请求一个新的Realm的url都会弹框要求使用新的Realm的用户名/密码进行认证就好比不同的角色登录只能请求属于该角色的url。
5.2基本认证过程
此时的响应码为401如下图所示: 根据401和以上响应头信息浏览器会弹出一个对话框要求输入 用户名/密码Basic认证会将其拼接成 “用户名:密码” 格式中间是一个冒号并利用Base64编码成加密字符串xxx然后在请求头中附加 Authorization: Basic xxx 信息发送给后台认证后台需要利用Base64来进行解码xxx得到用户名和密码再校验 用户名:密码 信息。
如果认证错误浏览器会保持弹框如果认证成功浏览器会缓存有效的Base64编码在之后的请求中浏览器都会在请求头中添加该有效编码。
以上就是HTTP基本认证的内部执行过程。
5.3注销Basic认证
在成功认证之后Basic认证会把Authorization认证信息缓存在浏览器中一段时间之后每次请求接口时都会自动带上所以直到 用户关闭浏览器才会销毁认证信息也就是说我们无法在服务端进行有效的注销。
不过在请求注销时前端也可以手动 在请求头配置一个错误的Authorization或者在浏览器的命令行执行 document.execuCommand(“ClearAuthenticationCache”)方法 来清空认证信息但该方式对Chrome浏览器无效。我们在调试基本认证时可以直接开启无痕模式避免很多因为缓存造成的问题。