Spring5 Security 기초 템플릿
이 문서는 Spring5 Security 기초 템플릿에 대한 것이다. Spring5 에 Spring-Security 를 이용해 기초적인 로그인을 구현 했다. Session 은 InMemory 가 아닌 WAS 서버에 세션을 저장한다. 로그인 정보는 spring-security.xml 에 정의된 것을 그대로 사용했다. 그야말로 기초적인 내용만 담았다.
이 템플릿이 동작하기 위한 조건은 다음과 같다.
- Java 1.8 기반.
- 데이터베이스가 연결되어 있어야 한다. 데이터베이스는 MySQL 이다.
- WAS 서버에 JNDI 를 연결된다.
- users 테이블이 필요한데, user.sql 파일에 내용이 있다.
- spring security 의 Role 기반 권한 접근 제어.
- context root 는 malluser 이다.
작동방식
권한을 체크하기 때문에 로그인 화면이 먼저 나온다. 권한 체크는 다음과 같이 Controller 에서 이루어진다.
1 2 3 4 5 6 7 8 9 10 11 |
// HomeController.java @Slf4j @Controller @PreAuthorize("hasRole('ROLE_USER')") public class HomeController { @Autowired private UsersService userService; @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { |
ROLE_USER 권한을 가지고 있다면 초기화면에 접근이 가능하며 그렇지 않다면 로그인 화면으로 돌아가게 된다.
1 2 3 4 5 6 7 |
<http> <intercept-url pattern="/**" access="hasRole('USER')" /> <form-login /> <logout /> <csrf /> </http> |
인증을 위한 정보는 다음과 같이 구현 됐다.
1 2 3 4 5 6 7 8 9 10 11 |
<authentication-manager> <authentication-provider> <user-service> <!-- Password is prefixed with {noop} to indicate to DelegatingPasswordEncoder that NoOpPasswordEncoder should be used. This is not safe for production, but makes reading in samples easier. Normally passwords should be hashed using BCrypt --> <user name="jimi" password="{noop}jimispassword" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="bob" password="{noop}bobspassword" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager> |
{noop} 은 암화화 되지 않는 text 기반의 암호을 말하는 것이며 위 설정은 외부 정보 저장소를 이용하지 않는 것이다.
로그인을 하면 다음과 같은 화면이 나온다.
LOGOUT 버튼은 다음과 JSP 에서 Security tags 를 이용해 구현 했다.
1 2 3 4 5 6 7 8 |
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <sec:authorize access="isAuthenticated()"> <form action="<c:url value="/logout"/>" method="POST"> <sec:csrfInput /> <button type="submit">LOGOUT</button> </form> </sec:authorize> |
Eclipse 에서 제작되었다.