일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- I'm fine thank you
- 악보
- oracle
- 개발자
- 천공의 시간
- Inside Of Me
- nginx
- 레이디스코드
- SQL 처리
- DBMS
- 오라클
- index
- 기타
- 봄 사랑 벚꽃 말고
- 슬픔의 후에
- 말 더듬
- 니가 참 좋아
- 스위트라떼
- 신입
- 아이유
- IT
- 장범준
- 인덱스
- 데이터베이스
- 6학년 8반 1분단
- DBMS 구성요소
- db
- 핑거스타일
- 러블리즈
- 오라클 아키텍처
취미로 음악을 하는 개발자
[Spring Boot] Security Taglibs, Database 본문
스프링 부트는 기본적으로 JSP를 지원하지 않기 때문에 JSP에서 사용할 taglibs는 수작업으로 추가해야 함.
이전 게시글에서 사용한 프로젝트를 그대로 사용하되 build.gradle과 몇 개의 jsp파일만 수정한다.
코드 구현
// build.gradle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | plugins { id 'org.springframework.boot' version '2.1.7.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' id 'java' id 'war' } group = 'com.study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } ext['tomcat.version'] = '8.5.38' dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' 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' implementation 'javax.servlet:jstl' implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'org.springframework.security:spring-security-taglibs' } | cs |
이전 프로젝트에서 위에 빨간 글씨로 된 부분을 추가해준다.
그 후에 Refresh Gradle Project로 적용시켜준다.
// welcome2, 3 welcome3은 아래 부분에서 "Member"를 "Admin"으로 바꿔주기만 하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %> <!DOCTYPE html> <html> <head> <meta http-equiv="content-Type" content="text/html; charset=UTF-8"> <title>Welcome</title> </head> <body> welcome : Member <hr> <%-- <c:if test="${not empty pageContext.request.userPrincipal }"> <p> is Log-In </p> </c:if> <c:if test="${empty pageContext.request.userPrincipal }"> <p> is Log-Out </p> </c:if> --%> <sec:authorize access="isAuthenticated()"> <p> Log-In</p> </sec:authorize> <sec:authorize access="!isAuthenticated()"> <p> Log-Out</p> </sec:authorize> <%-- USER ID : ${pageContext.request.userPrincipal.name } <br /> --%> USER ID : <sec:authentication property="name"/><br/> <c:url value="/logout" var="logoutUrl" /> <a href="/logout">Log Out</a> <br /> </body> </html> | cs |
[24, 28번 줄]
isAuthenticated는 인증을 받았는지, !isAuthenticated는 인증을 받지 못했는지에 대한 것이다.
[33번 줄]
"name"이라는 속성을 가진 값을 받는다.
<%-- --%> 부분과 바뀐 부분을 비교하면서 봤는데 코드만 봐도 더 간결해져서 더불어 생산성도 높여주는 것처럼 보인다.
스프링 시큐리티 암호화 클래스 종류
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
: 스프링 시큐리티에서 기본적으로 사용하는 암호화 방식으로 암호화가 될 때마다 새로운 값 생성.
따라서 임의적인 값을 추가해서 암호화할 필요가 없다.
org.springframework.security.crypto.password.StandardPasswordEncoder
: SHA-256 암호화 사용
org.springframework.security.crypto.password.NoOpPasswordEncoder
: 원래 패스워드를 암호화하지 않고 컴파일을 하면 에러가 발생하는데 이 클래스를 사용하면 에러가 발생하지 않고 컴파일이 됨.
스프링 시큐리티에서는 신규로 개발하는 시스템이라면 BCryptPasswordEncoder 클래스를 사용하는 bcrypt 해시 알고리즘 사용을 권장하고 있고,
기존 SHA 해시 알고리즘을 적용한 상황이라면 StandardPasswordEncoder 사용을 권장하고 있다.
프로젝트 생성
코드 구현
* 수정된 코드만 올린 것이므로, 나머지 코드는 이전 프로젝트에서 그대로 복사한다.
// build.gradle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | plugins { id 'org.springframework.boot' version '2.1.7.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' id 'java' id 'war' } group = 'com.study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } ext['tomcat.version'] = '8.5.38' dependencies { implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'mysql:mysql-connector-java' 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' implementation 'org.springframework.security:spring-security-taglibs' implementation 'javax.servlet:jstl' implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' } | cs |
jdbc가 추가되어서 자신에게 맞는 데이터베이스를 사용하면된다. (필자는 mysql)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | package com.study.springboot.auth; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; 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 org.springframework.security.web.authentication.AuthenticationFailureHandler; @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter{ @Autowired public AuthenticationFailureHandler authenticationFailureHandler; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/").permitAll() .antMatchers("/css/**", "/js/**", "/img/**").permitAll() .antMatchers("/guest/**").permitAll() .antMatchers("/member/**").hasAnyRole("USER", "ADMIN") .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated(); http.formLogin() .loginPage("/loginForm") // default : /login .loginProcessingUrl("/j_spring_security_check") //.failureUrl("/loginForm?error") // default : /login?error //.defaultSuccessUrl("/") .failureHandler(authenticationFailureHandler) .usernameParameter("j_username")// default : j_username .passwordParameter("j_password")// default : j_password .permitAll(); http.logout() .logoutUrl("/logout") // default .logoutSuccessUrl("/") .permitAll(); // ssl을 사용하지 않으면 true로 사용 http.csrf().disable(); } // @Autowired // public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { // auth.inMemoryAuthentication() // .withUser("user").password(passwordEncoder().encode("1234")).roles("USER") // .and() // .withUser("admin").password(passwordEncoder().encode("1234")).roles("ADMIN"); // // ROLE_ADMIN 에서 ROLE_는 자동으로 붙음 // } @Autowired private DataSource dataSource; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { System.out.println(passwordEncoder().encode("123")); auth.jdbcAuthentication() .dataSource(dataSource) .usersByUsernameQuery("select name as userName, password, enabled" + " from user_list where name = ?") .authoritiesByUsernameQuery("select name as userName, authority " + " from user_list where name= ?") .passwordEncoder(new BCryptPasswordEncoder()); } @Bean public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } | cs |
[59~72번 줄]
데이터베이스 연동을 위해 dataSource를 선언하고 Autowired 처리를 해준다.
그리고 의존 주입을 받은 configure에서 dataSource를 변수로 받게 하고 select 문을 통해 활성화된 아이디인지 아닌지를 찾는다.
그 후에 해당하는 유저의 Role을 찾고 passwordEncoder로 패스워드를 암호화하게 된다.
이 때, 64번 줄의 코드로 만들어진 암호화된 패스워드가 출력 창에 뜰 것인데 그것을 새로운 패스워드로 데이터베이스를 업데이트 시킨다. 그리고 다시 64번 줄의 코드를 지워준다.
필자는 아래와 같은 패스워드를 얻었다.
$2a$10$k9LW/CGd35d/.nqLAeJWr.DLRYPyW5ueg83E8TL5SmoooAVGVC8Di
그리고 user_list의 패스워드들을 암호화된 패스워드로 바꿔준다.
결과 화면
'공대인 > Spring[Boot]' 카테고리의 다른 글
[Spring Boot] 외부 jar 사용하기 (FileUpload, Json) (2) | 2019.08.29 |
---|---|
[Spring Boot] Webjars (0) | 2019.08.29 |
[Spring Boot] Security Form, Status Check (0) | 2019.08.24 |
[Spring Boot] Security (0) | 2019.08.22 |
[Spring Boot] Transaction (Manager, Template, Propagation) (0) | 2019.08.22 |