✔ LoginController.java
package edu.global.ex.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import lombok.extern.slf4j.Slf4j; @Slf4j @Controller public class LoginController { @GetMapping("/login") public String login() { log.info("login() .."); return "login/login"; } }
✔ SecurityConfig.java
package edu.global.ex.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import edu.global.ex.security.CustomUserDetailsService; @Configuration // @Component + 의미(설정할수 있는 파일) @EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록됨 = 스프링 시큐리티를 작동 시키는 파일 이라는걸 알려줌 - 스프링 한테. public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomUserDetailsService customUserDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { // 우선 CSRF설정을 해제한다. // 초기 개발시만 해주는게 좋다. http.csrf().disable(); http.authorizeRequests().antMatchers("/user/**").hasAnyRole("USER") // /user/userHome 치고 들어오면 유저권한으로 로그인 창 띄움 .antMatchers("/admin/**").hasAnyRole("ADMIN") // /admin/adminHome 치고 들어오면 관리자권한으로 로그인 창 띄움 .antMatchers("/**").permitAll(); // 그 외로 치고 들어오면 권한 체크 없이 전부 허가 // http.formLogin(); // 스프링 시큐리티에 있는 기본 로그인 폼을 사용하겠다. http.formLogin() .loginPage("/login") // login할 때의 페이지 url 연결 .permitAll(); // 모든 유저가 로그인 화면을 볼 수 있게 한다. } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(customUserDetailsService).passwordEncoder(new BCryptPasswordEncoder()); // auth.inMemoryAuthentication() // .withUser("user").password("{noop}user").roles("USER").and() // .withUser("admin").password("{noop}admin").roles("ADMIN"); } }
✔ home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <!DOCTYPE html> <html lang="ko"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>메이페이지</title> </head> <body> <h1>메인페이지</h1> <sec:authorize access="isAnonymous()"> <p><a href="<c:url value="/login/loginForm" />">로그인</a></p> </sec:authorize> <sec:authorize access="isAuthenticated()"> <form:form action="${pageContext.request.contextPath}/logout" method="POST"> <input type="submit" value="로그아웃" /> </form:form> <p><a href="<c:url value="/loginInfo" />">로그인 정보 확인 방법3 가지</a></p> </sec:authorize> <h3> [<a href="<c:url value="/add/addForm" />">회원가입</a>] [<a href="<c:url value="/user/userHome" />">유저 홈</a>] [<a href="<c:url value="/admin/adminHome" />">관리자 홈</a>] </h3> </body> </html>
- 결과
✔ login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>로그인 페이지</title> </head> <body onload="document.f.id.focus();"> <h3>아이디와 비밀번호를 입력해주세요.</h3> <c:url value="/login" var="loginUrl" /> <p>${loginUrl}</p> <form:form name="f" action="${loginUrl}" method="POST"> <c:if test="${param.error != null}"> <p>아이디와 비밀번호가 잘못되었습니다.</p> </c:if> <c:if test="${param.logout != null}"> <p>로그아웃 하였습니다.</p> </c:if> <p> <label for="username">아이디</label> <input type="text" id="id" name="username" /> </p> <p> <label for="password">비밀번호</label> <input type="password" id="password" name="password"/> </p> <%-- <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> --%> <button type="submit" class="btn">로그인</button> </form:form> </body> </html>
- 결과
✔ userHome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%> <!DOCTYPE html> <html lang="ko"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>유저 페이지</title> </head> <body> <h1>유저 페이지 입니다.</h1> <p> principal: <sec:authentication property="principal" /> </p> <%-- <p>EmpVO: <sec:authentication property="principal.emp"/></p> <p>사용자이름: <sec:authentication property="principal.emp.ename"/></p> <p>사용자월급: <sec:authentication property="principal.emp.sal"/></p> <p>사용자입사일자: <sec:authentication property="principal.emp.hiredate"/></p> --%> <p> <a href="<c:url value="/" />">홈</a> </p> </body> </html>
- 결과
✔ adminHome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <!DOCTYPE html> <html lang="ko"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>관리자 홈</title> </head> <body> <h1>관리자 페이지 입니다.</h1> <h3>[<a href="<c:url value="/" />">홈</a>]</h3> </body> </html>
- 결과
🔊 login.jsp에서 name명을 새로 지정하고 싶을 때
🔊 SecurityConfig.java에서 설정해주기
<로그아웃 방식>
📂 프로젝트 관련
erd사용
1.테이블, 뷰, 컬럼을 비롯한 모든 식별자들은 소문자로 작성
2.복합어구에는 _를 사용하자
imgae_color
boards_id
3. 테이블명은 복수로 해주는 케이스가 많음
boards orders