스프링 / 11
<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 : 인증됨 (익명과 반대. 로그인 되고 난 후) / 어노니머스는 로그인 전!