spring security - 2 (controller, login)

2021. 9. 16. 16:49(구)공부/Spring

728x90

지난번에는 pattern에 url 형식을 줘서 접근 제한을 설정했지만 컨트롤러에서도 가능

 

@PreAuthorize("hasAuthority('admin')")
@RequestMapping(value="/admin")
@Controller
public class AdminController {
}

이런 식으로 컨트롤러에 권한 제한을 둘 수 있음

	@Secured({"admin"}) 
	@RequestMapping(value = "test", method = RequestMethod.GET)
	public String test(Locale locale, Model model) {
   	}

이런 식으로 메소드 별로도 가능

 

스프링 시큐리티는 /login 이라는 로그인 페이지를 자체 제공하나 시큐리티 콘텍스트xml에서 별도의 로그인 페이지를 사용하겠다고 선언했음.

로그인 기능 자체는 시큐리티를 활용하기 위해

				<form id="contact-form" class="contact-form col-lg-8 mx-lg-auto"
					method="post" action="/login">

form의 action을 /login으로 하여 시큐리티를 활용

 

 

그리고 csrf 보안 기능을 켜놨기 때문에

<%@ taglib prefix="sec"
uri="http://www.springframework.org/security/tags"%>  를 작성하여 스프링 시큐리티 태그를 활성화하고

					<!-- csrf 방지 토큰 -->
					<sec:csrfInput/>

을 폼 안에 입력해 줘야한다. 토큰 값을 value로 갖는 _csrf name의 input이 생김.

 

로그인은 UserDetailsService를 통해 수행되는데 db와 대조하여 진행할 것이므로 UserDetailsService를 implements 한 CustomUserDetailsService 를 사용할 것이라고 시큐리티 콘텍스트에 이미 선언 해둠.


public class CustomUserDetailsService implements UserDetailsService {
	
	private static final Logger logger = LoggerFactory.getLogger(CustomUserDetailsService.class);
	
	@Inject
	UserServiceImpl userService;

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		// TODO Auto-generated method stub
		
		logger.warn("load user by userName : "+username);
		UserDto dto = userService.findById(username);
		logger.warn(dto.toString());
	
		return dto == null ? null : new UserForSecurity(dto);
	}
}

UserForSecurity 는 시큐리티의 User 클래스를 extends 하여 만든 클래스로 이 또한 시큐리티에 포함된 클래스이다.

db에서 가져온 auth라는 이름의 권한을 추출하여 User 클래스를 만들어 준다.

public class UserForSecurity extends User{

	private static final long serialVersionUID = 1L;
	private UserDto user;
	

	public UserForSecurity(String username, String password, Collection<? extends GrantedAuthority> authorities) {
		super(username, password, authorities);
		// TODO Auto-generated constructor stub
	}
	
	public UserForSecurity(UserDto dto) {
		super(dto.getId(), dto.getPass(), new ArrayList<SimpleGrantedAuthority>()
			{
				{
					add(new SimpleGrantedAuthority(String.valueOf(dto.getAuth())));
				}
			}
		);

		this.user = dto;
	}
	
	public UserDto getUserDto() {
		return user;
	}

}

또한 시큐리티는 비밀번호 암호화를 사용하도록 되어 있는데 이 또한 콘텍스트에 BcryptPasswordEncoder를 상속 받은 bcryptPasswordEncoder 클래스를 이용하겠다고 선언 되어 있다.

이걸 사용하면 db에 패스워드가 저장 될 때 암호화 되어 db를 켜봐도 비밀번호를 알 수 없음

 

728x90

'(구)공부 > Spring' 카테고리의 다른 글

spring security - 1 (pom, context, web) xml 설정  (0) 2021.09.13
에러페이지  (0) 2021.09.07
Spring 유효성 검사 - hibernate  (0) 2021.08.24
파일 업로드  (0) 2021.08.16
lombok  (0) 2021.08.04