Old Branch

스프링 부트(Spring Boot) + 시큐리티 (Spring Security) 기본인증

woolbro 2019. 9. 19. 10:39
반응형

안녕하세요! 이번 포스팅에서는 스프링 부트 (Spring Boot)와 스프링 시큐리티(Spring Security)를 사용한 기본인증 절차에 대해서 알아보려고 합니다.

 

스프링을 접하고 공부하다 보니, 로그인 관리를 기본적으로 제공하는 Maven dependency가 있었습니다

 

한번 사용해 보도록 하겠습니다.

 

이번 포스팅의 소스코드 또한 Github 저장소에 올라가있습니다.  <--클릭

 


1. Maven Dependency

스프링 부트(Spring Boot) 어플리케이션에서 사용할 기능들을 설치 해 주려고 합니다. 

이번에는 간단하게 인증에 대해서만 알아 볼 것이기 때문에, "Security"를 꼭 추가 해 주어야 합니다.

아래는 저의 이번 프로젝트의 pom.xml 구성입니다.

 

pom.xml 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.8.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.woolbro</groupId>
	<artifactId>woolbro_spring_Security</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>woolbro_spring_Security</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web-services</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 

 

2. WebSecurityConfigurerAdapter 구성

스프링 부트(Spring Boot)에서 인증 및 권한부여, 즉 스프링 시큐리티 (Spring Security)를 활성화 하기 위해서 SecurityConfig 클래스를 구성하고, WebSecuirtyConfigurerAdapter를 상속받아 구현 하도록 하겠습니다. 이 클래스 내부에서 구성 된 URL에 사용자가 접근 하기 전에, 인증을 요구하게 됩니다.

 

아래의 Config파일을 보면, configureGlobal이라는 메서드에 아이디와 비밀번호를 적었습니다.

ID : woolbro

password: {noop}woolbro

 

여기서, noop는 Spring Security에서 텍스트 그대로 비밀번호로 인식하게 해줍니다.

noop을 붙이지 않으면 다른 인코딩으로 암호화를 해 주어야 합니다

 

ScurityConfig.java

package com.woolbro.config;

import org.springframework.beans.factory.annotation.Autowired;
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.WebSecurityConfigurerAdapter;

@Configuration // 스프링에게, 이 클래스는 환경구성 설정파일임을 알려준
public class SecuirtyConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		// TODO Auto-generated method stub
		http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
	}
	
	@Autowired
	public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{
		auth.inMemoryAuthentication().withUser("woolbro").password("{noop}woolbro").roles("USER");
	}
	
}

 

3.Controller 작성

이제 접근을 할 MainController를 작성 해 주도록 하겠습니다.

 

MainController.java

package com.woolbro.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.woolbro.dao.WoolbroDAO;
import com.woolbro.model.Employees;

@RestController
@RequestMapping(path = "/woolbro")
public class MainController {

	@Autowired
	private WoolbroDAO dao;
	
	@GetMapping(path="/", produces="application/json")
	public Employees getEmployees() {
		return dao.getAllEmployees();
	}
}

 

 

4. DAO, Model 작성

보여줄 데이터를 담을 WoolbroDAO.java, Employee.java, Employees.java를 작성했습니다

 

Employee.java

package com.woolbro.model;

public class Employee {

	public Employee() {

	}

	public Employee(Integer id, String firstName, String lastName, String email) {
		super();
		this.id = id;
		this.firstName = firstName;
		this.lastName = lastName;
		this.email = email;
	}

	private Integer id;
	private String firstName;
	private String lastName;
	private String email;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public String toString() {
		return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
	}
}

 

Employees.java

package com.woolbro.model;

import java.util.ArrayList;
import java.util.List;

public class Employees {
	private List<Employee> employeeList;

	public List<Employee> getEmployeeList() {
		if (employeeList == null) {
			employeeList = new ArrayList<>();
		}
		return employeeList;
	}

	public void setEmployeeList(List<Employee> employeeList) {
		this.employeeList = employeeList;
	}
}

 

WoolbroDAO.java

package com.woolbro.dao;

import org.springframework.stereotype.Repository;

import com.woolbro.model.Employee;
import com.woolbro.model.Employees;

@Repository
public class WoolbroDAO {
	private static Employees list = new Employees();

	static {
		list.getEmployeeList().add(new Employee(1, "Lokesh", "Gupta", "howtodoinjava@gmail.com"));
		list.getEmployeeList().add(new Employee(2, "Alex", "Kolenchiskey", "abc@gmail.com"));
		list.getEmployeeList().add(new Employee(3, "David", "Kameron", "titanic@gmail.com"));
	}

	public Employees getAllEmployees() {
		return list;
	}

	public void addEmployee(Employee employee) {
		list.getEmployeeList().add(employee);
	}
}

 

 

5. 결과를 확인 할 Postman  사용

REST-API를 사용하여 인증을 확인하도록 하겠습니다.

postman이 편해서 저는 postman을 사용하여 헤더와 reuquest 코드를 확인하겠습니다.

 

기본적으로 MainController에서 설정한 woolbro/페이지에 접근해 보도록 하겠습니다.

 

localhost:8080/woolbro/ 에 접근한 아래 화면입니다.

 

 

위의 Send 버튼을 눌렀을 때 나오는 결과화면을 보면,

{
    "timestamp": "2019-09-19T01:20:08.505+0000",
    "status": 401,
    "error": "Unauthorized",
    "message": "Unauthorized",
    "path": "/woolbro/"
}

와 같은 코드를 볼 수 있습니다.

 

인증되지 않았다는 결과입니다.

 

위에서 설정 해 준 ID와 PW로 권한을 주고 다시 전송을 해 보도록 하겠습니다.

 

 

 Type을 Basic Auth로 주고, username과 password를 입력했습니다. 

 

결과가 잘 나오네요 :)