欢迎光临散文网 会员登陆 & 注册

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

2023-08-29 17:37 作者:雪虬出云  | 我要投稿

对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/>
        密&nbsp;&nbsp;&nbsp;码:<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";
    }
}



尚硅谷SpringSecurity框架教程(spring security源码剖的评论 (共 条)

分享到微博请遵守国家法律