티스토리 뷰

지난번에는 Spring Boot Security 시작부터 해서 Customizing을 위한 User 생성과 UserMapper 생성까지 했습니다.

일단 User는 이러이러한 필드가 필요하다, 그리고 이것들은 이러한 쿼리로 조회가 가능하다 정도까지 했습니다.

그러면 이번에는 Spring Security에서 실제로 User를 조회하는데 이용하는 UserService를 만들어보고, Config를 통해 Customzing Login을 만들어 보겠습니다.

1. 우선 UserService 인터페이스를 만듭니다. UserService 인터페이스는 UserDetailsService 인터페이스를 상속 받아야 합니다. 이유는 UserDetailsService를 구현해야만 Spring Security에서 정상적으로 조회를 할 수 있기 때문입니다.
package com.cusonar.example.user.service;

import java.util.Collection;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetailsService;

public interface UserService extends UserDetailsService {
     Collection<GrantedAuthority> getAuthorities(String username);
}
     . 권한을 받아오는 메소드를 추가했습니다.
     . 향후 유저 등록이라든지, 수정, 삭제 Service들을 추가하면 됩니다.

2. UserService를 구현한 UserServiceImpl을 생성합니다.
package com.cusonar.example.user.service;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import com.cusonar.example.user.domain.User;
import com.cusonar.example.user.mapper.UserMapper;

@Service
public class UserServiceImpl implements UserService {
    
     @Autowired UserMapper userMapper;

     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
          User user = userMapper.readUser(username);
          user.setAuthorities(getAuthorities(username));
         
          return user;
     }
    
     public Collection<GrantedAuthority> getAuthorities(String username) {
          List<String> string_authorities = userMapper.readAuthority(username);
          List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
          for (String authority : string_authorities) {
               authorities.add(new SimpleGrantedAuthority(authority));
          }
          return authorities;
     }
}
     . UserService를 implemets 하게 되면 loadUserByUsername 메소드를 반드시 구현해야 합니다. 이 메소드는 UserDetailsService에 정의된 메소드로 실제 Spring security에서 User 정보를 읽을 때 사용됩니다.
     . User를 읽어왔으면 권한을 부여해줍니다. getAuthorities 메소드를 이용해서 권한을 부여한뒤 리턴 해줍니다. 권한은 MyBatis를 통해 String을 가져왔으므로 GrantedAuthority 인터페이스에 맞게 SimpleGrantedAuthority로 변환해서 리스트를 만든 후 리턴해줍니다.

3. com.cusonar.example.config 패키지를 만들고 SecurityConfig 클래스를 만듭니다.
package com.cusonar.example.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;

import com.cusonar.example.user.service.UserService;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
     @Autowired UserService userService;
     
     @Override
     protected void configure(HttpSecurity http) throws Exception {
          http
               .csrf().disable()
               .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
               .formLogin();
     }


     @Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
          auth.userDetailsService(userService);
     }
}
     . WebSecurityConfigureAdapter는 기본적인 웹 인증에 대한 부분을 구현해놓은 클래스입니다. 해당 클래스를 상속 받은 뒤에 수정이 필요한 것만 override 해줍니다.
     . 위에서 @Service 로 정의한 userService를 Autowired 해주고, AuthenticationManagerBuilder에 해당 Bean을 주입해줍니다. (customizing 한 UserService 적용)
     . csrf().disable() : 이건 csrf(Cross Site Request Forgery)를 기본적으로 요청하는데, 이것을 하기 위해서는 따로 처리하는게 필요하므로 일단은 disable 처리합니다.
     . authorizeRequests() : 요청에 대해서 권한 처리를 하는데
     . anyRequest().authenticated() : 어떠한 요청에라도 인증을 요구한다. (영어 그대로 읽으시면 됩니다.)
     . and().formLogin() : 그리고 Form을 이용한 로그인을 사용한다.

4. 매번 /cusonar로 접속하기 귀찮으실테니 HomeController에 경로 하나를 추가합니다.
package com.cusonar.example.home.controller;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cusonar.example.home.domain.Home;
import com.cusonar.example.home.mapper.HomeMapper;

@RestController
public class HomeController {
	@Autowired HomeMapper homeMapper;
	
	@RequestMapping("/")
	public String home() {
		return "Hello World!";
	}
	
	@RequestMapping("/{name}")
	public Home home(@PathVariable String name) {
		Home home = homeMapper.readHome(name);          
		return home;
	}
}

 
5. 그리고 http://localhost:8080/ 으로 접속합니다. 로그인창이 나타나고 거기에 DB상에 입력한 ID/PW를 입력하면 정상적으로 Hello World!를 보실 수 있습니다.

여기까지 DB/MyBatis를 활용한 customizing된 Login을 살펴봤습니다. 어때요? 참 쉽죠?
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함