在 Spring Boot 项目里集成 Spring Security 来实现用户认证和授权,可按以下步骤操作:
1. 添加依赖
在pom.xml
(Maven 项目)中添加 Spring Security 依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2. 配置 Spring Security
创建一个配置类,继承WebSecurityConfigurerAdapter
并重写相关方法来配置认证和授权规则。
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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
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.provisioning.InMemoryUserDetailsManager;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
3. 创建控制器
创建一个简单的控制器来测试安全配置。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/public/hello")
public String publicHello() {
return "This is a public endpoint.";
}
@GetMapping("/private/hello")
public String privateHello() {
return "This is a private endpoint.";
}
}
解释
- 依赖添加:添加
spring-boot-starter-security
和spring-boot-starter-web
依赖,前者提供 Spring Security 功能,后者用于构建 Web 应用。 - 安全配置:
SecurityConfig
类继承WebSecurityConfigurerAdapter
,重写configure(HttpSecurity http)
方法来定义请求的访问规则。这里/public/**
路径允许所有用户访问,其他请求需要认证。userDetailsService
方法创建了一个基于内存的用户认证服务,定义了一个用户名为user
、密码为password
、角色为USER
的用户。
- 控制器:
HelloController
包含两个端点,/public/hello
是公共端点,无需认证即可访问;/private/hello
是私有端点,需要认证后才能访问。
运行项目
启动 Spring Boot 项目,访问http://localhost:8080/public/hello
可以直接访问,而访问http://localhost:8080/private/hello
会弹出登录框,输入用户名user
和密码password
即可访问。