登录系统的后端代码实现

以下是一个基于Java和Spring Boot框架的登录系统的后端代码实现:

  1. 定义一个登录接口,接收用户输入的账号和密码。
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
    // 获取登录信息
    String username = loginRequest.getUsername();
    String password = loginRequest.getPassword();
    // TODO: 输入参数校验

    // TODO: 账户验证
}
  1. 后端代码需要验证用户输入的账号和密码是否正确,可以通过查询数据库或其他认证方式。

我们可以使用 Spring Data JPA 实现对MySQL数据库的操作,查询用户信息并验证账号密码是否正确。

@Autowired
private UserRepository userRepository;

private boolean verifyUser(LoginRequest loginRequest) {
    String username = loginRequest.getUsername();
    String password = loginRequest.getPassword();
    User user = userRepository.findByUsername(username); // 从数据库获取用户信息
    if (user != null && encodingPassword(password).equals(user.getPassword())) {
        return true; // 当用户名密码正确时,返回 true
    }
    return false;
}

private String encodingPassword(String password) {
    //TODO: 密码加密
    return password;
}
  1. 如果账号和密码正确,生成一个加密的 token,将其保存到数据库或其他存储介质中,并返回给前端。
private String generateToken(User user) {
    //TODO: 生成token
    String token = "";
    //TODO: 将 token 保存到数据库(这里简单处理,只保存了一个 token)
    return token;
}
  1. 前端在后续的请求中需要携带这个 token,后端根据 token 来验证用户的身份,可以令牌通过之后,处理请求并返回结果给前端。
@Autowired
private JwtUtil jwtUtil;

@RequestMapping(value = "/secure/api", method = RequestMethod.GET)
public ResponseEntity<?> getSecureData(HttpServletRequest request) {
    String jwt = request.getHeader("Authorization").split(" ")[1];
    String username = jwtUtil.extractUsername(jwt);
    User user = userRepository.findByUsername(username); //获取用户信息
    return ResponseEntity.ok(user);
}
  1. 如果用户登录失败,根据具体情况返回相应的错误信息,例如用户名或密码错误。

下面是完整的代码实现:

@RestController
public class AuthController {

    @Autowired
    private JwtUtil jwtUtil;

    @Autowired
    private UserRepository userRepository;

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public ResponseEntity<?> hello() {
        return ResponseEntity.ok("Hello World!");
    }

    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
        if (verifyUser(loginRequest)) {
            User user = userRepository.findByUsername(loginRequest.getUsername()); // 获取用户信息
            String token = generateToken(user); // 生成 token
            Map<String, String> response = new HashMap<>();
            response.put("token", token);
            return ResponseEntity.ok(response); // 返回 token
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); // 登录失败,返回 401
        }
    }

    @RequestMapping(value = "/secure/api", method = RequestMethod.GET)
    public ResponseEntity<?> getSecureData(HttpServletRequest request) {
        String jwt = request.getHeader("Authorization").split(" ")[1]; // 获取请求头中的 token
        String username = jwtUtil.extractUsername(jwt);
        User user = userRepository.findByUsername(username); // 获取用户信息
        return ResponseEntity.ok(user);
    }

    private boolean verifyUser(LoginRequest loginRequest) {
        String username = loginRequest.getUsername();
        String password = loginRequest.getPassword();
        User user = userRepository.findByUsername(username); // 从数据库获取用户信息
        if (user != null && encodingPassword(password).equals(user.getPassword())) {
            return true; // 当用户名密码正确时,返回 true
        }
        return false;
    }

    private String generateToken(User user) {
        String token = jwtUtil.generateToken(user); // 生成 token
        return token;
    }

    private String encodingPassword(String password) {
        //TODO: 密码加密
        return password;
    }
}

其中 JwtUtil 和 UserRepository 代码可以参考下面的代码实现。

JwtUtil.java

@Component
public class JwtUtil {

    private String secret = "my_secret_key";

    public String extractUsername(String token) {
        return extractClaim(token, Claims::getSubject);
    }

    public Date extractExpiration(String token) {
        return extractClaim(token, Claims::getExpiration);
    }

    public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = extractAllClaims(token);
        return claimsResolver.apply(claims);
    }

    private Claims extractAllClaims(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }

    private Boolean isTokenExpired(String token) {
        return extractExpiration(token).before(new Date());
    }
    
    public String generateToken(User user) {
        Map<String, Object> claims = new HashMap<>();
        return createToken(claims, user.getUsername());
    }

    private String createToken(Map<String, Object> claims, String subject) {
        return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10))
                .signWith(SignatureAlgorithm.HS256, secret).compact();
    }

    public Boolean validateToken(String token, User user) {
        final String username = extractUsername(token);
        return (username.equals(user.getUsername()) && !isTokenExpired(token));
    }
}

UserRepository.java

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    User findByUsername(String username);
}

这就是一个基于Java和Spring Boot框架的登录系统的代码实现。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值