Spring Boot实现加法API与用户认证登录系统

在Spring框架中,你可以通过创建Spring Boot项目来快速实现加法计算器和用户登录功能。以下是一个简要的步骤指南,帮助你了解如何分别实现这两个功能。

图片[1]_Spring Boot实现加法API与用户认证登录系统_知途无界

1. 创建Spring Boot项目

首先,你需要创建一个Spring Boot项目。你可以使用Spring Initializr网站(https://start.spring.io/)来生成一个包含所需依赖的项目,或者在你的IDE中创建一个新的Spring Boot项目。

2. 添加依赖

对于加法计算器和用户登录功能,你需要以下依赖:

  • Spring Web(用于创建RESTful API)
  • Spring Security(用于用户认证和授权,可选,但推荐用于登录功能)
  • Spring Data JPA(如果你打算将用户信息存储在数据库中,可选)
  • H2 Database(一个内存数据库,适合快速原型开发,可选)

3. 实现加法计算器

创建一个简单的REST控制器来处理加法请求。

@RestController
@RequestMapping("/api/calculator")
public class CalculatorController {
@PostMapping("/add")
public ResponseEntity<Integer> add(@RequestBody Map<String, Integer> numbers) {
Integer num1 = numbers.get("num1");
Integer num2 = numbers.get("num2");
if (num1 == null || num2 == null) {
return ResponseEntity.badRequest().body(null);
}
int result = num1 + num2;
return ResponseEntity.ok(result);
}
}
@RestController  
@RequestMapping("/api/calculator")  
public class CalculatorController {  
  
    @PostMapping("/add")  
    public ResponseEntity<Integer> add(@RequestBody Map<String, Integer> numbers) {  
        Integer num1 = numbers.get("num1");  
        Integer num2 = numbers.get("num2");  
        if (num1 == null || num2 == null) {  
            return ResponseEntity.badRequest().body(null);  
        }  
        int result = num1 + num2;  
        return ResponseEntity.ok(result);  
    }  
}
@RestController @RequestMapping("/api/calculator") public class CalculatorController { @PostMapping("/add") public ResponseEntity<Integer> add(@RequestBody Map<String, Integer> numbers) { Integer num1 = numbers.get("num1"); Integer num2 = numbers.get("num2"); if (num1 == null || num2 == null) { return ResponseEntity.badRequest().body(null); } int result = num1 + num2; return ResponseEntity.ok(result); } }

你可以使用Postman或curl来测试这个API,发送一个POST请求到/api/calculator/add,并在请求体中提供num1num2参数。

4. 实现用户登录功能

配置Spring Security

创建一个Spring Security配置类。

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@EnableWebSecurity  
public class SecurityConfig extends WebSecurityConfigurerAdapter {  
  
    @Autowired  
    private UserDetailsService userDetailsService;  
  
    @Override  
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {  
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());  
    }  
  
    @Override  
    protected void configure(HttpSecurity http) throws Exception {  
        http  
            .authorizeRequests()  
                .antMatchers("/api/public/**").permitAll()  
                .anyRequest().authenticated()  
                .and()  
            .formLogin()  
                .permitAll()  
                .and()  
            .logout()  
                .permitAll();  
    }  
  
    @Bean  
    public PasswordEncoder passwordEncoder() {  
        return new BCryptPasswordEncoder();  
    }  
}
@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/api/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .permitAll() .and() .logout() .permitAll(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }

创建UserDetailsService实现

你需要实现UserDetailsService接口来加载用户特定的数据。

@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User not found");
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
}
}
@Service  
public class CustomUserDetailsService implements UserDetailsService {  
  
    @Autowired  
    private UserRepository userRepository;  
  
    @Override  
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {  
        User user = userRepository.findByUsername(username);  
        if (user == null) {  
            throw new UsernameNotFoundException("User not found");  
        }  
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());  
    }  
}
@Service public class CustomUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found"); } return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>()); } }

创建用户实体和存储库

定义一个简单的用户实体和一个JPA存储库来管理用户。

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
// Getters and Setters
}
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
@Entity  
public class User {  
  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    private String username;  
    private String password;  
  
    // Getters and Setters  
}  
  
public interface UserRepository extends JpaRepository<User, Long> {  
    User findByUsername(String username);  
}
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // Getters and Setters } public interface UserRepository extends JpaRepository<User, Long> { User findByUsername(String username); }

初始化一些用户数据

你可以在应用启动时初始化一些用户数据。

@Component
public class DataLoader implements CommandLineRunner {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public void run(String... args) throws Exception {
User user = new User();
user.setUsername("user");
user.setPassword(passwordEncoder.encode("password"));
userRepository.save(user);
}
}
@Component  
public class DataLoader implements CommandLineRunner {  
  
    @Autowired  
    private UserRepository userRepository;  
  
    @Autowired  
    private PasswordEncoder passwordEncoder;  
  
    @Override  
    public void run(String... args) throws Exception {  
        User user = new User();  
        user.setUsername("user");  
        user.setPassword(passwordEncoder.encode("password"));  
        userRepository.save(user);  
    }  
}
@Component public class DataLoader implements CommandLineRunner { @Autowired private UserRepository userRepository; @Autowired private PasswordEncoder passwordEncoder; @Override public void run(String... args) throws Exception { User user = new User(); user.setUsername("user"); user.setPassword(passwordEncoder.encode("password")); userRepository.save(user); } }

5. 测试登录功能

启动你的Spring Boot应用,并尝试访问/login端点(Spring Security默认提供的登录页面)。使用你在DataLoader中初始化的用户名和密码进行登录。

6. 安全性注意事项

  • 在生产环境中,不要使用内存数据库(如H2)来存储用户数据。
  • 使用更安全的密码编码算法(如BCrypt)。
  • 考虑使用HTTPS来保护你的API和数据传输。
  • 遵循最小权限原则,只为用户授予必要的权限。

以上是一个基本的示例,展示了如何在Spring框架中实现加法计算器和用户登录功能。根据你的需求,你可能需要添加更多的功能和安全性措施。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞47 分享
Whatever I believed, I did; and whatever I did, I did with my whole heart and mind.
凡是我相信的,我都做了;凡是我做了的事,都是全身心地投入去做的
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容