Spring Security:
当添加以上依赖项后,再次启动项目,Spring Security会执行自动配置,使得:
- 此主机上所有的请求都必须先登录才可以访问,并提供了登录页面,包括根本不存在的URL
- 此特点是由
WebSecurityConfigurerAdapter
类中的protected void configure(HttpSecurity http)
方法决定的
- 此配置方法中的
http.formLogin()
将决定是否开启登录表单
- 默认的用户名是
user
,默认是密码在启动日志中,每次启动都会变化
Using generated security password: 92062850-fb3d-4b86-be10-209ac26c143e
- 当登录成功后,会自动跳转到此前尝试访问的URL
- 例如,当尝试访问 http://localhost:9081/ 时,由于没有登录,会自动重定向到 http://localhost:9081/login 显示了登录页面,当登录成功后,会自动重定向到此前尝试访问的 http://localhost:9081/
- Spring Security默认使用Session保存用户的登录信息
- 例如,当关闭浏览器后,再次访问,需要重新登录
- 通过 http://localhost:9081/logout 退出登录
- 自带
BCryptPasswordEncoder
,可以用于使用BCrypt
算法对密码进行加密处理 - 如果项目运行时Spring容器中有密码编码器(
PasswordEncoder
),Spring Security框架会自动使用它 - Spring Security默认开启了“禁止跨域的异步提交”,避免“伪造的跨域攻击”
伪造的跨域攻击:
在多选项卡的浏览器中,如果在第1个选项卡中登录了某个平台,在同一个窗口中打开其它选项卡,访问同一平台,都会被平台识别,视为“已通过认证”。
所谓的伪造跨域攻击,就是利用以上特性,在网页源代码中隐藏一些恶意访问的、会自动提交的请求URL(例如使用隐藏的<img>
标签的src
属性),例如,当用户在第1个选项卡登录了某银行系统,打开的第2个选项卡是有恶意代码的平台,第2个选项卡的网页发出“转账”的请求,会被银行系统视为“已通过认证的”。
- 提示:以上只是举例,事实上,现在防止这种做法的技术已经非常成熟,不会出现此问题,并且,银行转账通常都需要再次输出密码,而不会收到请求就直接转账
在使用Spring Security时,应该自定义配置类,继承自WebSecurityConfigurerAdpater
,并重写void configure(HttpSecurity http)
方法,在其中调用http.csrf()
方法。
BCrypt算法:
BCrypt算法是一种基于哈希算法的算法,所以,这种算法也是不可逆的!
通过BCrypt算法进行编码后的结果,长度固定为60字符。
使用同一个原文进行反复编码,每次得到的结果都是不同的,因为在编码过程中,BCrypt使用了随机的盐,并且,使用的盐也作为编码结果的一部分保存了下来。
在开发实现中,通常,可以使用配置类中的@Bean
方法来创建BCryptPasswordEncoder
对象,此对象将是由Spring进行管理的,当需要使用时,自动装配即可,例如:
@Slf4j
@Configuration
public class SecurityConfiguration {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@Slf4j
@Service
public class AdminServiceImpl implements IAdminService {
@Autowired
private PasswordEncoder passwordEncoder;
}