Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- @IdClass
- REST란
- 복합키
- github
- jwt메서드
- json gson 차이
- uncheck Exception
- JPA주의사항
- 스프링 부트 기능
- spring서버
- Error creating bean with name
- 스프링 부트 공식 문서
- 빈생성안됨
- REST API 규칙
- queryDSL
- Q 클래스
- Spring Spring boot 차이
- JPA
- ERD 작성
- jpa에러
- 1차캐시
- jpa회원가입
- git
- Unsatisfied dependency
- JoinColumn
- Filter
- 스프링부트오류
- json
- 인텔리제이
- 최종 프로젝트
Archives
- Today
- Total
Everyday Dev System
로그인 구현하기 본문
로그인 전에 회원가입 코드 먼저 선행되어야 함.
LoginRequestDto.java
package com.sparta.springauth.dto;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class LoginRequestDto {
private String username;
private String password;
}
UserController.java
- 해당 메서드 추가
@PostMapping("/user/login")
public String login(LoginRequestDto requestDto, HttpServletResponse res){
try {
userService.login(requestDto,res);
} catch (Exception e) {
return "redirect:/api/user/login-page?error";
}
return "redirect:/";
}
UserService.java
package com.sparta.springauth.service;
import com.sparta.springauth.dto.LoginRequestDto;
import com.sparta.springauth.dto.SignupRequestDto;
import com.sparta.springauth.entity.User;
import com.sparta.springauth.entity.UserRoleEnum;
import com.sparta.springauth.jwt.JwtUtil;
import com.sparta.springauth.repository.UserRepository;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
private final JwtUtil jwtUtil;
// ADMIN_TOKEN -> 해당 토큰을 사용해서 관리자인지 아닌지 구분할거임.
private final String ADMIN_TOKEN = "AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC";
public void signup(SignupRequestDto requestDto) {
String username = requestDto.getUsername();
String password = passwordEncoder.encode(requestDto.getPassword());// 암호화
// 회원 중복 확인
Optional<User> checkUsername = userRepository.findByUsername(username);
if (checkUsername.isPresent()) {
throw new IllegalArgumentException("중복된 사용자가 존재합니다.");
}
// email 중복확인
String email = requestDto.getEmail();
Optional<User> checkEmail = userRepository.findByEmail(email);
if (checkEmail.isPresent()) {
throw new IllegalArgumentException("중복된 Email 입니다.");
}
// 사용자 ROLE 확인
UserRoleEnum role = UserRoleEnum.USER;
if (requestDto.isAdmin()) {
if (!ADMIN_TOKEN.equals(requestDto.getAdminToken())) {
throw new IllegalArgumentException("관리자 암호가 틀려 등록이 불가능합니다.");
}
role = UserRoleEnum.ADMIN;
}
// 사용자 등록
User user = new User(username, password, email, role);
userRepository.save(user);
}
public void login(LoginRequestDto requestDto, HttpServletResponse res) {
String username = requestDto.getUsername();
String password = requestDto.getPassword();
// 사용자 확인
// findByUsername은 Optional 타입을 반환하지만 문제가 없으면 user 객체를 반환한다.
// orElseThrow로 인해서.
User user = userRepository.findByUsername(username).orElseThrow(
() -> new IllegalArgumentException("등록된 사용자가 없습니다.")
);
// 비밀번호 확인
if (!passwordEncoder.matches(password, user.getPassword())) {
throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
}
// JWT 생성 및 쿠키에 저장.
String token = jwtUtil.createToken(user.getUsername(), user.getRole());
jwtUtil.addJwtToCookie(token, res);
}
}
중요한 코드
public void login(LoginRequestDto requestDto, HttpServletResponse res) {
String username = requestDto.getUsername();
String password = requestDto.getPassword();
// findByUsername은 Optional 타입을 반환하지만 문제가 없으면 user 객체를 반환한다.
// orElseThrow로 인해서.
User user = userRepository.findByUsername(username).orElseThrow(
() -> new IllegalArgumentException("등록된 사용자가 없습니다.")
);
if (!passwordEncoder.matches(password, user.getPassword())) {
throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
}
String token = jwtUtil.createToken(user.getUsername(), user.getRole());
jwtUtil.addJwtToCookie(token, res);
}
결과 :
'내배캠 주요 학습 > Spring 숙련' 카테고리의 다른 글
Spring Secutiry (0) | 2023.06.20 |
---|---|
Spring 에서 Filter란? (0) | 2023.06.20 |
회원가입 구현하기 (0) | 2023.06.19 |
JWT version 0.11.5 (0) | 2023.06.19 |
인증 - 쿠키와 세션 (1) | 2023.06.19 |