Spring.17_Spring Security_게시판

이혜민·2024년 9월 25일

spring

목록 보기
18/18
post-thumbnail

< 수업 순서 - 2024.09.25 >

01. 테이블 생성

  • create table security_board(num number primary key, writer varchar2(100)
    , subject varchar2(500), content varchar2(4000), regdate date);
  • create sequence security_board_seq;

02. SecurityBoard DTO 클래스

03. SecurityBoardMapper.xml

  • insert

  • update : 수정 사항은 제목, 내용 뿐

  • delete

  • selectByNum : 글번호로 행 하나 검색 - Security_user 테이블과 1:1 이너 조인

  • select total Count : 전체 행 검색 - 키워드(검색) 전달(동적SQL 사용)

  • select List : 전체 행 검색하여 페이징 처리 - 키워드, 페이징 정보 전달(동적SQL 사용)

04. SecurityBoardMapper 인터페이스

05. SecurityBoardDAO 인터페이스

06. SecurityBoardDAOImpl : SecurityBoardDAO 인터페이스 상속

  • 메소드 작성 : 매퍼 클래스에 있는 sql 명령 반환

07. SecurityBoardService 인터페이스

08. SecurityBoardServiceImpl : SecurityBoardService 인터페이스 상속

  • DAO 이용하여 실제로 일을 처리하는 역할(비지니스 로직 처리하는 역할)

09. SecurityBoardController : 요청 처리 메소드 작성

  • /list 페이지 요청 시 호출되는 메소드 - list()

  • GET 방식으로 /register 페이지 요청시 호출되는 메소드 - register()

  • POST 방식으로 /register 페이지 요청시 호출되는 메소드 - register() : 매개변수로 SecurityBoard 설정하여 subject, content, userid 받기

10. board_list.jsp

  • 게시글 리스트 출력 페이지

  • security 태그 라이브 추가하여 로그인 한 사용자만 글쓰기 버튼 활성화되게 작성

11. board_register.jsp

  • 게시글 작성 페이지

  • security 태그 라이브 추가하여 히든 타입으로 작성자 정보 저장 - authentication 객체의 principal 객체에 저장된 userid 전달

< 수업 순서 - 2024.09.26 >

⭐/register 페이지 요청을 로그인 사용자만 할 수 있게 설정

📍security-context.xml에 intercept-url 엘리먼트 사용하여 권한 처리

01. security-context.xml

  • intercept-url 엘리먼트 추가하여 로그인 사용자만 /board/register 페이지 요청할 수 있게 설정

  • 권한이 없어서 로그인 하지 않은 사용자가 /register에 접근하게 되면 로그인 페이지로 이동

📍요청 처리 메소드에 권한 관련 어노테이션을 이용해서 권한 처리

02. sevlet-context.xml

  • namespace 추가 : security - xsd

  • security:global-method-security : Controller 클래스의 요청 처리 메소드에 권한 관련 어노테이션을 제공하기 위한 엘리먼트

    • pre-post-annotations 속성 : 속성값을 enabled로 설정하면 @PreAuthorize 어노테이션 또는 @PostAuthorize을 사용할 수 있음 ↔ disabled
    • secured-annotations 속성 : 속성값을 enabled로 설정하면 @Secured 어노테이셔 사용 가능
  • @PreAuthorize : 요청 처리 메소드가 실행되기 전에 권한을 설정하기 위한 어노테이션

    • value 속성 : 권한(ROLE)을 속성값으로 설정 - SpEL 사용 가능
  • @PostAuthorize : 요청 처리 메소드가 실행되기 후에 권한을 설정하기 위한 어노테이션(일반적으로 잘 사용하지 않음)

  • @Secured : 요청 처리 메소드가 실행되기 전에 권한(ROLE)을 설정하지 위한 어노테이션 - SqEL 사용 불가능

03. SecurityBoardController

  • register() 메소드 : 어노테이션 사용하여 로그인 사용자만 요청할 수 있도록 권한 설정

04. board_list.jsp(수정) : 게시글 제목에 a 태그 추가

  • board_list.jsp에서 제목 click 시 detail() 메소드 요청 - 전달값 : num, pageNum, pageSize, column, keyword

05. SecurityBoardController

  • detail() 메소드 : 전달값(num, pageNum, pageSize, column, keyword) 가져오기 위해 매개변수로 map 설정, 뷰에 전달하기 위해 매개변수로 model 설정
    • 게시물 번호로 검색한 행을 "securityBoard"로 저장하여 model 객체에 삽입
    • num, pageNum, pageSize, column, keyword 전달값 저장되어 있는 map 객체 "searchMap"이라는 이름으로 model 객체에 삽입
    • board_detail 페이지 반환

04. board_detail.jsp

  • input 태그 hidden 타입으로 전달값 받기

  • 글변경, 글삭제 버튼은 관리자이거나 로그인 이용자가 글 작성자 일 때만 출력

  • 각 버튼 클릭시 이벤트 설정 - 각각의 페이지로 이동

