diff --git a/build.gradle b/build.gradle index 42abff46..5c48fa98 100644 --- a/build.gradle +++ b/build.gradle @@ -27,9 +27,12 @@ jar { 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-validation' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-actuator' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' compileOnly 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' diff --git a/src/main/java/ac/knu/likeknu/config/SecurityConfiguration.java b/src/main/java/ac/knu/likeknu/config/SecurityConfiguration.java new file mode 100644 index 00000000..62647ee2 --- /dev/null +++ b/src/main/java/ac/knu/likeknu/config/SecurityConfiguration.java @@ -0,0 +1,51 @@ +package ac.knu.likeknu.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +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.configurers.AbstractHttpConfigurer; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class SecurityConfiguration { + + @Value("${admin.username}") + private String username; + @Value("${admin.password}") + private String password; + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + return http.authorizeHttpRequests(registry -> registry.requestMatchers("/api/**").permitAll() + .anyRequest().authenticated()) + .formLogin(security -> security.loginPage("/admin/login") + .defaultSuccessUrl("/admin/messages") + .permitAll()).csrf(AbstractHttpConfigurer::disable) + .build(); + } + + @Bean + public UserDetailsService userDetailsService() { + BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + UserDetails admin = User.withUsername(username) + .password(password) + .passwordEncoder(encoder::encode) + .roles("USER", "ADMIN") + .build(); + return new InMemoryUserDetailsManager(admin); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/src/main/java/ac/knu/likeknu/controller/AdminController.java b/src/main/java/ac/knu/likeknu/controller/AdminController.java new file mode 100644 index 00000000..aaba74d7 --- /dev/null +++ b/src/main/java/ac/knu/likeknu/controller/AdminController.java @@ -0,0 +1,21 @@ +package ac.knu.likeknu.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@RequestMapping("/admin") +@Controller +public class AdminController { + + @GetMapping("/login") + public String loginForm() { + return "login"; + } + + @GetMapping("/messages") + public String registerMessageForm(Model model) { + return "registerMessage"; + } +} diff --git a/src/main/java/ac/knu/likeknu/domain/value/CafeteriaName.java b/src/main/java/ac/knu/likeknu/domain/value/CafeteriaName.java index f8474861..b3cbd8a1 100644 --- a/src/main/java/ac/knu/likeknu/domain/value/CafeteriaName.java +++ b/src/main/java/ac/knu/likeknu/domain/value/CafeteriaName.java @@ -5,13 +5,13 @@ @Getter public enum CafeteriaName { - STUDENT_CAFETERIA("학생식당", 1), - DORMITORY("생활관식당", 2), + STUDENT_CAFETERIA("학생식당", 10), + DORMITORY("생활관식당", 20), EMPLOYEE_CAFETERIA("직원식당", 3), - SODAM("소담", 4), - NEULSOM("늘솜", 5), - EUNHAENGSA_VISION("은행사/비전", 6), - DREAM("드림", 7); + SODAM("소담", 40), + NEULSOM("늘솜", 50), + EUNHAENGSA_VISION("은행사/비전", 1), + DREAM("드림", 2); private final String cafeteriaName; private final int sequence; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 91cbb157..257b3064 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,5 +1 @@ -spring.datasource.url=jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_SCHEMA}?characterEncoding=UTF-8&serverTimezone=UTC -spring.datasource.username=${DB_USERNAME} -spring.datasource.password=${DB_PASSWORD} - -spring.jpa.hibernate.ddl-auto=validate +spring.profiles.active=dev \ No newline at end of file diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 00000000..2a776b69 --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,132 @@ + + + + + + 로그인 + + + + +
+
+ +

공주대처럼 관리자 로그인

+
+ + +
+
+ + +
+ +

© 공주대처럼

+
+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/registerMessage.html b/src/main/resources/templates/registerMessage.html new file mode 100644 index 00000000..5042b36d --- /dev/null +++ b/src/main/resources/templates/registerMessage.html @@ -0,0 +1,87 @@ + + + + + + 공주대처럼 관리자 + + + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+

+
+ + + + + + + + + + + + + + + + + + + +
ID알림 요약알림 내용알림 시간
+ 삭제 +
+
+ + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/test.json b/src/main/resources/templates/test.json deleted file mode 100644 index 65943623..00000000 --- a/src/main/resources/templates/test.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "timeStamp": "2023-10-09T01:07:05.4169157", - "message": null, - "data": { - "body": [ - { - "origin": "공주대", - "destination": "터미널", - "departureStop": "공주대공과대학 정류장 출발", - "buses": [ - { - "arrivalId": 1, - "busNumber": "110", - "remainingTime": "곧 도착", - "busColor": "FFFFFF" - }, - { - "arrivalId": 2, - "busNumber": "140", - "remainingTime": "13분 뒤", - "busColor": "000000" - } - ] - }, - ... - ] - } -} \ No newline at end of file