Skip to content

Commit

Permalink
fix: format style
Browse files Browse the repository at this point in the history
  • Loading branch information
jint233 committed Sep 29, 2024
1 parent 9b5db21 commit 8764f72
Show file tree
Hide file tree
Showing 20 changed files with 154 additions and 232 deletions.
30 changes: 0 additions & 30 deletions .obsidian/core-plugins-migration.json

This file was deleted.

20 changes: 0 additions & 20 deletions .obsidian/core-plugins.json

This file was deleted.

4 changes: 2 additions & 2 deletions docs/Spring/Spring Security 详解与实操/第01讲.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

其实在 Spring Boot 出现之前,Spring Security 就已经诞生多年了。但 Spring Security 的发展一直都不是很顺利,主要问题在于应用程序中集成和配置 Spring Security 框架的过程比较复杂。但是随着 Spring Boot 的兴起,基于 Spring Boot 所提供的针对 Spring Security 的自动配置方案,开发人员可以零配置使用 Spring Security。如果想要在 Spring Boot 应用程序中使用 Spring Security,只需要在 Maven 工程的 pom 文件中添加如下依赖:

```plaintext
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
Expand Down Expand Up @@ -35,7 +35,7 @@ Spring Security 内置的登录界面

接下来,我们围绕这个登录场景,分析如何获取登录所需的用户名和密码。我们注意到在 Spring Boot 的控制台启动日志中,出现了如下所示的一行日志:

```plaintext
```shell
Using generated security password: 707d7469-631f-4d92-ab71-3809620fe0dc
```

Expand Down
12 changes: 6 additions & 6 deletions docs/Spring/Spring Security 详解与实操/第02讲.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

在日常开发中,通常不需要我们自己实现这个接口,而是 **使用 WebSecurityConfigurerAdapter 类** 来简化该配置类的使用方式。而在 WebSecurityConfigurerAdapter 中我们发现了如下所示的 configure 方法:

```plaintext
```java
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
Expand Down Expand Up @@ -50,7 +50,7 @@ HTTP 基础认证的原理比较简单,只需 **通过 HTTP 协议的消息头

