# boot-security **Repository Path**: wangzz_felix/boot-security ## Basic Information - **Project Name**: boot-security - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-28 - **Last Updated**: 2021-10-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Spring Security核心功能 1. 身份认证(Authentication): 用户登录时进行验证,解决你是谁? 2. 访问授权(Authorization): 授权系统资源的访问权限,解决你能干什么? 3. 安全防护:防止跨站请求、session攻击等 ![avatar](https://img.kancloud.cn/10/21/1021e156eea69e372f3fd74672f7076d_843x449.png) * login.html登录页面对所有用户开放 * 在登录页面登录之后进入index.html首页(登录验证Authentication) * 首页可以看到syslog、sysuser、biz01、biz02四个页面选项 * 访问规则: - 只有admin可以访问syslog和sysuser - biz01、biz02对普通用户开放访问权限 ### HttpBasic模式的应用场景 "防君子而不防小人” 1. 引入spring-boot-security ```xml org.springframework.boot spring-boot-starter-security ``` 2. 引入SecurityConfig配置类 ```java @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.httpBasic()//开启httpbasic认证 .and() .authorizeRequests() .anyRequest() .authenticated();//所有请求都需要登录认证才能访问 } } ``` ```java 首先,HttpBasic模式要求传输的用户名密码使用Base64模式进行加密。如果用户名是 "admin" ,密码是“ admin”,则将字符串"admin:admin"使用Base64编码算法加密。加密结果可能是:YWtaW46YWRtaW4=。 然后,在Http请求中使用Authorization作为一个Header,“Basic YWtaW46YWRtaW4=“作为Header的值,发送给服务端。(注意这里使用Basic+空格+加密串) 服务器在收到这样的请求时,到达BasicAuthenticationFilter过滤器,将提取“ Authorization”的Header值,并使用用于验证用户身份的相同算法Base64进行解码。 解码结果与登录验证的用户名密码匹配,匹配成功则可以继续过滤器后续的访问。 所以,HttpBasic模式真的是非常简单又简陋的验证模式,Base64的加密算法是可逆的,你知道上面的原理,分分钟就破解掉。我们完全可以 ``` ### PasswordEncoder加密工具 > Hash算法常用在不可还原的密码存储、数据完整性校验等领域。 PasswordEncoder 是Spring Scurity框架内处理密码加密与校验的接口。 ```java package org.springframework.security.crypto.password; public interface PasswordEncoder { String encode(CharSequence rawPassword); boolean matches(CharSequence rawPassword, String encodedPassword); default boolean upgradeEncoding(String encodedPassword) { return false; } } ``` > encode方法接受的参数是原始密码字符串,返回值是经过加密之后的hash值,hash值是不能被逆向解密的。这个方法通常在为系统添加用户,或者用户注册的时候使用。 matches方法是用来校验用户输入密码rawPassword,和加密后的hash值encodedPassword是否匹配。如果能够匹配返回true,表示用户输入的密码rawPassword是正确的,反之返回fasle。也就是说虽然这个hash值不能被逆向解密,但是可以判断是否和原始密码匹配。这个方法通常在用户登录的时候进行用户输入密码的正确性校验。 upgradeEncoding设计的用意是,判断当前的密码是否需要升级。也就是是否需要重新加密?需要的话返回true,不需要的话返回fasle。默认实现是返回false。 在进行用户注册的时候加密存储用户密码: ```java user.setPassword(passwordEncoder.encode(user.getPassword())) ```