로그인
이전 페이지
이전 페이지 내용에 이어서 진행합니다.
Code
Preview
1.
메인 화면
2.
로그인 화면
작업 프로세스
1.
프로젝트 생성
2.
스프링 시큐리티 설정
3.
요청 경로 매핑
Preview
1.
메인 화면
2.
로그인 화면
3.
메인 화면 (로그인 완료)
메인 화면
로그인 화면
메인 화면 (로그인 완료)
작업 프로세스
1.
프로젝트 생성
•
build.gradle•
spring boot version : 3.x.x
•
spring security version : 6.x.x
•
의존성 설정
◦
Spring Web
◦
Spring Boot DevTools
◦
Spring Security
◦
Lombok
◦
Thymeleaf
◦
MySQL Driver
◦
Mybatis Framework
2.
스프링 시큐리티 설정
•
~/config/SecurityConfig.java프로젝트 생성
build.gradle
spring boot 3.x.x
spring security 6.x.xplugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '3.5.9'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.aloha'
version = '0.0.1-SNAPSHOT'
description = 'Demo project for Spring Boot'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(23)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
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.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.5'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.5'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
Java
복사
스프링 시큐리티 설정
~/config/SecurityConfig.java
UserDetailsService - JDBC 인증방식 빈 등록
AuthenticationManager - 인증 관리자 빈 등록UserDetailsService 빈 등록
UserDetailsService 빈을 등록하여, 사용자 정보를 불러올 수 있는 SQL 쿼리를 설정해주어 인증 처리를 구현한다.
•
사용자 인증 쿼리•
사용자 권한 쿼리private final DataSource dataSource;
// @Autowired private DataSource dataSource;
@Bean
public UserDetailsService userDetailsService() {
JdbcUserDetailsManager userDetailsManager
= new JdbcUserDetailsManager(dataSource);
// 사용자 인증 쿼리
String sql1 = " SELECT username, password, enabled "
+ " FROM user "
+ " WHERE username = ? "
;
// 사용자 권한 쿼리
String sql2 = " SELECT username, auth "
+ " FROM user_auth "
+ " WHERE username = ? "
;
userDetailsManager.setUsersByUsernameQuery(sql1);
userDetailsManager.setAuthoritiesByUsernameQuery(sql2);
return userDetailsManager;
}
Java
복사
AuthenticationManager 빈 등록
/**
* 🍃 AuthenticationManager 인증 관리자 빈 등록
* @param authenticationConfiguration
* @return
* @throws Exception
*/
@Bean
public AuthenticationManager authenticationManager(
AuthenticationConfiguration authenticationConfiguration ) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
Java
복사
SecurityConfig.java
@Slf4j
@Configuration
@EnableWebSecurity // 스프링 시큐리티 설정 빈으로 등록
@RequiredArgsConstructor
public class SecurityConfig {
private final DataSource dataSource;
// @Autowired private DataSource dataSource;
/**
* 스프링 시큐리티 설정
* @param http
* @return
* @throws Exception
*/
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
log.info("스프링 시큐리티 설정");
// ✅ 인가 설정
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/**").permitAll() // 전체 허용
);
// 🔐 폼 로그인 설정
http.formLogin(login -> login.permitAll());
return http.build();
}
/**
* 🍃 암호화 방식 빈 등록
* @return
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* 🍃 JDBC 인증 방식 사용자정보 서비스 빈 등록
* @return
*/
@Bean
public UserDetailsService userDetailsService() {
JdbcUserDetailsManager userDetailsManager = new JdbcUserDetailsManager(dataSource);
// 사용자 인증 쿼리
String sql1 = " SELECT username, password, enabled "
+ " FROM user "
+ " WHERE username = ? "
;
// 사용자 권한 쿼리
String sql2 = " SELECT username, auth "
+ " FROM user_auth "
+ " WHERE username = ? "
;
userDetailsManager.setUsersByUsernameQuery(sql1);
userDetailsManager.setAuthoritiesByUsernameQuery(sql2);
return userDetailsManager;
}
/**
* 🍃 AuthenticationManager 인증 관리자 빈 등록
* @param authenticationConfiguration
* @return
* @throws Exception
*/
@Bean
public AuthenticationManager authenticationManager(
AuthenticationConfiguration authenticationConfiguration ) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
}
Java
복사
HomeController.java
@GetMapping("")
public String home(@AuthenticationPrincipal User authAuth, Model model) throws Exception {
log.info(":::::::::: 메인 화면 ::::::::::");
String username = authAuth.getUsername(); // 인증된 사용자 아이디
log.info("username : " + username);
Users user = userService.select(username); // 아이디로 회원 정보 조회
log.info("user : " + user);
model.addAttribute("user", user); // 모델에 사용자 객체 등록
return "index";
}
Java
복사
메인 화면에서 인증된 사용자 정보를 불러와서 출력해보겠습니다.
@AuthenticationPrincipal
현재 인증된 사용자의 정보를 주입받습니다.
org.springframework.security.core.userdetails.User 객체 정보로 인증된 사용자 정보을 가져온다.
메소드 | 설명 |
getUsername() | 인증된 사용자의 사용자명 (username) 아이디를 반환합니다. |
getPassword() | 인증된 사용자의 암호 (password)를 반환합니다. |
getAuthorities() | 사용자의 권한 목록을 반환합니다. GrantedAuthority 객체의 리스트를 반환합니다. |
isEnabled() | 사용자가 활성화 되어 있는지 여부를 반환합니다. (활성화되면 true, 비활성화되면 false) |
isAccountNonExpired() | 사용자의 계정이 만료되지 않았는지 여부를 반환합니다. (계정이 만료되지 않으면 true) |
isCredentialsNonExpired() | 사용자의 자격 증명(비밀번호 등)이 만료되지 않았는지 여부를 반환합니다. (비밀번호가 만료되지 않으면 true) |
isAccountNonLocked() | 사용자의 계정이 잠겨 있지 않은지 여부를 반환합니다. (잠기지 않으면 true) |










프로젝트 생성 (이전 페이지)