국비수업/수업정리

스프링 / 11

밀김 2023. 6. 14. 15:06
728x90

 

 

 

 

 

 

 

 

 

 

 

<span sec:authentication="name">

- 사용자 이름 식별

 

 

 

- 클래스 이름이 같으면 콩자루 담을때 충돌이 날수도 있으니까 컨트롤러 어노테이션을 다르게 붙여준다

 

 

 

- 우리는 객체 단위로 insert하기 때문에 객체에 담아놔야 한다

 

 

 

- redirect:list 하면 list로 가세요~ 한것 (경로없이 걔만 보낸것) 요청을 새로 할 주소를 얘기한것

 

 

 

 

- 입력 폼 html 

 <form action="reg" method="post"> 
		 <div>
			<label>메뉴 이름</label>
			<input type="text" name="korName">
		 </div>
		 <div>
			 <label>메뉴 설명</label>
			<textarea rows="30" cols="90" name="description"></textarea>
		</div>
		 <div>
			 <a href="">취소</a>
			<input type="submit" value="등록">
		</div>
	 </form>

 

- 컨트롤러

		@PostMapping("reg")
		public String reg(Menu menu) {
			System.out.println(menu);
			return "redirect:list";
		}

 

 

 

 

 

 

 

 

- post 내용 보내는 방법

	 <form action="reg" method="post"> 
		 <div>
			<label>메뉴 이름</label>
			<input type="text" name="korName">
		 </div>
		 <div>
			 <label>메뉴 설명</label>
			<textarea rows="30" cols="90" name="description"></textarea>
		</div>
		 <div>
			 <a href="">취소</a>
			<input type="submit" value="등록">
		</div>
	 </form>
		@PostMapping("reg")
		public String reg(Menu menu) {
			SecurityContext context = SecurityContextHolder.getContext();
			String name = context.getAuthentication().getName();
			
			System.out.println(name);
			System.out.println(menu);
			return "redirect:list";
		}

 

 

 

- 더 간단한 방법!

		@PostMapping("reg")
		public String reg(Menu menu,Principal principal) {
			SecurityContext context = SecurityContextHolder.getContext();
			String name = principal.getName();
			
			System.out.println(name);
			System.out.println(menu);
			return "redirect:list";
		}

 

 

 

 

      MyUserDetails userDetails = new MyUserDetails();
      userDetails.setUsername(username);
      userDetails.setId(member.getId());
      userDetails.setPassword(member.getPwd());
      userDetails.setEmail(member.getEmail());
      List<GrantedAuthority> authorities = new ArrayList<>();
      authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
      userDetails.setAuthorities(authorities);

 

 

 

 

- @Bean으로 담으면 @Autowired 안해줘도 된다 

 

 

- 내가 직접 만들었으면 Autowired 를 붙이고 내가 안만들었으면 Bean을 붙인다

 

 

- 로그아웃하면 프린서펄이 null이 되면서 500 오류가 나게 된다

 

 

 

<span sec:authorize="isAuthenticated()">

인증된 사용자만 허용하는...

 

 

 

 

- post쓸때 객체 두개 담는건 원래 안된다 근데,

	public String reg(Menu menu,
				@AuthenticationPrincipal MyUserDetails user)

이렇게 하거나

			SecurityContext context = SecurityContextHolder.getContext();
			MyUserDetails user = (MyUserDetails)context.getAuthentication().getPrincipal();

아니면 이렇게 context로 담아주면 된다. 방법은 자유~~

 

 

 

 


 

 

< 복습 >



- 필터는 몰라도 된다. 라이브러리를 직접 만들게 아니기 때문에

- 컨피그=환경설정
 
- 디비에는 암호화된 비밀번호가 입력된다

- post : 등록

- Role : 역할 (관리자 / 회원 뭐 이런식...)

 

manager.setAuthoritiesByUsernameQuery(

"select username,r.name authority from role r join member m on r.id where username=?");

- 세션을 유지하기 위해 정보를 담아둔다 

 

- userdetails 는 id와 password 와 Authoritie를 기본으로 갖고 있어서 무조건 구현해줘야함

 

 

 

private List<GrantedAuthority> authorities;

는 역할자의 역할이 담기는것

 

 

- 제네릭 안에 ? 물음표는 '모든타입'을 의미함

 

 

- 도메인을 치는 순간 그 도메인을 매핑하고 있는 컨트롤러로 간다

 

 

- 주소를 입력해서 엔터 치는게 <요청>

 

 

- 포스트는 인자가 무조건 있을수 밖에 없다(겟은 모델이 없을수도 있다. 정적인 페이지를 띄워줄수도 있기 때문에)인자를 받아서 무언가를 전달해서 보여줘야하기 때문에

 

 

- html에서 name이라는 속성으로 엔티티에 있는 속성들의 값을 담을수 있다

 

 

- 포스트매핑을 써준다 > 내가 등록할 객체를 받아온다 

 

 

- 구현체가 엔티티에 속성을 담아줌

 

 

 - 원래 포스트 매핑에는 인자로 객체를 한개이상 담을수 없는데 유저 정보를 담는다고 어노테이션을 붙여주면 두개를 담을수 있다 (authenticationprincipal)

 

 

- sec:authentication(인증된 사용자의 인증정보를 보기위한 api)

얘는 라이브러리다 sec.authorize(권한이 있는지 없는지를 확인하는 api)

 

 

- isAuthenticated : 인증됨 (익명과 반대. 로그인 되고 난 후) / 어노니머스는 로그인 전!

 

 

 

 

 

 

 

728x90