Search
Duplicate
moon
sun

로그인

로그인

📕 Spring Security 6

이전 페이지

💡
이전 페이지 내용에 이어서 진행합니다.

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.x
plugins { 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

1️⃣ UserDetailsService - JDBC 인증방식 빈 등록
2️⃣ AuthenticationManager - 인증 관리자 빈 등록
( PasswordEncoder 빈 등록은 회원 가입 에서 등록함 )

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)

다음 주제