티스토리 뷰

이번 시간에는 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가 아래와 같이 출력됐다면 성공입니다.

 

감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함