스프링 시큐리티 권한별 어노테이션 설정

Hwawon_2·2022년 5월 11일
0

스프링 시큐리티에서 자주 쓰는 표현식에 대해 보겠습니다.
조건식으로 사용하며 sec태그와 조합해 쓰는것이 특징입니다.

/secu/all의 주소로 접속했을때 이제 로그인 안한 사용자에게는 로그인창 링크를, 그리고 로그인한 사용자에게는 로그아웃 링크를 보여주도록 코드를 위와 같이 고칩니다.

실행해보면

로그인 한후

/secu/all 들어가면 로그아웃을 볼수있고
로그아웃된 상태로 들어가게 되면

로그인을 볼수 있다.
(sec:authorize 태그에 의해 조건식처럼 로그인한 사용자와 그렇지 않은 사용자가 보여지는 내용이 살짝 달라짐)

==
이제 자동로그인 기능을 구현해보겠습니다.
한 번 로그인하면 일정 시간동안 로그인로직 없이도 로그인유지가 되도록 만드는것으로 먼저 테이블을 추가합니다.
(아래 테이블 양식으로 만드는게 스프링시큐리티의 공식 문저 권장사항)

테이블이 새로 생성되었다면
security-context.xml을 위와 같이 수정해줍니다.
604800초 만큼 자동로그인이 유지되도록 해 주는것으로 설정은 자유

로그인 화면에 checkbox를 구현합니다.
name속성에는 remember-me를 주면 됩니다.
customLogin.jsp

로그인시 f12 -> application->storage에서 세션발급여부를 검사하면 JSESSIONID에 이어서 remeber-me라는 쿠키가 추가로 발급되는것을 볼 수 있습니다.


그리고 DB쪽의 persistent_logins 테이블을 조회해보면
특정 유저의 마지막 접속 시점이 기록으로 자동기록 됩니다.

브라우저를 다 껏다 켜도 로그인이 유지되는지
/secu/admindm으로 브라우저를 완전히 껏다가 접속해도 유지되면 성공.

==
로그아웃시 remember-me 쿠키를 파기해야 합니다.
security-context.xml에 위와 같이 추가합니다.

==
모든 주소를 하나하나 security-context.xml에 security-intercept-url태그를 추가해 시큐리티를 적용하는 것은 복잡하고 관리도 어려운 일입니다.

따라서 이제는 어노테이션으로 처리하는 방법에 대해 배워봅니다.

먼저 servlie-context.xml의Namespace탭에서 security를 체크해줍니다.

servlet-context.xml에도 역시 -5.0을 제거

제거가 완료 되었다면 security:global-method-security태그를 추가하고 아래 두속성을 모두 enabled로 고쳐줍니다.

이제 security-context.xml내부의 security:intercept-url을 주석처리하면 검증요건 없이 접속이 잘 되는걸 확인할 수 있습니다.

실행하면

멤버주소로 들어가지는걸 확인할 수 있습니다.

SecurityController로 와서, /member와 /admin 패턴에 위와 같이 @PreAuthorize 어노테이션과 표현식을 추가합니다.

실행해보면
/secu/member아까와 달리 로그인창이 뜨는걸 확인할수 있습니다.


로그인후 /secu/member 로 user0으로 들어가면 접근실패가 뜹니다.

/secu/all로 들어가면 접근이 허용되는걸 확인할 수 있습니다.

--
member페이지에 관리자페이지로 가기버튼을
관리자 한정으로 볼 수 있게 처리

실행하면
/secu/member
user0 pw0 로그인

/secu/member
user15 pw15 로그인

/secu/member
user22 pw22 로그인

관리자여서 멤버 주소로 접속했을시 관리자페이지로가기가 보인다.

==
회원가입
회원가입은 SecurityController에 /secu/join주소로 처리합니다. get방식으로 폼연결, post방식으로 가입처리를 합니다.
암호화를 위해 PasswordEncoder도 넣어준다.


join jspfile를 만들어주고

아이디, 비밀번호, 이름은 MemberVO 변수이름과 member_tbl
컬럼명을 감안해 name속성을 주고
권한은 여러개를 동시에 주기 위해 role이라는 이름으로 체크박스 처리합니다.
스프링 시큐리티 적용 프로젝트에서는 폼에 csrf토큰을 포함해 보내야 합니다.

실행해보면
/secu/join

가입하기를 누르면

profile
코딩 일기장

0개의 댓글