From 7e23ca1c55d33547cf2cecb0a1360f840034b2fc Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Thu, 10 Jul 2025 21:11:46 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpringSecurityOfficialApplication.java} | 4 +- .../src/main/resources/application.yml | 2 +- .../src/main/resources/static/favicon.ico | Bin 67758 -> 17014 bytes ...ringSecurityOfficialApplicationTests.java} | 2 +- spring-security/pom.xml | 18 +- spring-security/step-1/pom.xml | 2 +- .../SpringSecurityStep1Application.java} | 4 +- .../com/spring/config/MD5PasswordEncoder.java | 20 -- .../security/SecurityWebConfiguration.java | 9 - .../controller/security/LoginController.java | 37 +--- .../security/SecurityConfiguration.java | 28 ++- .../security/SecurityWebConfiguration.java | 49 +++++ .../security/password/MD5PasswordEncoder.java | 53 +++++ .../step-1/src/main/resources/application.yml | 2 +- .../src/main/resources/static/favicon.ico | Bin 67758 -> 17014 bytes .../src/main/resources/templates/login.html | 206 ++++++++++++++++++ .../SpringSecurityStep1ApplicationTests.java} | 2 +- 17 files changed, 349 insertions(+), 89 deletions(-) rename spring-security/{step-1/src/main/java/com/spring/SpringSecurityApplication.java => official/src/main/java/com/spring/SpringSecurityOfficialApplication.java} (63%) rename spring-security/{step-1/src/test/java/com/spring/SpringSecurityApplicationTests.java => official/src/test/java/com/spring/SpringSecurityOfficialApplicationTests.java} (79%) rename spring-security/{official/src/main/java/com/spring/SpringSecurityApplication.java => step-1/src/main/java/com/spring/SpringSecurityStep1Application.java} (64%) delete mode 100644 spring-security/step-1/src/main/java/com/spring/config/MD5PasswordEncoder.java delete mode 100644 spring-security/step-1/src/main/java/com/spring/config/security/SecurityWebConfiguration.java rename spring-security/step-1/src/main/java/com/spring/{config => }/security/SecurityConfiguration.java (70%) create mode 100644 spring-security/step-1/src/main/java/com/spring/security/SecurityWebConfiguration.java create mode 100644 spring-security/step-1/src/main/java/com/spring/security/password/MD5PasswordEncoder.java create mode 100644 spring-security/step-1/src/main/resources/templates/login.html rename spring-security/{official/src/test/java/com/spring/SpringSecurityApplicationTests.java => step-1/src/test/java/com/spring/SpringSecurityStep1ApplicationTests.java} (80%) diff --git a/spring-security/step-1/src/main/java/com/spring/SpringSecurityApplication.java b/spring-security/official/src/main/java/com/spring/SpringSecurityOfficialApplication.java similarity index 63% rename from spring-security/step-1/src/main/java/com/spring/SpringSecurityApplication.java rename to spring-security/official/src/main/java/com/spring/SpringSecurityOfficialApplication.java index 7cb2a3c..e0c684c 100644 --- a/spring-security/step-1/src/main/java/com/spring/SpringSecurityApplication.java +++ b/spring-security/official/src/main/java/com/spring/SpringSecurityOfficialApplication.java @@ -4,8 +4,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class SpringSecurityApplication { +public class SpringSecurityOfficialApplication { public static void main(String[] args) { - SpringApplication.run(SpringSecurityApplication.class, args); + SpringApplication.run(SpringSecurityOfficialApplication.class, args); } } diff --git a/spring-security/official/src/main/resources/application.yml b/spring-security/official/src/main/resources/application.yml index 0bee250..bd567d1 100644 --- a/spring-security/official/src/main/resources/application.yml +++ b/spring-security/official/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 8778 + port: 8770 spring: application: diff --git a/spring-security/official/src/main/resources/static/favicon.ico b/spring-security/official/src/main/resources/static/favicon.ico index 17f9dd11abe93a4170a7879244d0fea91142ca9a..385f8a67127e1978b08387383f5935feaf561d04 100644 GIT binary patch literal 17014 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 G5Bv)+nYH-< literal 67758 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 qfFZyTUd_qf*=C` diff --git a/spring-security/step-1/src/test/java/com/spring/SpringSecurityApplicationTests.java b/spring-security/official/src/test/java/com/spring/SpringSecurityOfficialApplicationTests.java similarity index 79% rename from spring-security/step-1/src/test/java/com/spring/SpringSecurityApplicationTests.java rename to spring-security/official/src/test/java/com/spring/SpringSecurityOfficialApplicationTests.java index 1463f61..9d5eea1 100644 --- a/spring-security/step-1/src/test/java/com/spring/SpringSecurityApplicationTests.java +++ b/spring-security/official/src/test/java/com/spring/SpringSecurityOfficialApplicationTests.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class SpringSecurityApplicationTests { +class SpringSecurityOfficialApplicationTests { @Test void contextLoads() { diff --git a/spring-security/pom.xml b/spring-security/pom.xml index f751b66..90ca1ba 100644 --- a/spring-security/pom.xml +++ b/spring-security/pom.xml @@ -14,7 +14,7 @@ 0.0.1-SNAPSHOT spring-security spring-security - + pom @@ -99,6 +99,14 @@ + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity6 + org.webjars bootstrap @@ -114,14 +122,6 @@ jquery ${jquery.version} - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity6 - diff --git a/spring-security/step-1/pom.xml b/spring-security/step-1/pom.xml index 1e76b55..538b5b2 100644 --- a/spring-security/step-1/pom.xml +++ b/spring-security/step-1/pom.xml @@ -22,6 +22,6 @@ - + diff --git a/spring-security/official/src/main/java/com/spring/SpringSecurityApplication.java b/spring-security/step-1/src/main/java/com/spring/SpringSecurityStep1Application.java similarity index 64% rename from spring-security/official/src/main/java/com/spring/SpringSecurityApplication.java rename to spring-security/step-1/src/main/java/com/spring/SpringSecurityStep1Application.java index 7cb2a3c..d068ecb 100644 --- a/spring-security/official/src/main/java/com/spring/SpringSecurityApplication.java +++ b/spring-security/step-1/src/main/java/com/spring/SpringSecurityStep1Application.java @@ -4,8 +4,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class SpringSecurityApplication { +public class SpringSecurityStep1Application { public static void main(String[] args) { - SpringApplication.run(SpringSecurityApplication.class, args); + SpringApplication.run(SpringSecurityStep1Application.class, args); } } diff --git a/spring-security/step-1/src/main/java/com/spring/config/MD5PasswordEncoder.java b/spring-security/step-1/src/main/java/com/spring/config/MD5PasswordEncoder.java deleted file mode 100644 index 8135132..0000000 --- a/spring-security/step-1/src/main/java/com/spring/config/MD5PasswordEncoder.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.spring.config; - -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.util.DigestUtils; - -import java.util.Arrays; - -public class MD5PasswordEncoder implements PasswordEncoder { - @Override - public String encode(CharSequence rawPassword) { - String rawPasswordString = rawPassword.toString(); - byte[] md5Digest = DigestUtils.md5Digest(rawPasswordString.getBytes()); - return Arrays.toString(md5Digest); - } - - @Override - public boolean matches(CharSequence rawPassword, String encodedPassword) { - return false; - } -} diff --git a/spring-security/step-1/src/main/java/com/spring/config/security/SecurityWebConfiguration.java b/spring-security/step-1/src/main/java/com/spring/config/security/SecurityWebConfiguration.java deleted file mode 100644 index c1c9538..0000000 --- a/spring-security/step-1/src/main/java/com/spring/config/security/SecurityWebConfiguration.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.spring.config.security; - -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; - -@EnableWebSecurity -@Configuration -public class SecurityWebConfiguration { -} diff --git a/spring-security/step-1/src/main/java/com/spring/controller/security/LoginController.java b/spring-security/step-1/src/main/java/com/spring/controller/security/LoginController.java index 8bbd819..2b75bae 100644 --- a/spring-security/step-1/src/main/java/com/spring/controller/security/LoginController.java +++ b/spring-security/step-1/src/main/java/com/spring/controller/security/LoginController.java @@ -1,35 +1,18 @@ package com.spring.controller.security; -import com.spring.domain.dto.security.LoginRequest; -import com.spring.domain.vo.result.Result; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; -@Tag(name = "Login接口", description = "登录接口") -@RestController -@RequestMapping("/api/security") -@RequiredArgsConstructor +@Controller public class LoginController { - private final AuthenticationManager authenticationManager; + @GetMapping("") + public String indexPage() { + return "index"; + } - @Operation(summary = "登录接口", description = "系统登录接口") - @PostMapping("login") - public Result login(@RequestBody LoginRequest loginRequest) { - String username = loginRequest.getUsername(); - String password = loginRequest.getPassword(); - - Authentication authenticationRequest = UsernamePasswordAuthenticationToken.unauthenticated(username, password); - - Authentication authenticationResponse = authenticationManager.authenticate(authenticationRequest); - return Result.success(authenticationResponse); + @GetMapping("/login-page") + public String showLoginPage() { + return "login"; } } \ No newline at end of file diff --git a/spring-security/step-1/src/main/java/com/spring/config/security/SecurityConfiguration.java b/spring-security/step-1/src/main/java/com/spring/security/SecurityConfiguration.java similarity index 70% rename from spring-security/step-1/src/main/java/com/spring/config/security/SecurityConfiguration.java rename to spring-security/step-1/src/main/java/com/spring/security/SecurityConfiguration.java index 1180368..b91b783 100644 --- a/spring-security/step-1/src/main/java/com/spring/config/security/SecurityConfiguration.java +++ b/spring-security/step-1/src/main/java/com/spring/security/SecurityConfiguration.java @@ -1,27 +1,17 @@ -package com.spring.config.security; +package com.spring.security; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; -import org.springframework.security.web.SecurityFilterChain; @Configuration public class SecurityConfiguration { - @Bean - SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests(authorizeRequests -> - authorizeRequests.anyRequest().authenticated() - ) - ; - return http.build(); - } /** * 添加内存用户 @@ -31,10 +21,15 @@ public class SecurityConfiguration { @Bean @ConditionalOnMissingBean(UserDetailsService.class) InMemoryUserDetailsManager inMemoryUserDetailsManager(PasswordEncoder passwordEncoder) { - + // 使用注入的密码加密器进行密码加密 String generatedPassword = passwordEncoder.encode("123456"); - return new InMemoryUserDetailsManager(User.withUsername("bunny") - .password(generatedPassword).roles("USER").build()); + + // 创建用户 + UserDetails userDetails1 = User.withUsername("bunny").password(generatedPassword).roles("USER").build(); + UserDetails userDetails2 = User.withUsername("rabbit").password(generatedPassword).roles("USER").build(); + + // 返回内存中的用户 + return new InMemoryUserDetailsManager(userDetails1, userDetails2); } /** @@ -51,5 +46,8 @@ public class SecurityConfiguration { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); + + // 自定义实现密码加密器 + // return new MD5PasswordEncoder(); } } diff --git a/spring-security/step-1/src/main/java/com/spring/security/SecurityWebConfiguration.java b/spring-security/step-1/src/main/java/com/spring/security/SecurityWebConfiguration.java new file mode 100644 index 0000000..bcc3990 --- /dev/null +++ b/spring-security/step-1/src/main/java/com/spring/security/SecurityWebConfiguration.java @@ -0,0 +1,49 @@ +package com.spring.security; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.web.SecurityFilterChain; + +@EnableMethodSecurity +@EnableWebSecurity +@Configuration +public class SecurityWebConfiguration { + + @Bean + SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + String[] permitAllUrls = { + "/", "/doc.html/**", + "/webjars/**", "/images/**", ".well-known/**", "favicon.ico", "/error/**", + "/v3/api-docs/**" + }; + + http.authorizeHttpRequests(authorizeRequests -> + // 访问路径为 /api/** 时需要进行认证 + authorizeRequests + .requestMatchers("/api/**").authenticated() + .requestMatchers(permitAllUrls).permitAll() + ) + .formLogin(loginPage -> loginPage + // 自定义登录页路径 + .loginPage("/login-page") + // 处理登录的URL(默认就是/login) + .loginProcessingUrl("/login") + // 登录成功跳转 + .defaultSuccessUrl("/") + // 登录失败跳转 + .failureUrl("/login-page?error=true") + .permitAll() + ) + // 使用默认的登录 + // .formLogin(Customizer.withDefaults()) + .logout(logout -> logout + .logoutSuccessUrl("/login-page?logout=true") + .permitAll() + ); + return http.build(); + } + +} diff --git a/spring-security/step-1/src/main/java/com/spring/security/password/MD5PasswordEncoder.java b/spring-security/step-1/src/main/java/com/spring/security/password/MD5PasswordEncoder.java new file mode 100644 index 0000000..d60e33a --- /dev/null +++ b/spring-security/step-1/src/main/java/com/spring/security/password/MD5PasswordEncoder.java @@ -0,0 +1,53 @@ +package com.spring.security.password; + +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.util.DigestUtils; +import org.springframework.util.StringUtils; + +import java.util.HexFormat; + +/** + *

MD5密码编码器实现

+ * + * 安全警告:此类使用MD5算法进行密码哈希,已不再安全,不推荐用于生产环境。 + * + *

MD5算法因其计算速度快且易受彩虹表攻击而被认为不安全。即使密码哈希本身是单向的, + * 但现代计算能力使得暴力破解和预先计算的彩虹表攻击变得可行。

+ * + *

Spring Security推荐使用BCrypt、PBKDF2、Argon2或Scrypt等自适应单向函数替代MD5。

+ * + * @see PasswordEncoder + * @deprecated 此类仅用于遗留系统兼容,新系统应使用更安全的密码编码器 + */ +@Deprecated +public class MD5PasswordEncoder implements PasswordEncoder { + + @Override + public String encode(CharSequence rawPassword) { + if (rawPassword == null) { + throw new IllegalArgumentException("原始密码不能为null"); + } + + byte[] md5Digest = DigestUtils.md5Digest(rawPassword.toString().getBytes()); + return HexFormat.of().formatHex(md5Digest); + } + + @Override + public boolean matches(CharSequence rawPassword, String encodedPassword) { + if (rawPassword == null) { + throw new IllegalArgumentException("原始密码不能为null"); + } + + if (!StringUtils.hasText(encodedPassword)) { + return false; + } + + return encodedPassword.equalsIgnoreCase(encode(rawPassword)); + } + + @Override + public boolean upgradeEncoding(String encodedPassword) { + // MD5已不安全,始终返回true建议升级到更安全的算法 + return true; + } +} \ No newline at end of file diff --git a/spring-security/step-1/src/main/resources/application.yml b/spring-security/step-1/src/main/resources/application.yml index 0bee250..8b65d6d 100644 --- a/spring-security/step-1/src/main/resources/application.yml +++ b/spring-security/step-1/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 8778 + port: 8771 spring: application: diff --git a/spring-security/step-1/src/main/resources/static/favicon.ico b/spring-security/step-1/src/main/resources/static/favicon.ico index 17f9dd11abe93a4170a7879244d0fea91142ca9a..385f8a67127e1978b08387383f5935feaf561d04 100644 GIT binary patch literal 17014 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 G5Bv)+nYH-< literal 67758 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 qfFZyTUd_qf*=C` diff --git a/spring-security/step-1/src/main/resources/templates/login.html b/spring-security/step-1/src/main/resources/templates/login.html new file mode 100644 index 0000000..f8b64b3 --- /dev/null +++ b/spring-security/step-1/src/main/resources/templates/login.html @@ -0,0 +1,206 @@ + + + + + + 登录 | 您的应用名称 + + + + + + + + + + +
+ +
+ + + + \ No newline at end of file diff --git a/spring-security/official/src/test/java/com/spring/SpringSecurityApplicationTests.java b/spring-security/step-1/src/test/java/com/spring/SpringSecurityStep1ApplicationTests.java similarity index 80% rename from spring-security/official/src/test/java/com/spring/SpringSecurityApplicationTests.java rename to spring-security/step-1/src/test/java/com/spring/SpringSecurityStep1ApplicationTests.java index 1463f61..9b2aa9c 100644 --- a/spring-security/official/src/test/java/com/spring/SpringSecurityApplicationTests.java +++ b/spring-security/step-1/src/test/java/com/spring/SpringSecurityStep1ApplicationTests.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class SpringSecurityApplicationTests { +class SpringSecurityStep1ApplicationTests { @Test void contextLoads() {