배움 __IL/TIL 1기

TIL : 87번째- 230410 [4-2-월]

Mo_bi!e 2023. 4. 10. 18:16

I. 인증과 권한

1. 로그인 구현

(1) 로그인 시스템

1)

admin은 쉽게 들어갈 수 있어

들어가려고 할 때 너 인증했어? 아니여 -> 인증하고와 하면서 로그인 페이지 가게끔해야해

로그인 페이지 갔다가 와

 

로그인 후 잠깐 너 권한있어? 하고 있으면 가고, 없으면 403 에러를 보여줘

 

인증하는것과 권한이 필요해

이거를 직접해도 되는데, 직접하기에는 너무 번거롭고 기술적인 내용도아니라서 복잡해

이거를 해결하기위해서는 인증과 권한을 담당하는 라이브러리를 제공해줘

 

인증을 먼저 해보자

 

(2) 인증

1) 

사물함을 쓴적, 신청한 사람에게 key가 부여돼

이 키가 사물함 열 수있는데, 지금은 사물함을 쓴 적이, 쓸일도 없어

인증 할때 사물함 쓸건데, 사물함 신청하게 되고 하는데 그 때 키가 부여하게 돼

 

 

2)

package kr.co.rland.web.controller.admin;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import jakarta.servlet.http.HttpServletRequest;

@Controller("adminHomeController")
@RequestMapping("/admin")
public class HomeController {
	
	@GetMapping("/index")
	public String index(HttpServletRequest request) {
		
		request.getSession().setAttribute("test", "hehe");
        System.out.println((String) session.getAttribute("test"));

		return "admin/index";
	}
}

보통 세션키를 생성하고(getSession) & 세션객체에 저장(setAttribute) 하는거야

즉 이때 사물함 키가 발급되는거야

sessionId를 들고오는거야

세션 담으면 이제 나 인증했어! 라고 하는거고 이건 캐비넷 열어보면 알 수있어

	@GetMapping("list")
	public String list(@RequestParam(name="p", defaultValue = "1") int page, 
						@RequestParam(name="q", required = false) String query,
						@RequestParam(name="c", required = false) Integer categoryId,
//						@CookieValue("my") String myCookie
						//@RequestHeader("Accept-Language") String language,
						Model model,
						HttpSession session
						) throws UnsupportedEncodingException {

//		의미: 너 id pw 검증받은적있니? (마치 놀이공권 들어갈 때 팔찌 찬것처럼)

		//세션 / 쿠키 이용해서 사용자가 인증되었던 적이 있는지를 확인함.
//		if(너 로그인했니? => 아니오(==null) -> 로그인하고와)
		if(session.getAttribute("isAuth") == null) // 로그인 하고와
			return "redirect:/user/login;";
		
//		if(너 로그인했니? => 
//			네 => if(그런 너 어드민이니?)
//			아니오 -> 권한없다 얘~

두가지이다 

우선 로그인했는지? 즉 id,pw 를 검증받았는지확인한다

이것은 곧 세션,쿠키로 사용자가 인증된적이있는지 확인한다

 

로그인을 하지않았으면 로그인하게끔하고

로그인을 했으면 권한이 있는지 확인한다.

 

id, pw를 검증받으면 session을 받는데, 

이 경우 isAuth 객체가 null 이면 login 인창으로 리다이렉트한다.

404

권한이 없는데 접속하는경우 다음과같은 404 권한없음이 발생한다

 

3)

login 하는 창으로 안내해보자

package kr.co.rland.web.controller.admin;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import jakarta.servlet.http.HttpServletRequest;

@Controller("adminHomeController")
@RequestMapping("/admin")
public class HomeController {
	
	@GetMapping("/index")
	public String index(HttpServletRequest request) {
		
		request.getSession().setAttribute("test", "hehe");

		return "admin/index";
	}
}

login 으로 인도하게끔해야한다.

(3) user 관련 세팅

1)

어떤 entity 를 쓸지

여기서 username pk로 안한이유는 탈퇴해도 다시 사용할수 있게끔 풀어놓기 위해서야!

나중에 삭제되면 다 지워야해

 

package kr.co.rland.web.entity;

import groovy.transform.ToString;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Member {

	private Long id;
	private String userName;
	private String pwd;
	private String email;
	private Long roleId;
	
}

여기 맞춰서 entity를 만들자!

 

2)

package kr.co.rland.web.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import jakarta.servlet.annotation.WebServlet;
import kr.co.rland.web.entity.Category;
import kr.co.rland.web.entity.Member;
import kr.co.rland.web.entity.Menu;
import kr.co.rland.web.entity.MenuView;
import kr.co.rland.web.entity.RcmdMenuView;
import kr.co.rland.web.service.CategoryService;
import kr.co.rland.web.service.MemberService;
import kr.co.rland.web.service.MenuService;
import kr.co.rland.web.service.RcmdMenuService;

@Controller
@RequestMapping("/user")
public class UserController {

	@Autowired
	private MemberService memberservice;
	
	@GetMapping("login")
	public String login(String uid, String pwd) {
		
		//위 아래중 뭐가 바람직? 아래가 바람직하
		//컨트롤러는 입출력에 불과하기 때문에 아래가 바람직해
//		Member member = menuservice.getByUserName(uid);
		boolean isvalid = memberservice.isvaildMember(uid, pwd);
			
		return "/user/login";
	}
	
}

두가지 방식중에 정보를 들고와서 컨트롤러에서 계정정보를 연산하는것보다

service단에서 하는것이 바람직하다

로그인 여부만 확인하면 되기 때문에 isvalid 만 둔다.

 

3)

package kr.co.rland.web.service;

import kr.co.rland.web.entity.Member;

public interface MemberService {

//	Member getByUserName(String uid);

	boolean isvaildMember(String uid, String pwd);

}
package kr.co.rland.web.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import kr.co.rland.web.entity.Member;
import kr.co.rland.web.repository.MemberRepository;

@Service
public class DefaultMemberService implements MemberService{

	@Autowired
	private MemberRepository repository;
	
	@Override
	public boolean isvaildMember(String uid, String pwd) {
		// TODO Auto-generated method stub
		Member member = repository.findByUserName(uid);
		
		
		return false;
	}


}

확인하기 위한 service를 만든다.

 

4)

package kr.co.rland.web.repository;

import org.apache.ibatis.annotations.Mapper;

import kr.co.rland.web.entity.Member;

@Mapper
public interface MemberRepository {

	Member findByUserName(String uid);
	
}

repository 를 한다

 

이런 일련의 과정들은 스프링으로 가볍게 되는데 그 원리를 이해하기 위해서 직접하는것이다

너무 부담스럽게 보지말자!


1. 보충

 

 

 

 

 

2. 회고 

1) 내가 이전에 했던 로그인 구현방식과 어느정도 유사해서 뿌듯하다

어서 배워서 하나의 시작점을 구현해보는 경험을 만들고 싶다.

'배움 __IL > TIL 1기' 카테고리의 다른 글

TIL : 91번째- 230417 [4-3-월]  (0) 2023.04.17
TIL : 88번째- 230411 [4-2-화]  (0) 2023.04.11
TIL : 86번째- 230407 [4-1-금]  (0) 2023.04.07
TIL : 83번째- 230404 [4-1-화]  (0) 2023.04.04
TIL : 82번째- 230403 [4-1-월]  (0) 2023.04.03