스프링 시큐리티 기초1(디폴트 폼 등)

Hwawon_2·2022년 5월 5일
0

security-context에
Authentcation Manager(인증매니저)를 추가해줍니다.

(beans Graph에 들어가보면 구조가 엄청 많은걸 확인할 수 있음)

서버를 돌려 에러가 나는지 안나는지 확인을 해 보겠습니다.

서버 실행 후 에러가 나지 않는것을 확인했다면
SecurityController를 추가 해주고 url 세팅을 하겠습니다.

권한에 따라 접속할 수 있는 형태를 차등으로 두기 위해서
비회원, 회원, 운영자 3단계로 나눠서 접속 주소를 컨트롤러에 세팅합니다.

views 아래에 설정한 주소에 맞는 .jsp파일 3개를 만들어주신 다음 접속이 잘 되는지 확인 해보겠습니다.


(all, member도 접속이 잘됨)

연결이 완료 되었다면 이제 필터와 스프링 시큐리티의 역할에 대해 보겠습니다.
기본적으로로는 접속요청을 스프링 시큐리티가 가로채서 확인을 한 다음 진행시킬지 말지를 결정시킨다는 것 입니다.
(어떤한 요청이 와도 시큐리티를 거치고 지나감)

이를 위해 security-context 내부에 어떤 url 접속을 가로챌지, 그리고 접근에 따른 처리를 어떻게 할지 세팅해야 합니다.
security:http 내부에 security:intercept-url을 먼저 지정할 수 있고 pattern에 접근 패턴을, access에는 권한이 부여된 사용자를 처리할 때는 위와 같이 hasRole('ROLE_직접부여권한명')을 적습니다.

실행해보면
all로 들어갔을때

http://localhost:8181/secu/member
로 들어가면

로그인 창으로 넘어가는것을 확인할 수 있습니다.
(로그인이 안됐다면 폼로그인으로 )

/secu/member는 접속이 안 되는것을 볼 수 있습니다.
MEMBER 권한을 부여받은 사용자가 로그인한 경우만 접근 가능하기 때문 입니다.
(위의 로그인창은 우리가 만든것이 아닌 스프링 시큐리티가 임시로 생성하는 로그인 창 입니다. (나중에 커스터마이징하겠습니다 .))

이제 로그인이 가능한 아이디 하나를 security-context.xml에 부여해 보겠습니다.
이러면 동작 여부를 db를 거치지 않고도 임시로 확인 가능합니다.
아이디 비밀번호는 name,password에 각각 member로
권한은 authorities에 "ROLE_MEMBER"를 줍니다.

실행해보면
http://localhost:8181/secu/member

member로 로그인 했을시

500에러가 납니다. 그러면 성공!
(500이 뜨는 이유는 암호화를 안해났기 때문)
스프링 시큐리티에서는 스프링 5버전부턴느 반드시 비밀번호를 암호화해서 처리하도록 강제됩니다.
우리는 암호화 설정을 하지 않았기 때문에, 우선 암호화 이전에 로그인만 테스트하기 위해 비밀번호 앞에 "{noop}"을 추가해 암호화 기능을 꺼둡니다.

실행해보면
http://localhost:8181/secu/member

member로 로그인 했을시

member페이지로 들어가지는걸 확인할 수 있습니다.

로그인을 풀고싶다면 f12->application->stroage->cookies 우클릭후 쿠키를 전부 삭제해주면 로그인이 풀립니다.

다음으로
admin 권한을 처리하겠습니다.
admin은 member,admin에 모두 접속 가능하게 두 권한을 나열합니다.

실행해보면
http://localhost:8181/secu/admin
admin으로 로그인


로그아웃 하고
http://localhost:8181/secu/member
admin으로 로그인


admin계정으로 member주소에 접속이 가능한걸 확인 할 수 있다.

==커스텀 에러페이지
admin주소에 member계정으로 접속을하면
403에러가 뜹니다.

이제 톰캣 에러 페이지가 아닌 다른 화면을 처리해 보겠습니다.

접근 제한 페이지는 (에러페이지)
security-context.xml 상단의 security:http 태그 내부를 위와 같이 고칩니다.
접근 주소는 /accessError이외에 다른 주소를 넣으면 작동하지 않습니다.

CommomComtroller를 만들어서

접근주소 /accessError를 처리하도록 세팅합니다.

views 폴더에 accessError.jsp를 생성해주고

에러 메세지를 출력하도록 코드를 작성해보겠습니다.

실행해보면
admin주소에 member 계정으로 접속을 하면

에러가 뜨는걸 확인할 수 있습니다.

==
스프링 시큐리티에서 제공하는 기본 에러 페이지 처리 방식이고 커스터마이징을 할 경우는 AccessDeniedHandler 인터페이스를 직접 오버라이딩해 구현해야 합니다.
대신 오버라이딩을 하는 만큼 세팅된 동작에 추가로직을 작성할 수 있습니다. 먼저 com.ict.security 패키지를 만들고 AccessDeniedHandler구현할 CustomAccessDeniedHandler를 만듭니다.


이제 디폴트 AccessDeniedHandler를 사용하는 대신
커스텀 핸들러를 쓰도록 security-context.xml을 위와 같이 수정합니다.
security:http내부 속성도 모두 삭제해 디폴트 설정을 못쓰게 만들어주세요.
beans graph에도 추가되어있는지 학인해주세요
(스프링 시큐리티는 계층 구조가 매우 복잡하니 주의)


실행하면

콘솔창에 이전과 달리 먼저 CustomAccessDEniedHandler를 처리는 내요의 로그가 뜬다면 제대로 연동된것

profile
코딩 일기장

0개의 댓글