스프링 시큐리티에서도 인증과 권한에 대한 구조
-Authenticaiton Manager라는 곳에서 인증을 담당
-ProviderManager라는 곳에서는 인증에 대한 처리를
AuthenticationProvider라는 타입의 객체를 이용하여 처리를 위임한다.
- AuthenticaionProvider를
직접 구현하는 방식 / 실제 처리를 담당하는 UserDetailsService를 구현하는 방식으로 나누어집니다.(대부분 UserDetailsService를 구현 )
security-context.xml을 추가한다.
Spring Bean Configuration File을 선택하고 xml파일을 만든다.
security-context.xml에 intercept를 만들어 해당 경로와 접근권한을 설정
(/sample/member라는 경로는 ROLE_MEMBER 라는 권한이 있는 사용자만 들어갈수 있게 설정하였다.ROLE_MEMEBER = >ID가 MEMEBER PWD도 MEMEBER인 사용자로 설정하였다.)또한 spring 5부터는 반드시 패스워드에 대한 인코딩 처리인 PasswordEncoder의 지정이 필요하다 .
인코딩 처리 없이 진행하고 싶다면 {noop}를 사용한다.
<security:http>
<security:intercept-url pattern="/sample/all" access="permitAll"/><security:intercept-url pattern="/sample/member" access="hasRole('ROLE_MEMBER')"/><security:form-login/>
</security:http>
<security:authentication-manager>
<security:authentication-provider> <security:user-service>
<security:user name="member" password="{noop}member" authorities="ROLE_MEMBER"/>
</security:user-service> </security:authentication-provider>
</security:authentication-manager>
접근 제한에 대한 오류처리 (security-context.xml에서 security:http에 security:access-denied-handler를 작성 )
<security:http><security:intercept-url pattern="/sample/all" access="permitAll"/><security:intercept-url pattern="/sample/member" access="hasRole('ROLE_MEMBER')"/><security:form-login/><security:access-denied-handler error-page="/accessError"/></security:http>...
로그인 페이지를 직접 구현하여 적용할수도 있다 .
<!-- <security:form-login/>-->
<!-- spring security에서 제공하는 login 기본 페이지 --><security:form-login login-page="/customLogin"/>
<!-- 직접 지정 가능 -->
customLogin에 대한 컨트롤러 지정
@GetMapping("/customLogin")public void loginInput(String error, String logout, Model model){if(error!=null){model.addAttribute("error","login error has account");}if(logout!=null){model.addAttribute("logout","Logout!!");}}
customLogin 화면 구현
<form action="/login" method="post"><div><input type="text" name="username" value="admin"></div><div><input type="password" name="password" value="admin"></div><div><input type="submit"></div><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"></form>
CSRF : Cross-site request forgery의 약자로 타사이트에서 본인의 사이트로 form 데이터를 사용하여 공격하려고 할 때, 그걸 방지하기 위해 csrf 토큰 값을 사용하는 것이다.
<security:http>
<!-- <security:form-loginusername-parameter="loginId"password-parameter="loginPwd"login-page="/customLogin"/> 직접 지정 가능 -->
</seucrity:http>
로그아웃 처리
security-context.xml 에서
<security:logout logout-url="/customLogout" invalidate-session="true" logout-success-url="/sample/chat"/>
logout에 대한 코드를 작성한다. 해당 logout이 발생하면 /customLogout이 발생 했을시 진행되고 성공시 /sample/chat으로 넘겨 다시 로그인 을 하도록 지정
controller
@GetMapping("/customLogout")public void logoutGET() {log.info("custom logout");}
해당되는 jsp 에서 로그아웃이 진행되면 url을 /customLogout으로 넘기면 적용이 된다. (이때 로그인과 마찬가지로 csrf 토큰 방식도 같이 로그아웃 처리한다. )
<form action="/customLogout" method="post"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"><input type="submit" id="exit" value="퇴장" /></form>