重学SpringBoot3-集成Spring Security(二)

在上一篇文章中,我们探讨了Spring Security的基础概念以及如何在Spring Boot 3项目中进行简单的集成。这一部分我们将深入讨论如何实现基于角色的访问控制,并配置自定义的安全策略。

1. 环境准备

确保你已经创建了一个Spring Boot 3项目,并在pom.xml中添加了Spring Security的依赖:

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

2. 编写用户和角色的模型

为了实现基于角色的访问控制,首先我们需要定义用户和角色的模型。这里我们使用内存中的用户存储,当然在实际应用中,通常会使用数据库。

创建一个User类和一个Role类:

// Role类
public class Role {
    private String name;

    public Role(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

// User类
public class User {
    private String username;
    private String password;
    private List<Role> roles;

    public User(String username, String password, List<Role> roles) {
        this.username = username;
        this.password = password;
        this.roles = roles;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public List<Role> getRoles() {
        return roles;
    }
}

3. 创建安全配置类

接下来,我们撰写一个安全配置类,继承WebSecurityConfigurerAdapter,并重写相关方法来配置认证和权限。我们可以通过InMemoryUserDetailsManager来创建内存用户。

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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN") // 只有ADMIN角色可访问
            .antMatchers("/user/**").hasAnyRole("USER", "ADMIN") // USER和ADMIN角色可访问
            .anyRequest().authenticated() // 其他请求需要认证
            .and()
            .formLogin(); // 使用表单登录
    }

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

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
            .and()
            .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
    }
}

在上面的配置中,我们定义了两个用户:一个名为user的用户,密码为password,角色为USER;另一个名为admin的用户,密码为admin,角色为ADMIN。同时,我们定义了不同路由的访问权限。

4. 创建控制器

我们接下来可以创建一些简单的控制器,以便验证权限控制。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/user/hello")
    public String userHello() {
        return "Hello User!";
    }

    @GetMapping("/admin/hello")
    public String adminHello() {
        return "Hello Admin!";
    }
}

5. 测试安全配置

启动Spring Boot应用,尝试访问以下URL:

  • /user/hello - 使用user角色访问,应该能成功返回消息。
  • /admin/hello - 使用admin角色访问,应该能成功返回消息。
  • /admin/hello - 使用user角色访问,应该被拒绝访问。

6. 小结

在本次文章中,我们学习了如何在Spring Boot 3中集成Spring Security,并通过角色实现基于权限的访问控制。随着项目的复杂性增加,可能还需要实现更复杂的用户认证和授权逻辑,比如JWT认证、OAuth2等。希望这篇文章能帮助你在Spring Security的学习和应用中打下基础。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部