05. SecurityBoardController

  • board_detail.jsp 페이지에서 글변경 버튼 클릭시 요청 하는 메소드 작성

  • /modify 페이지를 GET 방식 요청시 호출되는 메소드 - modify()

    • 로그인 사용자 중 관리자 또는 게시글 작성자인 경우에만 요청 처리 메소드를 호출할 수 있도록 권한 설정
    • num, pageNum, pageSize, column, keyword 전달값 받기 위해 map을 매개변수로 설정
    • 게시물 번호로 검색한 행을 "securityBoard"로 저장하여 model 객체에 삽입
    • num, pageNum, pageSize, column, keyword 전달값 저장되어 있는 map 객체 "searchMap"이라는 이름으로 model 객체에 삽입
    • board_modify 페이지 반환

06. board_modify.jsp - board_register.jsp와 유사

07. SecurityBoardController

  • board_modify.jsp 에서 글변경 클릭시 Post 방식으로 /modify 페이지 요청시 호출되는 메소드 - modify()

    • @ModelAttribute를 이용해 게시글을 전달받기 위해 SecurityBoard 객체를 매개변수로 설정
    • num, pageNum, pageSize, column, keyword를 전달받기 위해 map 객체를 매개변수로 설정
    • 변경된 제목과 내용을 board 객체에 변경
    • service 메소드 호출하여 수정 실행
    • map 객체에 의해 전달된 pageNum, pageSize, column, keyword 값을 각각의 변수에 저장
      • keyword는 post 방식으로 요청하면 유니코드로 전달되기 때문에 utf-8로 인코딩해줘야함, get방식은 괜찮음.
    • 리다이렉트로 detail 페이지 요청시 num, pageNum, pageSize, column, keyword 전달
  • board_detail.jsp에서 removeBtn 클릭시 remove 페이지 요청시 호출되는 메소드 - remove()

    • 로그인 사용자 중 관리자 또는 게시글 작성자인 경우에만 요청 처리 메소드를 호출할 수 있도록 권한 설정
    • 게시글 번호(num)으로 행을 검색하여 삭제 실행
    • writer 매개변수는 권한 설정 때문에 매개변수로 설정
    • 리다이렉트로 list페이지 반환

< ⭐댓글 작성 >

08. board_detail.jsp

  • 댓글 출력 div 작성- 로그인 사용자에게만 제공

09. security_reply 테이블 생성

  • create table security_reply(num number primary key, writer varchar2(100)
    , content varchar2(1000), regdate date, board_num number
    , constraint reply_board_num_fk foreign key(board_num) references security_board(num) on delete cascade);
  • create sequence security_reply_seq;
    • security_board와 security_reply 테이블 foreign key 조건 생성

10. SecurityReply DTO 테이블

11. SecurityReplyMapper.xml

  • insert 명령

  • selectList 명령

12. SecurityReplyMapper

13. SecurityReplyDAO

14. SecurityReplyDAOImpl

15. SecurityReplyService

16. SecurityReplyServiceImpl

  • DAO 객체 3개 사용
    • SecurityReplyDAO
    • SecurityBoardDAO
    • SecurityUserDAO

17. board_detail.jsp

  • replyListDisplay() 함수 생성 - ajax 이용

    • get 방식으로 list 페이지 요청 - url 주소로 게시글 번호 전달
    • result(list)가 0개면 "댓글이 없습니다." 출력
    • 댓글이 있을 땐 Array 객체가 갖고 이는 요소값(Odject 객체)을 div 태그에 반복 출력(.each)
  • 댓글을 쓰면 댓글을 테이블에 저장하기 위한 액션 작성

    • addBtn 클릭시 입력 태그에 작성된 writer(hidden), content값 저장
    • ajax 이용해 post 방식으로 reply/register 페이지 요청
    • 전달값은 json 형태의 문자열로 저장
    • 자바스크립트 오브젝트 객체를 문자열로 바꿔 저장 - Controller에서 RequestBody로 받아 reply 객체로 받아서 사용
    • post 방식이기 때문에 csrf 토큰 전달해줘야함
    • 결과를 받아서 함수 호출

18. SecurityReplyController

  • board_detail.jsp 에서 addBtn 버튼을 클릭시 Post 방식으로 요청되는 메소드 - register()

    • 로그인 사용자만 요청할 수 있도록 권한 처리
    • BindingResult 객체 : @Valid 어노테이션을 사용해 객체 필드값에 대한 검증시 문제가 발생될 경우 관련 에러를 저장하기 위한 객체 - Errors 객체의 자식 객체
    • 에러가 있다면 예외처리 없다면 service 객체에서 메소드 호출하여 "success" 텍스트 반환
  • board_detail.jsp에서 result가 "success"라면 replyListDisplay() 함수 실행
    → get 방식으로 list 페이지 요청할 때 호출되는 메소드 - list() 메소드

0개의 댓글