source

스프링 보안 부서의 "주임"은 무엇입니까?

factcode 2023. 4. 29. 09:55
반응형

스프링 보안 부서의 "주임"은 무엇입니까?

저는 봄과 봄 보안이 정말 처음입니다.Spring Security에 대해 읽고 있었는데 현재 로그인한 사용자여야 하는 주체 개념이 나왔습니다.하지만 현재 로그에 기록된 사용자가 둘 이상 있는 경우에는 어떻게 해야 합니까?그래서, 제 질문은, 봄 보안에서 교장선생님은 정확히 무엇인가요?

예를 들어 이 튜토리얼을 읽었습니다.

http://www.mkyong.com/spring-security/get-current-logged-in-username-in-spring-security/

그리고 그들은 현재 로그에 기록된 사용자가 한 명뿐이라는 점을 고려한 것으로 보이며, 이는 자주 있는 일이 아닙니다.

특정 사용자를 검색하려면 어떻게 해야 합니까?그리고 요청을 수행하는 사용자를 어떻게 구별합니까?

주체는 현재 로그인한 사용자입니다.그러나 현재 스레드에 바인딩된 보안 컨텍스트를 통해 검색하므로 현재 요청 및 해당 세션에도 바인딩됩니다.

SecurityContextHolder.getContext()내부적으로 전류를 얻습니다.SecurityContext를 통한 구현ThreadLocal변수.요청은 단일 스레드에 바인딩되므로 현재 요청의 컨텍스트를 얻을 수 있습니다.

단순화하기 위해 보안 컨텍스트가 세션에 있으며 사용자/주체 및 역할/권한이 포함되어 있다고 할 수 있습니다.

특정 사용자를 검색하려면 어떻게 해야 합니까?

넌 아냐.모든 API는 현재 요청의 사용자 및 세션에 액세스할 수 있도록 설계되었습니다.사용자 A가 현재 인증된 100명의 사용자 중 하나가 되도록 합니다.A에서 서버에 대해 요청을 실행하면 해당 요청을 처리하기 위해 하나의 스레드를 할당합니다.만약 그렇다면,SecurityContextHolder.getContext().getAuthentication()당신은 이 스레드의 맥락에서 그렇게 합니다.기본적으로 해당 스레드 내에서 다른 스레드에 의해 처리되는 사용자 B의 컨텍스트에 액세스할 수 없습니다.

그리고 요청을 수행하는 사용자를 어떻게 구별합니까?

그럴 필요는 없습니다. 이것이 서블릿 컨테이너가 사용자에게 제공하는 기능입니다.

교장의 간략한 정의:

주체는 사용자의 ID를 나타냅니다.

단순 수준의 사용자 이름을 가진 String 개체이거나 복잡한 UserDetails 개체일 수 있습니다.

Principal은 Java SE 6의 오래된 인터페이스입니다.

기본 구현이 없는 모든 인터페이스는 해당 인터페이스를 구현할 클래스에서 구현해야 하는 가지 메서드를 간단히 정의합니다.

그 방법들은

boolean  equals(Object another)
          Compares this principal to the specified object.

String   getName()
          Returns the name of this principal.

int      hashCode()
          Returns a hashcode for this principal.

String   toString()
          Returns a string representation of this principal.

Java Doc에 명시된 바와 같이:

이 인터페이스는 개인, 회사로그인 ID와 같은 모든 엔티티를 나타내는사용할 수 있는 주체의 추상적인 개념을 나타냅니다.

간단히 말해, 구현자가 엔티티를 다른 엔티티 간에 고유하게 구분하는 방식으로 이 인터페이스를 구현해야 하기 때문에 사용됩니다. 한또.getName()하나의 특정 엔터티가 고유하게 식별되고 다른 엔터티와 충돌하지 않는 값을 반환해야 합니다.그래서 만약에Principal은 사되는것유은형니다입용입니다.UserDetails 다음에 그음에다.getName()Principal을 합니다.UserNameUserDetails.

Spring이 사용하는 구현을 보면,AbstractAuthenticationToken.class:

public String getName() {
        if (this.getPrincipal() instanceof UserDetails) {
            return ((UserDetails)this.getPrincipal()).getUsername();
        } else if (this.getPrincipal() instanceof AuthenticatedPrincipal) {
            return ((AuthenticatedPrincipal)this.getPrincipal()).getName();
        } else if (this.getPrincipal() instanceof Principal) {
            return ((Principal)this.getPrincipal()).getName();
        } else {
            return this.getPrincipal() == null ? "" : this.getPrincipal().toString();
        }
    }

또한 다음과 같이 언급하는 것이 중요합니다.

abstract class AbstractAuthenticationToken implements Authentication그리고.

interface Authentication extends Principal

Principal가 또한인스구현가자를 합니다.equals()그리고.hashCode()조직이나 회사 또는 개인을 대표하는 주체의 주체는 다른 주체와 비교되는 방법이 있어야 하기 때문에 매우 타당합니다.

언급URL : https://stackoverflow.com/questions/37499307/whats-the-principal-in-spring-security

반응형