1. JSP파일 작성 및 컨트롤러 작성
views폴더 하위에 users라는 폴더를 생성한 후 amdin, login, member파일 생성.
- admin - 관리자 권한이 있을 경우에만 접근가능 페이지
- login - 직접 커스텀할 로그인 페이지
- member - 멤버 권한(==로그인 한 일반 유저)이 있을 경우 접근 가능 페이지
- home - 모두 접근 가능
UserController클래스를 작성해주었음.
@RequestMapping("/users")
@Controller
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
@GetMapping("/login")
public void loginPage(String error, String logout, Model model) {
logger.info("로그인 페이지로 이동~");
logger.info("err :" + error );
logger.info("logout : " + logout );
if(error != null) {
model.addAttribute("error","로그인 실패");
}
if(logout != null) {
model.addAttribute("logout","로그아웃");
}
}
@PostMapping("/login-processing")
public void loginProcessing(String error) {
logger.info("login-processing!");
logger.info("err :" + error );
}
@GetMapping("/member")
public void doMember() {
logger.info("멤버로그인~");
}
@GetMapping("/admin")
public void doAdmin() {
logger.info("관리자로그인~");
}
}
2. 로그인 페이지 작성
method post지정 필수, action태그에 들어갈 값은 로그인 처리를 할 컨트롤러 url
일반적으로 생각하는 id가 username임 *변경하고 싶다면 security-context.xml에서 변경 가능
<!-- users/login.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>로그인 페이지 ㅎㅎ</h1>
<h1>Login Page</h1>
<h2>${error}</h2>
<h2>${logout}</h2>
<form action="${pageContext.request.contextPath}/users/login-processing" method="post">
<div> <input type="text" name="username" /> </div>
<div> <input type="password" name="password" /> </div>
<div> <input type="submit"/> </div>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
</body>
</html>
CSRF(Cross-site request forgery)?
사이트간 위조방지 목적으로 사용하는 토큰. 인증과는 다름.
서버에서 값을 전송할 때 임의의 토큰 즉 csrf를 생성해 보내 신뢰할 수 있는 값인지 판단.
csrf비활성화는 security-context.xml에서 설정할 수 있음.
<security:csrf disabled="true" />
+) 읽어보기
3. spring-security.xml 작성
이전에 최소한만 작성했던 파일을 전격 수정..
- pattern - 컨트롤러 url작성
- access - 접근 권한 설정
- login-page - 위에서 작성한 로그인 페이지 등록
- login-processing-url - 위에서 작성한 로그인 form의 action값. 컨트롤러 url
- security:user - 로그인 테스트를 진행하기 위해 임의로 등록한 유저들
- password - {noop}를 붙여야 함 (비밀번호 암호화 해제)
- authorities - 권한부여. 하나 이상의 권한 부여하기 가능
전체 코드
더보기
spring-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<security:http>
<security:intercept-url pattern="/" access="permitAll"/>
<security:intercept-url pattern="/users/member" access="hasRole('ROLE_MEMBER')"/>
<security:intercept-url pattern="/users/admin" access="hasRole('ROLE_ADMIN')"/>
<security:form-login login-page="/users/login"
login-processing-url="/users/login-processing" />
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="aaa" password="{noop}aaa" authorities="ROLE_MEMBER"/>
<security:user name="admin" password="{noop}admin" authorities="ROLE_MEMBER, ROLE_ADMIN"/>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
</beans>
4. 로그인 해보기
ROLE_MEMBER 로그인
users/member.jsp은 접근 가능하나 users/admin.jsp는 접근 불가
ROLE_ADMIN로그인(ROLE_MEMBER권한도 가지고 있는 계정)
모두 접근 가능
'STUDY > Spring' 카테고리의 다른 글
Spring | 스프링 시큐리티(Spring Security) (4) MyBatis이용 로그인 (1) | 2020.07.02 |
---|---|
Spring | 스프링 시큐리티(Spring Security) (3) JDBC 로그인 (3) | 2020.06.30 |
Spring | 스프링 시큐리티(Spring Security) (1) 세팅하기 (2) | 2020.06.26 |
Spring | log4j → log4j2로 변경하기 (CVE-2019-17571) (0) | 2020.06.25 |
Spring | MyBatis 연동 (2) (+ Oracle) (0) | 2020.06.24 |