Spring Security 学习笔记 1:快速开始

Spring Security 学习笔记 1:快速开始

准备工作

先创建一个最简单的 Spring Boot 项目,包含最基本的依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
</dependency>

本文使用的 Spring Boot 版本为 4.0.1

网站

准备一个最简单的网站,该网站包含两个页面:

src/main/resources/templates/home.html:

html 复制代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
    <head>
        <title>Spring Security Example</title>
    </head>
    <body>
        <h1>Welcome!</h1>

        <p>Click <a th:href="@{/hello}">here</a> to see a greeting.</p>
    </body>
</html>

src/main/resources/templates/hello.html:

html 复制代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
    <head>
        <title>Hello World!</title>
    </head>
    <body>
        <h1>Hello world!</h1>
    </body>
</html>

要通过 Spring MVC 加载页面,需要添加控制器,除了一般性的创建 Controller 类以外,更简单的方式是通过 MVC 配置:

java 复制代码
@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }
}

这里的login页面会在之后创建,这里先占位。

一个简单的网站创建好了,可以通过链接访问相应的页面,比如 http://localhost:8080/home

保护

目前网站页面是没有鉴权和保护的,两个页面都可以随意访问,现在添加 Spring Security,让 hello 页面必须在登录后才能访问。

增加登录页src/main/resources/templates/login.html:

html 复制代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
<head>
    <title>Spring Security Example </title>
</head>
<body>
<div th:if="${param.error}">
    Invalid username and password.
</div>
<div th:if="${param.logout}">
    You have been logged out.
</div>
<form th:action="@{/login}" method="post">
    <div><label> User Name : <input type="text" name="username"/> </label></div>
    <div><label> Password: <input type="password" name="password"/> </label></div>
    <div><input type="submit" value="Sign In"/></div>
</form>
</body>
</html>

修改 hello 页面,添加登录后的用户信息展示:

html 复制代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
      xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity6">
<head>
    <title>Hello World!</title>
</head>
<body>
<h1 th:inline="text">Hello <span th:remove="tag" sec:authentication="name">thymeleaf</span>!</h1>
<form th:action="@{/logout}" method="post">
    <input type="submit" value="Sign Out"/>
</form>
</body>
</html>

添加 Spring Security 的配置类:

java 复制代码
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests((requests) -> requests
                        .requestMatchers("/", "/home").permitAll()
                        .anyRequest().authenticated()
                )
                .formLogin((form) -> form
                        .loginPage("/login")
                        .permitAll()
                )
                .logout(LogoutConfigurer::permitAll);

        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        UserDetails user =
                User.builder()
                        .username("user")
                        .password(encoder.encode("password"))
                        .roles("USER")
                        .build();

        return new InMemoryUserDetailsManager(user);
    }
}

配置类中定义了三种类型的 Spring Bean:

  • SecurityFilterChain:Spring Security 过滤器链,可以通过添加过滤器让 Spring Security 具备鉴权/授权等功能,在这个示例中添加了路径鉴权/登录/登出等功能。
  • PasswordEncoder:密码加密方式。
  • UserDetailsService:用户信息管理,这里使用了最简单的内存管理,并添加了一个默认用户。

现在再请求 hello 页面,就会自动重定向到登录页面,home 页面不受影响。

本文的所有示例代码可以从这里获取。

参考资料

相关推荐
词却4 小时前
OpenCV学习:MediaPipe 人脸网格检测
opencv·学习
李日华大战鸡红4 小时前
FOC SVPWM过调制(学习记录)
stm32·单片机·学习
敲个大西瓜4 小时前
langchain笔记(一)
redis·笔记·langchain
带金箍的至尊宝5 小时前
系统架构设计师笔记 05:第2章硬件与软件基础,冯诺依曼结构怎么考
数据库·笔记·系统架构
AI职业加油站5 小时前
AI 校招现状:大模型应用工程师证书,助力简历能力证明
大数据·运维·人工智能·学习·职场发展
知产xiao_xin5 小时前
商标权的内容和限制
经验分享·笔记·知识产权
陈年老古董5 小时前
Hive 函数学习笔记(上):单行函数与炸裂函数
hive·笔记·学习
喜欢打篮球的普通人6 小时前
MiniMind 学习笔记(十八):速通强化学习——从 MDP 到 PPO 的概念与算法地图
笔记·深度学习·学习
志尊宝7 小时前
Vue3 零基础每日笔记(076):防抖节流的正确使用——搜索框、按钮防重复提交、滚动监听
javascript·vue.js·笔记
老王爱玩车7 小时前
动态内存管理
c语言·开发语言·学习·面试