在 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-securityspring-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即可访问。