学习基于记录,而不止于记录。
希望自己能坚持下去~
0.写在前面
记录Spring security简单的一种验证模式。
spring boot版本:2.2.7.RELEASE
开发工具:IntelliJ IDEA 2018.3.2 (Ultimate Edition)
jdk: java version "1.8.0_181"
maven: 3.3.9
1.搭建项目
其中本次测试环境下,jpa依赖是多余的,只是为后续学习提供支持
2.编写配置类
重写配置类方法,加入自定义配置,规定所有请求必须登陆后才可以访问
SecurityConfig.java
package com.grj.securityDemo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* @Author: grj
* @Date: 2020/6/1 20:10
*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//所有请求必须登陆后才可以访问
http.httpBasic()
.and()
.authorizeRequests()
.anyRequest()
.authenticated();
}
}
3.提供测试页面
放到static文件夹下,如果配置了其他静态资源文件夹也可以放其他地方
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我的登录页</title>
</head>
<body>
<h2>登录页面</h2>
</body>
</html>
4.启动项目,进行测试
1)注意查看控制台打印,有密码输出(因为这是最基本的一种验证模式,所以用户密码是框架直接提供而不是数据库获取)
Using generated security password: 75d85bd4-8398-48a0-8123-f3761691def8
2)在浏览器打开刚才编写的登录页,会有弹窗,要求输入用户名和密码(这是security提供的弹窗,默认用户user,密码是刚才控制台打印的字符串)
5.如何自定义用户名和密码?
1)application.properties
#security
spring.security.user.name=grj
spring.security.user.password=admin2
2)重启项目测试,输入刚才的用户名和密码就可以正常访问
6.这种验证方式靠谱吗?有应用场景吗?
1)不靠谱。
肯定不靠谱,因为只要有点基础的就可以反向解密。
如何解密?
还是刚才那么页面请求,输入用户名和密码之后,在浏览器F12打开调试面板
把Authorization: Basic Z3JqOmFkbWluMg==里面的Z3JqOmFkbWluMg==
输入到任意一个base64解密网站,就可以获取到明文密码(我用的是这个网站)
很明显,用户名和密码全都暴露了。。。
2)但是这种验证模式还是有应用场景的
说白了,就是破窗理论,你自己整了一个小项目,可能存一些你自己的总结经验,不希望所有人都看到,但是又不希望专门搞个很复杂的验证,就可以用这种方式。
7.总结
httpBasic验证模式只是适用于极少的清空下,并且安全性不高,生产环境下不适用,后面会继续总结security的实际应用。