권한설정 애너테이션
@Secured(Athority값) : 이 애너테이션을 위에 붙여주면 해당 값을 가진 사용자만 들어올 수 있도록 제한함.
pattern 정규 표현식
@Pattern(regexp = "^[a-z0-9]$")
애너테이션을 이용해 위와같이 표현하는데, 위는 영어소문자,숫자로 제한한다는 의미이다.
그 외에도
(?i) | 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음 |
같은 부분도 존재한다.
로그인한 사용자 정보 가져오기
1.Bean을 통해 가져오기
security context holder를통해 가져온다.
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserDetails userDetails = (UserDetails)principal;
String username = principal.getUsername();
String password = principal.getPassword();
2. Controller단에서 principal객체에 접근해서 정보를 가져오는 방법
@Controller
public class SecurityController {
@GetMapping("/username")
@ResponseBody
public String currentUserName(Principal principal) {
return principal.getName();
}
}
@Controller로 선언된 객체에서는 principal뿐 아니라 Authentication객체에도 접근할 수 있다.
거기서 getName()을 이용해 Service단에 정보를 넘겨줄 수 도 있다.
//Controller 클래스
@PostMapping("/form")
public String formSubmit(@Validated @ModelAttribute BoardForm boardForm, BindingResult bindingResult,Authentication authentication){
//...
String memberEmail = authentication.getName();
boardService.save(boardForm, memberEmail);
//...
//BoardService 클래스
public Board save(BoardForm boardForm, String memberEmail) {
Optional<Member> member = memberRepository.findByEmail(memberEmail);
return boardRepository.save(Board.builder()
//...
.member(member.get()).build());
}
3. @AthenticationPrincipal이용
spring security 3.2 부터 @AthenticationPrincipal을 이용해 인자에 현재 로그인한 사용자 객체를 주입할 수있다.
@Controller
@DeleteMapping("/blog/{id}")
public String deletePost(HttpServletRequest req,@PathVariable Long id, @AuthenticationPrincipal UserDetailsImpl userDetails) {
return postService.deletePost(req,id,userDetails);
}
@Service
public String deletePost(HttpServletRequest req,Long id,UserDetailsImpl userDetails){
Post post = findPost(id);
if(isToken(req)){
if(post.getWriterName().equals(userDetails.getUsername())) {
postRepository.delete(post);
return "삭제완료";
}
else {
throw new IllegalArgumentException("해당 권한이 없습니다.");
}
}
else{
throw new IllegalArgumentException("Token Error");
}
}