JAVA/Spring Security

[Spring Security] 폼 인증 예제 (1)

이준생 2021. 9. 10. 00:21
728x90
반응형
SMALL

 

 

웹 어플리케이션에서 폼 기반의 인증 및 인가 기능을 구현하고자 합니다.

 

현재는 에러 페이지 예외 처리를 하지 않았습니다! :-0

 

  • / : 로그인 하지 않고 접속하면 보이는 첫 번째 페이지 (왼쪽 위)
  • /info : 로그인 하지 않아도 접근 가능한 페이지 (오른쪽 위)
  • /dashboard : 로그인 해야만 볼 수 있는 페이지 (왼쪽 아래)
  • /admin : 로그인 한 특정 사용자만 접근 가능한 페이지 (오른쪽 아래)

 

하나하나 차례대로 구현해보도록 하겠습니다 🤓

 


각각의 화면을 구성하기 위한 html 파일은 우선 이렇게 간단히 구현되어 있습니다.

타임리프 (Thymeleaf) 를 뷰 템플릿으로 사용해서 간단하게 message를 노출해 주었습니다!

 

타임리프 (Thymeleaf)는 View Template Engine으로,

컨트롤러에서 전달 받은 데이터를 이용해 동적인 페이지를 만들 수 있습니다.

유지보수가 쉬운 템플릿 생성 방법을 제공하고, 실제로 템플릿에 영향을 주지 않는 (기존 HTML 코드를 변경하지 않고 덧붙이는) 방식을 사용합니다.

 

 

 

이제 화면에 데이터를 전달해줄 서버단 작업이 필요하겠죠?

SampleController를 아래와 같이 구현해 주었습니다!

 

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
32
33
34
35
36
37
38
39
40
package com.example.demospringsecurityform.form;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
 
import java.security.Principal;
 
@Controller
public class SampleController {
 
    @GetMapping("/")
    public String index(Model model, Principal principal) {
        if (principal == null) {
            model.addAttribute("message""Hello Spring Security");
        } else {
            model.addAttribute("message""Hello " + principal.getName());
        }
        return "index";
    }
 
    @GetMapping("/info")
    public String info(Model model) {
        model.addAttribute("message""Info");
        return "info";
    }
 
    @GetMapping("/dashboard")
    public String dashboard(Model model, Principal principal) {
        model.addAttribute("message""Hello " + principal.getName());
        return "dashboard";
    }
 
    @GetMapping("/admin")
    public String admin(Model model, Principal principal) {
        model.addAttribute("message""Hello Admin " + principal.getName());
        return "admin";
    }
}
 
cs

 

 

여기서 주목해야할 것은 아무래도 Principal 클래스겠죠?!

 

Principal은 스프링 시큐리티에서 제공하는 인터페이스로,

시스템을 사용하려고 하는 사용자, 디바이스 혹은 시스템을 통칭합니다.

 

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
package java.security;
 
import javax.security.auth.Subject;
 
public interface Principal {
 
 
    public boolean equals(Object another);
 
 
    public String toString();
 
 
    public int hashCode();
 
 
    public String getName();
 
 
    public default boolean implies(Subject subject) {
        if (subject == null)
            return false;
        return subject.getPrincipals().contains(this);
    }
}
cs

 

Principal 클래스를 열어보면 이렇게 생겼습니다!

 

동일한 사용자인지, 로그인한 유저의 이름은 무엇인지 등의 메소드로 구현되어 있네용.

 

 

위의 컨트롤러의 소스를 다시 보면,

index() 에서 principal의 null 여부에 따라 소스가 분기되어 있음을 확인하실 수 있습니다!

 

principal이 null이면 로그인을 하지 않은 유저라고 판단할 수 있습니다 😀

728x90
반응형
LIST