70일: Filter, Interceptor, AOP, ANT 표기법, Spring Security(가입확인, 아이디 찾기, 비밀번호 찾기 및 변경)

Jiwontwopunch·2022년 2월 23일
0

국비기록

목록 보기
70/121
post-thumbnail

2022.02.23.Wed.

✍ 복습

Filter, Interceptor, AOP

ANT 표기법

가입 확인

MemberService.java

package com.example.demo.service;

import java.time.*;

import javax.mail.*;
import javax.mail.internet.*;

import org.apache.commons.lang3.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.mail.javamail.*;
import org.springframework.security.crypto.password.*;
import org.springframework.stereotype.*;
import org.springframework.stereotype.Service;

import com.example.demo.dao.*;
import com.example.demo.entity.*;

@Service
public class MemberService {
	@Autowired
	private MemberDao dao;
	@Autowired
	private PasswordEncoder passwordEncoder;
	@Autowired
	private JavaMailSender javaMailSender;
	
	private void sendMail(String from, String to, String subject, String text) {
		MimeMessage message = javaMailSender.createMimeMessage();
		MimeMessageHelper helper;
		try {
			helper = new MimeMessageHelper(message, false, "utf-8");
			helper.setFrom(from);
			helper.setTo(to);
			helper.setSubject(subject);
			helper.setText(text, true);
			javaMailSender.send(message);
		} catch (MessagingException e) {
			// 메일 발송 실패 예외는 실제로 발생하지 않는다 -> 왜냐하면 직접 보내는 것이 아니라 gmail이 대신 보내준다
			e.printStackTrace();
		}	
	}
	
	public boolean idCheck(String username) {
		return !dao.existsById(username);
	}

	public void join(Member member) {
		String checkcode = RandomStringUtils.randomAlphanumeric(20);
		String encodedPassword = passwordEncoder.encode(member.getPassword());
		member.setJoinday(LocalDate.now()).setAuthority("ROLE_USER").setCheckcode(checkcode)
			.setEnabled(false).setLevels(Level.BRONZE).setPassword(encodedPassword).setCount(0);
		// 문자열은 상수로 변경불가능. +작업을 하면 계속 문자열 객체를 새로 생성한다
		// 문자열 변수 : StringBuilder(thread 안전x), StringBuffer(스레드 안전)
		//		스레드 안전은 어떤 의미? 작업을 시작했으면 끝나는 것이 보장된다(synchronized)
		dao.save(member);
		String text = new StringBuilder("<h1>가입확인 코드</h1>")
				.append("<p>가입을 마무리하려면 아래 코드를 화면에 입력하세요</p>")
				.append(checkcode).toString();
		sendMail("admin@icia.com", member.getEmail(), "가입확인 메일", text);
	}

	public Boolean checkcode(String checkcode) {
		Member member = dao.findByCheckcode(checkcode);
		if(member==null)
			return false;
		return dao.update(Member.builder().username(member.getUsername()).checkcode("0").enabled(true).build())==1;
	}

아이디 찾기

find_id.html

MemberController.java

MemberService.java

	public String findId(String email) {
		Member member = dao.findByEmail(email);
		if(member==null)
			return null;
		return member.getUsername();

비밀번호 찾기

reset_password.html

MemberService.java

	public Boolean resetPassword(String username, String email) {
		Member member = dao.findById(username);
		// 아이디 검색 실패
		if(member==null)
			return false;
		// 이메일 검색 실패
		if(member.getEmail().equals(email)==false)
			return false;
		// 임시 비밀번호를 만들어 암호화한 다음 DB에 업데이트, 이메일로 임시 비밀번호 발송
		String newPassword = RandomStringUtils.randomAlphanumeric(20);
		String newEncodedPassword = passwordEncoder.encode(newPassword);
		dao.update(Member.builder().username(username).password(newEncodedPassword).build());
		String text = new StringBuilder("<h1>임시비밀 번호</h1>")
				.append("<p>아래 임시 비밀번호로 로그인하세요. 로그인 후 비밀번호를 변경해 주세요</p>")
				.append(newPassword).toString();
		sendMail("admin@icia.com", member.getEmail(), "임시비밀번호 안내", text);
		return true;
	}

MemberController.java

비밀번호 변경

change_password.html

MemberService.java

MemberController.java

0개의 댓글