Spring Boot集成Spring Security:实现用户认证与授权

1. 添加依赖

pom.xml文件中添加Spring Security的依赖。如果你使用的是Spring Boot 3.x或更高版本,可以添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

如果你使用的是Spring Boot 2.x,可能需要额外添加spring-security-config依赖。


2. 配置Spring Security

Spring Security的核心是SecurityFilterChainUserDetailsService。你需要通过配置类来定义安全策略。

创建配置类

创建一个继承自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.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 {

    @Bean
    public UserDetailsService userDetailsService() {
        // 在内存中定义用户
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();

        return new InMemoryUserDetailsManager(user);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable() // 禁用CSRF保护(开发环境可以禁用,生产环境建议启用)
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN") // 配置路径权限
                .antMatchers("/user/**").hasRole("USER")
                .antMatchers("/", "/home", "/register").permitAll() // 允许匿名访问的路径
                .anyRequest().authenticated() // 其他请求需要认证
            .and()
            .formLogin()
                .loginPage("/login") // 自定义登录页面
                .permitAll() // 允许匿名访问登录页面
            .and()
            .logout()
                .permitAll(); // 允许匿名访问登出页面
    }
}

说明:

  1. UserDetailsService:定义用户信息。这里使用了内存用户管理InMemoryUserDetailsManager,实际项目中可以使用数据库存储用户信息。

  2. HttpSecurity:定义安全策略,例如:

  • csrf():CSRF保护。

  • authorizeRequests():定义路径的访问权限。

  • formLogin():自定义登录页面。

  • logout():配置登出功能。


3. 创建登录页面

Spring Security默认会提供一个简单的登录表单,但你可以自定义登录页面。

创建登录页面

src/main/resources/templates目录下创建login.html文件(假设使用Thymeleaf模板引擎):

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Login</title>
</head>
<body>
    <form th:action="@{/login}" method="post">
        <div><label>Username: <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>

4. 测试

启动项目后,访问受保护的路径(如/admin/user),会被重定向到登录页面。输入用户名和密码后,根据角色权限访问对应的资源。


5. 扩展功能

数据库用户存储

如果需要从数据库中获取用户信息,可以实现UserDetailsService接口,并从数据库中加载用户信息。

@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username)
            .orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username));

        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
    }
}

自定义登录逻辑

可以通过实现AuthenticationProvider接口来自定义登录逻辑。

配置JWT

如果需要使用JWT进行无状态认证,可以结合JwtAuthenticationTokenJwtAuthenticationProvider实现。

posted @   软件职业规划  阅读(109)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示