티스토리 뷰
[MSA] Spring Cloud로 개발하는 E-commerce 마이크로 서비스 어플리케이션(User Service) - 4 -
박강균 IT 2022. 4. 18. 14:34이번 시간에는 Spring Security를 활용해서
Authentication + Authorization 기능을 UserService에 적용시킬거에요.
크게 6단계를 거쳐서 해당기능을 활성화시킬거에요 그 단계는 다음과 같아요
- Step 1: 어플리케이션에 Spring Security jar를 Dependency에 추가
- Step 2: WebSecurityConfigurerAdapter를 상속받는 Security Configuration 클래스 생성
- Step 3: Security Configuration 클래스에 @EnableWebSecurity 추가
- Step 4: Authentication -> configure(AuthenticationManagerBuilder auth) 메서드 재정의
- Step 5: Password encode를 위한 BCryptPasswordEncoder 빈 정의
- Step 6: Authorization -> configure(HttpSecurity http) 메서드를 재정의
그럼 실제로 작성을 해볼게요.
# pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
먼저 Step1에서 언급한 것과 같이 위와같은 Dependency를 추가해줄게요.
# WebSecurity클래스 생성
이제 Security와 관련된 기능을 활성화시키기 위해서 WebSecurity 클래스를 만들거에요. 저는 security패키지를 생성해서 그 안에 WebSecurity라는 클래스를 생성했습니다.
# WebSecurity클래스 작성
WebSecurity 코드는 다음과 같이 작성해줍시다. WebSecurityConfigurerAdapter라는 클래스를
상속 받고 configure를 Override해 다음과 같이 작성해 줍니다. 그럼 /users로 들어오는 모든 요청은
보안이 승인이 됩니다.
package com.example.userservice.security;
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.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests().antMatchers("/users/**").permitAll();
http.headers().frameOptions().disable();
}
}
#UserServiceImpl
BCryptPasswordEncoder는 자동으로 Password를 암호화 시켜줍니다.
이를 활용하기 위해서 Autowired를 통해서 BCryptPasswordEncoder를 활성화 시킨 뒤
기존에 Encrytpted_pwd를 설정하는 곳에서 다음과 같이 작성해줍니다.
userEntity.setEncryptedPwd(passwordEncoder.encode(userDto.getPwd()));
아래는 전체코드에요!
package com.example.userservice.serviceimpl;
import com.example.userservice.dto.UserDto;
import com.example.userservice.jpa.UserEntity;
import com.example.userservice.jpa.UserRepository;
import com.example.userservice.service.UserService;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.UUID;
@Service
public class UserServiceImpl implements UserService {
UserRepository userRepository;
BCryptPasswordEncoder passwordEncoder;
@Autowired
public UserServiceImpl(UserRepository userRepository,BCryptPasswordEncoder passwordEncoder){
this.userRepository = userRepository;
this.passwordEncoder = passwordEncoder;
}
@Override
public UserDto createUser(UserDto userDto) {
userDto.setUserId(UUID.randomUUID().toString());
ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
UserEntity userEntity = mapper.map(userDto,UserEntity.class);
userEntity.setEncryptedPwd(passwordEncoder.encode(userDto.getPwd()));
userRepository.save(userEntity);
UserDto returnUserDto = mapper.map(userEntity, UserDto.class);
return returnUserDto;
}
}
하지만 이렇게 되면 스프링이 시작안됩니다. 그렇기 때문에 Application에서
BCryptPasswordEncoder를 Bean으로 등록해줍니다. 아래과 같이요!
@UserserviceApplication
package com.example.userservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@SpringBootApplication
@EnableEurekaClient
public class UserserviceApplication {
public static void main(String[] args) {
SpringApplication.run(UserserviceApplication.class, args);
}
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
최종적으로 POST-MAN과 크롬으로 확인해보면 다음과 같은 결과가 나옵니다.
기존에는 Encyptd_pwd는 변조되었단 말만 텍스트로 출력이 됐다면, 이제는 완벽하게 암호화가 되어 출력됩니다.
아래와 같이 Encrypted_pwd가 아래와 같이 출력됐다면 성공입니다.
감사합니다.
'웹 프로그래밍 > MSA 학개론' 카테고리의 다른 글
- Total
- Today
- Yesterday
- springcloud
- github
- elasticSearch
- producer
- Gateway
- MariaDB
- 운동일기
- Feign
- prometheus
- zipkin
- 루틴기록
- 빅-오
- Logstash to ElasticSearch
- Logstash 활용
- 미래의나에게동기부여
- MSA
- JWT
- rabbitmq
- ACTUATOR
- git
- 오늘저녁 삼겹살
- consumer
- Kafka Connect
- config
- kafka
- docker
- 운동
- UserService
- Spring + ELK
- LoadBalancer
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |