httpBasic是由http协议定义的最基础的认证方式。每次请求时,在请求头Authorization参数中附带用户/密码的base64编码,参考base64。这个方式并不安全,不适合在web项目中使用。但它是一些现代主流认证的基础,而且在spring security的oauth中,内部认证默认就是用的httpBasic。
httpBasic基本配置
注意,这里没有配formLogin,也就不会再有formLogin相关的默认url和配置。
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated().and()
.httpBasic().and() //httpBasic认证
.csrf().disable();
}
启动项目,打开浏览器,这里以Chrome为例,先按F12开启调试窗口,请求http://localhost:8080/hello 被拦截
Basic Authorization
点击取消,在调试窗口中查看该请求的响应头,其中有个WWW-Authenticate: Basic realm="Realm"。
WWW-Authenticate:服务器告知浏览器代理认证工作。
Basic:认证类型为Basic。
realm="Realm":认证域名为Realm,这个后面再讲。
此时的响应码为401,根据401和以上响应头,浏览器会接管工作,它会弹出上面那个框要求输入用户名/密码,并将其拼接成“用户名:密码”格式,中间是一个冒号,再用base64编码成xxx,然后在请求头中附加Authorization:Basic xxx,发给后台认证。后台需要用base64解码xxx,再认证用户名/密码。
认证错误:浏览器会保持弹框。
认证成功:浏览器会缓存有效的base64编码,在之后的请求中,浏览器都会在请求头中添加有效编码。
用postman模拟请求
在postman中选择Authorization的Basic Auth类型,右边输入预置的用户名和密码,send发送请求,显示hellow world。
关于以上配置的实际作用,我们来看一下请求头Headers。
它其实是在请求头中生成了一个Authorization参数,value为Basic xxx,xxx就是postman自动生成的base64编码。
注销
因为Basic会把Authorization保存在浏览器,之后每次请求都会带上,一直到用户关闭浏览器才会销毁,也就是说你无法在服务端有效的注销。不过在请求注销时,前端可以手动在请求头配置一个错的Authorization,也能起到注销效果。
realm
realm="Realm":指认证域名为Realm。在未认证用户请求不同的接口时,后台根据给该接口分配的域,可以响应不同的realm名,并且用不同用户名/密码进行认证。所以用户每请求一个新Realm的url,都会弹框要求用新Realm的用户名/密码进行认证,就好比不同的角色登录只能请求属于该角色的url。httpBasic默认realm名为Realm,可以用以下方式配置。
.httpBasic().realmName("Realm")