plugins {
id 'org.springframework.boot' version '2.5.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id 'war'
}
group = 'org.young'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
//추가한 부분
//mysql 드라이버
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.25'
//Thymeleaf 확장 플러그인은 화면을 제작할 때 스프링 시큐리티 객체들을 처리하는 용도이다.
implementation group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity5', version: '3.0.4.RELEASE'
implementation group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-java8time', version: '3.0.4.RELEASE'
//
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}
test {
useJUnitPlatform()
}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springsecurity?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
#서버 시작 시점에 DDL 문을 생성하여 DB에 적용한다
spring.jpa.hibernate.ddl-auto=update
#True로 하면 sql문을 보기 좋게 설정한다
spring.jpa.properties.hibernate.format_sql=true
#적용된 sql문을 보여준다.
spring.jpa.show-sql=true
#Thymeleaf 템플릿 캐싱 비활성화
#thymeleaf를 사용하다 수정 사항이 생길 대 수정을 하면
#재시작을 해줘야 한다. cache가 계속 쌓이기 때문이다.
#이를 방지하여 브라우저 새로고침만으로도 수정 사항을 확인하기 위해서 이것을 추가한다.
spring.thymeleaf.cache=false
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=/Users/YOUNJY/
spring.servlet.multipart.max-request-size=30MB
spring.servlet.multipart.max-file-size=10MB
#업데이트 실시간 반영
spring.devtools.livereload.enabled=true
#시큐리티와 관련된 부분은 좀 더 로그 레벨을 낮게 설정해서 자세한 로그를 확인할 수 있도록 한다.
logging.level.org.springframework.security.web=debug
logging.level.org.young.security=debug
import lombok.extern.log4j.Log4j2;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@Log4j2
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@Log4j2
@RequestMapping("/sample/")
//시큐리티와 관련된 설정이 정상적으로 돌아가는지 확인하기 위한 간단한 컨트롤러 구성
public class SampleController {
//로그인을 하지 않은 사용자도 접근할 수 있는 /sample/all
@GetMapping("/all")
public void exAll(){
log.info("exAll.........");
}
//로그인한 사용자만이 접근할 수 있는 '/sample/member'
@GetMapping("/member")
public void exMember(){
log.info("exMember.........");
}
//관리자(admin) 권한이 있는 사용자만이 접근할 수 있는 '/sample/admin'
@GetMapping("/admin")
public void exAdmin(){
log.info("exAdmin.........");
}
}
컨트롤러로 인한 페이지가 표시될 수 있도록 대응되는 html 파일을 구성합니다.
만들어진 각 파일은 간단히 해당 파일이 어떤 페이지인지를 구분할 수 있도록 표시하는 수준으로 코드를 작성합니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body>
<h1>For All</h1>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body>
<h1>For Member</h1>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body>
<h1>For Admin</h1>
</body>
</html>