在 Postman 中,我们直接访问[http://localhost:8080/hello](http://localhost:8080/hello?fileGuid=xxQTRXtVcqtHK6j8)端点,会得到如下所示的响应:

```plaintext
```json
{
"timestamp": "2021-02-08T03:45:21.512+00:00",
"status": 401,
Expand All @@ -70,15 +70,15 @@ HTTP 基础认证的原理比较简单,只需 **通过 HTTP 协议的消息头

现在查看 HTTP 请求,可以看到 Request Header 中添加了 [Authorization](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Authorization?fileGuid=xxQTRXtVcqtHK6j8) 标头,格式为:Authorization: `<type>` `<credentials`>。这里的 type 就是“Basic”,而 credentials 则是这样一个字符串:

```plaintext
```shell
dXNlcjo5YjE5MWMwNC1lNWMzLTQ0YzctOGE3ZS0yNWNkMjY3MmVmMzk=
```

这个字符串就是 **将用户名和密码组合在一起,再经过 Base64 编码得到的结果** 。而我们知道 Base64 只是一种编码方式,并没有集成加密机制,所以本质上传输的还是 **明文形式**

当然,想要在应用程序中启用 HTTP 基础认证还是比较简单的,只需要在 WebSecurityConfigurerAdapter 的 configure 方法中添加如下配置即可:

```plaintext
```java
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic();
}
Expand All @@ -90,7 +90,7 @@ HTTP 基础认证比较简单,没有定制的登录页面,所以单独使用

在 WebSecurityConfigurerAdapter 的 configure() 方法中,一旦配置了 HttpSecurity 的 formLogin() 方法,就启动了表单登录认证,如下所示:

```plaintext
```java
protected void configure(HttpSecurity http) throws Exception {
http.formLogin();
}
Expand Down Expand Up @@ -121,7 +121,7 @@ protected void configure(HttpSecurity http) throws Exception {

讲完配置体系,现在让我们回到用户认证场景。因为 Spring Security 默认提供的用户名是固定的,而密码会随着每次应用程序的启动而变化,所以很不灵活。在 Spring Boot 中,我们可以通过在 application.yml 配置文件中添加如下所示的配置项来改变这种默认行为:

```plaintext
```properties
spring:
security:
user:
Expand Down
8 changes: 4 additions & 4 deletions docs/Spring/Spring Security 详解与实操/第03讲.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ interface MutableUserDetails extends UserDetails {

如果我们想要在应用程序中创建一个 UserDetails 对象,可以使用如下所示的链式语法:

```plaintext
```java
UserDetails user = User.withUsername("jianxiang")
.password("123456")
.authorities("read", "write")
Expand All @@ -73,7 +73,7 @@ UserDetails user = User.withUsername("jianxiang")

Spring Security 还专门提供了一个 UserBuilder 对象来辅助构建 UserDetails,使用方式也类似:

```plaintext
```java
User.UserBuilder builder =
User.withUsername("jianxiang");
UserDetails user = builder
Expand All @@ -86,7 +86,7 @@ UserDetails user = builder

在 Spring Security 中,针对 UserDetails 专门提供了一个 UserDetailsService,该接口用来管理 UserDetails,定义如下:

```plaintext
```java
public interface UserDetailsService {
//根据用户名获取用户信息
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
Expand Down Expand Up @@ -181,7 +181,7 @@ public interface Authentication extends Principal, Serializable {

显然,Authentication 只代表了认证请求本身,而具体执行认证的过程和逻辑需要由专门的组件来负责,这个组件就是 AuthenticationProvider,定义如下:

```plaintext
```java
public interface AuthenticationProvider {
//执行认证,返回认证结果
Authentication authenticate(Authentication authentication)
Expand Down
16 changes: 8 additions & 8 deletions docs/Spring/Spring Security 详解与实操/第04讲.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ protected void configure(AuthenticationManagerBuilder auth) throws Exception {

在 Spring Security 中,PasswordEncoder 接口代表的是一种密码编码器,其核心作用在于 **指定密码的具体加密方式** ,以及如何将一段给定的加密字符串与明文之间完成匹配校验。PasswordEncoder 接口定义如下:

```plaintext
```java
public interface PasswordEncoder {
//对原始密码进行编码
String encode(CharSequence rawPassword);
Expand Down Expand Up @@ -56,7 +56,7 @@ Spring Security 中的 PasswordEncoder 实现类

下面我们以 BCryptPasswordEncoder 为例,看一下它的 encode 方法,如下所示:

```plaintext
```java
public String encode(CharSequence rawPassword) {
String salt;
if (random != null) {
Expand All @@ -83,8 +83,8 @@ PasswordEncoder p = new SCryptPasswordEncoder(16384, 8, 1, 32, 64);

而如果想要使用 NoOpPasswordEncoder,除了构造函数之外,还可以通过它的 getInstance() 方法来获取静态实例,如下所示:

```plaintext
PasswordEncoder p = NoOpPasswordEncoder.getInstance()
```java
PasswordEncoder p = NoOpPasswordEncoder.getInstance();
```

#### 自定义 PasswordEncoder
Expand Down Expand Up @@ -206,7 +206,7 @@ public class PasswordEncoderFactories {

通常,我们可以通过以下方法来使用这个 PasswordEncoderFactories 类:

```plaintext
```java
PasswordEncoder passwordEncoder =
PasswordEncoderFactories.createDelegatingPasswordEncoder();
```
Expand Down Expand Up @@ -286,21 +286,21 @@ public boolean matches(CharSequence rawPassword, String prefixEncodedPassword) {

Spring Security 加密模块的核心功能有两部分,首先就是加解密器(Encryptors),典型的使用方式如下:

```plaintext
```java
BytesEncryptor e = Encryptors.standard(password, salt);
```

上述方法使用了标准的 256 位 AES 算法对输入的 password 字段进行加密,返回的是一个 BytesEncryptor。同时,我们也看到这里需要输入一个代表盐值的 salt 字段,而这个 salt 值的获取就可以用到 Spring Security 加密模块的另一个功能——键生成器(Key Generators),使用方式如下所示:

```plaintext
```java
String salt = KeyGenerators.string().generateKey();
```

上述键生成器会创建一个 8 字节的密钥,并将其编码为十六进制字符串。

如果将加解密器和键生成器结合起来,我们就可以实现通用的加解密机制,如下所示:

```plaintext
```java
String salt = KeyGenerators.string().generateKey();
String password = "secret";
String valueToEncrypt = "HELLO";
Expand Down
Loading

0 comments on commit 8764f72

Please sign in to comment.