Spring Security 学习笔记 1:快速开始
本文介绍了如何使用Spring Security快速构建一个简单的安全Web应用。首先创建基础Spring Boot项目并添加Thymeleaf模板页面,然后通过Spring Security配置保护特定页面(如/hello)需要登录访问。关键步骤包括:1)创建登录页面和处理表单;2)配置SecurityFilterChain定义访问权限;3)使用内存用户存储和BCrypt密码加密;4)集成Thy
Spring Security 学习笔记 1:快速开始
准备工作
先创建一个最简单的 Spring Boot 项目,包含最基本的依赖:
<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:
<!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:
<!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 配置:
@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:
<!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 页面,添加登录后的用户信息展示:
<!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 的配置类:
@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 页面不受影响。
本文的所有示例代码可以从这里获取。
参考资料
更多推荐

所有评论(0)