尚硅谷SpringSecurity框架教程(spring security源码剖

对P11的/user/login的解释:

application.properties的配置:
# 应用服务 WEB 访问端口 server.port=8080 # 设置项目的web名称和请求路径名称 #server.servlet.context-path=/ server.servlet.context-path=/security-springboot spring.application.name=security-springboot # 通过springboot配置,设置用户名密码,优先级低于test2 spring.security.user.name=test1 #spring.security.user.password=test1 spring.security.user.password=$2a$10$aJTTiKJ1Y/AYc0dTl0DFJ.ICzIr.4Edqj5OkugHTvwT2yHbpE2QBy # 设置datasource spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=root spring.datasource.password=123456 spring.datasource.url=jdbc:mysql://localhost:3306/worklearn_springsecurity?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8 # 设置mybatis-plus mybatis-plus.configuration.map-underscore-to-camel-case=false mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl mybatis-plus.global-config.db-config.id-type=auto #mybatis-plus.mapper-locations=
WebSecurityConfig的configure()方法:
@Override protected void configure(HttpSecurity http) throws Exception { http.formLogin() //自定义登陆页面; // 浏览器的访问路径需要填http://localhost:8080/security-springboot/mylogin.html .loginPage("/mylogin.html") /* /loginTest的含义, 我们自定义页面。页面的action需要是/security-springboot/loginTest 因为自定义页面的post请求的开头默认是http://localhost:8080,这一点要与重定向区分开! 我踩了大坑在这里! 回到正题:相当于我们把键盘输入数据A放在自定义页面的表单中 自定义页面的表单,将数据A发送post请求到路径http://localhost:8080/security-springboot/loginTest springSecurity接收到post请求,认为符合自定义登录条件1, 并分析出有效路径loginTest与loginProcessingUrl("/loginTest")一致,认为符合自定义登录条件2 springSecurity就把自定义页面表单发送的数据A当作springSecurity默认页面的默认表单发送的数据 springSecurity将数据进行处理成为数据B,并进行登陆验证 springSecurity登录验证通过,则重定向地发送get请求到http://localhost:8080/security-springboot/test/login-success */ .loginProcessingUrl("/loginTest") //登陆成功后的重定向路径; // 因为是重定向所以项目会自动加上/security-springboot;最终的浏览器的访问路径显示的是http://localhost:8080/security-springboot/test/login-success .defaultSuccessUrl("/test/login-success").permitAll() .and().authorizeRequests() //自定义哪些controller的功能方法不需要登录验证; // 浏览器的访问路径需要填http://localhost:8080/security-springboot/test/r/r1 .antMatchers("/test/r/r1").permitAll() //自定义哪些controller的功能方法需要登录验证; // 需要登录验证的访问路径访问后会自动重定向到http://localhost:8080/security-springboot/mylogin.html .anyRequest().authenticated() //关闭csrf防护 .and().csrf().disable(); // .successForwardUrl("/test/login-success"); }
mylogin.html页面:
<html> <head> <meta charset="utf-8"> </head> <body> <h1 align="center">自定义登陆页面</h1> <form action="/security-springboot/loginTest" method="post"> 用户名:<input type="text" name="username"><br/> 密 码:<input type="password" name="password"><br/> <input type="submit" value="登录"> </form> </body> </html>
LoginController控制器类:
package com.worklearn.worklearn_springsecurity.controller; import org.springframework.web.bind.annotation.*; /** * @version: 1.0 * @Author: wuqiu * @date: 2023-08-28 16:55 * @description: worklearn_SpringSecurity -> com.worklearn.worklearn_springsecurity.controller */ @RestController @RequestMapping("/test") public class LoginController { /* 我们在使用springSecurity默认页面的默认表单时,这个loginSuccess方法需要postMapping 因为springSecurity默认页面的默认表单发送的就是post请求, 数据被springSecurity接收并进行登录验证,通过后,springSecurity发送post重定向到http://localhost:8080/security-springboot/test/login-success 我们在使用自定义页面的自定义表单时,为了满足”让springSecurity把自定义页面发送的表单数据A当作springSecurity默认页面的默认表单发送的数据“ 我们的自定义页面的自定义表单也需要是发送post请求, 数据被springSecurity接收并进行登录验证,通过后, springSecurity知道这次的登陆数据来源是自定义页面的,所以不发post重定向,而是get重定向到http://localhost:8080/security-springboot/test/login-success */ @PostMapping(value = "/login-success",produces = {"text/plain;charset=UTF-8"}) // @PostMapping(value = "/login-success",produces = {"text/plain;charset=UTF-8"}) public String loginSuccess() { return "登陆成功"; } @GetMapping(value = "/r/r1",produces = {"text/plain;charset=UTF-8"}) public String r1() { return "开放的访问资源r1"; } @GetMapping(value = "/r/r2",produces = {"text/plain;charset=UTF-8"}) public String r2() { return "私有的访问资源r2"; } }