请设计一个登录验证的springboot项目,使用java注解演示(注意:项目中分为微信小程序登录和PC端登录)
时间: 2024-03-06 20:49:26 浏览: 21
好的,以下是一个简单的登录验证的 Spring Boot 项目,使用 Java 注解演示,包括微信小程序登录和 PC 端登录的验证。
首先,我们需要定义一个用户实体类,用于存储用户的登录信息,如下所示:
```java
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
// 其他属性和方法省略
}
```
接下来,我们需要定义一个用户服务类,用于处理用户登录和注册等业务逻辑。这里我们使用 Spring Security 提供的 UserDetailsService 接口来实现用户身份验证,如下所示:
```java
@Service
public class UserService 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<>());
}
public void register(User user) {
userRepository.save(user);
}
}
```
在上面的代码中,我们实现了 UserDetailsService 接口的 loadUserByUsername 方法,用于根据用户名从数据库中获取用户信息,并将其包装成一个 UserDetails 对象返回。另外,我们还实现了一个 register 方法,用于注册新用户。
接下来,我们需要定义一个控制器类,用于处理用户的登录和注册请求。这里我们使用 Spring Security 提供的 @Secured 注解来实现基于角色的访问控制,如下所示:
```java
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/login")
public ResponseEntity<String> login(@RequestParam String username, @RequestParam String password) {
try {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
return ResponseEntity.ok("Already logged in");
}
Authentication auth = new UsernamePasswordAuthenticationToken(username, password);
authentication = SecurityContextHolder.getContext().getAuthentication();
authentication = authenticationManager.authenticate(auth);
SecurityContextHolder.getContext().setAuthentication(authentication);
return ResponseEntity.ok("Login successful");
} catch (AuthenticationException e) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password");
}
}
@Secured("ROLE_ADMIN")
@PostMapping("/register")
public ResponseEntity<String> register(@RequestBody User user) {
try {
userService.register(user);
return ResponseEntity.ok("Registration successful");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
}
```
在上面的代码中,我们定义了一个 login 方法和一个 register 方法。其中,login 方法用于处理用户的登录请求,register 方法用于处理用户的注册请求。在 login 方法中,我们首先检查用户是否已经登录,如果已经登录,则直接返回登录成功的信息;否则,我们使用 AuthenticationManager 来进行用户身份验证,并将验证结果保存到 SecurityContext 中。在 register 方法中,我们使用 @Secured 注解来指定只有 ROLE_ADMIN 角色的用户才能访问该接口。
最后,我们需要在应用程序的配置类中启用 Spring Security,并配置登录验证的相关信息。这里我们使用基于内存的用户认证,如下所示:
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin").password("{noop}admin").roles("ADMIN")
.and()
.withUser("user").password("{noop}user").roles("USER");
}
}
```
在上面的配置中,我们首先禁用了 CSRF 保护,然后配置了基于请求路径的访问控制策略,指定了 /login 路径不需要进行身份验证,其他路径都需要进行身份验证。另外,我们还启用了基于表单的登录验证和基于 HTTP Basic 的认证方式。最后,我们使用 inMemoryAuthentication 方法配置了两个用户,一个是 admin(拥有 ADMIN 角色),一个是 user(拥有 USER 角色)。
至此,我们的登录验证的 Spring Boot 项目就完成了。需要注意的是,以上代码仅供参考,实际应用中需要根据具体需求进行修改和优化。