권한 부여 대 Spring Security의 역할

1. 개요

이 빠른 기사에서는 Spring Security에서 RoleGrantedAuthority 의 미묘하지만 중요한 차이점을 설명 합니다 . 역할 및 권한에 대한 자세한 내용은 여기 문서를 참조하십시오.

2. GrantedAuthority

Spring Security에서는 GrantedAuthority 를 개별 권한으로 생각할 수 있습니다 . 예는 수 READ_AUTHORITY , WRITE_PRIVILEGE , 또는 CAN_EXECUTE_AS_ROOT을 . 이해해야 할 중요한 것은 이름이 임의적이라는 것입니다 .

hasAuthority ( 'READ_AUTHORITY') 와 같은 표현식을 사용하는 것과 같이 GrantedAuthority를 직접 사용할 때 우리는 세분화 된 방식으로 액세스를 제한합니다 .

아마 모을 수 있듯이 특권 을 사용하여 권위 의 개념을 참조 할 수도 있습니다.

3. 권한 역할

마찬가지로 Spring Security에서는 역할을 문자열 로 표현되고 “ ROLE ” 접두사가 붙은 대략적인 GrantedAuthority 생각할 수 있습니다 . hasRole ( "ADMIN") 과 같은 표현식을 통해 역할을 직접 사용하는 경우 액세스를 대략적으로 제한합니다.

기본 " ROLE" 접두사는 구성 가능하지만이를 수행하는 방법에 대한 설명은이 문서의 범위를 벗어납니다.

이 둘의 핵심적인 차이점은 우리가 기능을 사용하는 방법에 연결하는 의미입니다. 프레임 워크의 경우 차이는 미미하며 기본적으로 정확히 동일한 방식으로 처리합니다.

4. 컨테이너 역할

이제 프레임 워크가 역할 개념을 사용하는 방법을 보았 으므로 권한 / 권한의 컨테이너로 역할을 사용 하는 대안에 대해서도 빠르게 논의하겠습니다 .

이것은 역할에 대한 더 높은 수준의 접근 방식으로 구현 중심의 개념이 아닌 비즈니스 지향적 인 개념으로 만듭니다.

Spring Security 프레임 워크는 개념을 어떻게 사용해야하는지에 대한 지침을 제공하지 않으므로 선택은 전적으로 구현에 따라 다릅니다.

5. 스프링 보안 구성

/ protectedbyauthority 에 대한 액세스를 READ_AUTHORITY 를 사용하는 사용자로 제한하여 세분화 된 권한 부여 요구 사항 을 보여줄 수 있습니다.

/ protectedbyrole 에 대한 액세스를 ROLE_USER 를 사용하는 사용자로 제한 하여 대략적인 권한 부여 요구 사항을 보여줄 수 있습니다 .

보안 구성에서 이러한 시나리오를 구성 해 보겠습니다.

@Override protected void configure(HttpSecurity http) throws Exception { // ... .antMatchers("/protectedbyrole").hasRole("USER") .antMatchers("/protectedbyauthority").hasAuthority("READ_PRIVILEGE") // ... }

6. 간단한 데이터 초기화

이제 핵심 개념을 더 잘 이해 했으므로 응용 프로그램이 시작될 때 설정 데이터를 만드는 방법에 대해 이야기하겠습니다.

물론 이것은 개발 중에 일부 예비 테스트 사용자와 함께 작업을 시작하는 매우 간단한 방법입니다. 프로덕션에서 데이터를 처리해야하는 방법이 아닙니다.

컨텍스트 새로 고침 이벤트를 수신 할 것입니다.

@Override @Transactional public void onApplicationEvent(ContextRefreshedEvent event) { MyPrivilege readPrivilege = createPrivilegeIfNotFound("READ_PRIVILEGE"); MyPrivilege writePrivilege = createPrivilegeIfNotFound("WRITE_PRIVILEGE"); }

여기서 실제 구현은 실제로 중요하지 않으며 일반적으로 사용중인 지속성 솔루션에 따라 다릅니다. 요점은 – 우리가 코드에서 사용하는 권한을 유지하고 있다는 것입니다.

7. UserDetailsService

UserDetailsService 의 구현은 권한 매핑이 이루어지는 곳 입니다. 사용자가 인증되면 getAuthorities () 메서드가 UserDetails 객체를 채우고 반환 합니다.

private Collection getAuthorities( Collection roles) { List authorities = new ArrayList(); for (Role role: roles) { authorities.add(new SimpleGrantedAuthority(role.getName())); role.getPrivileges().stream() .map(p -> new SimpleGrantedAuthority(p.getName())) .forEach(authorities::add); } return authorities; }

8. 예제 실행 및 테스트

GitHub 프로젝트에있는 예제 RolesAuthoritiesApplication Java 애플리케이션을 실행할 수 있습니다 .

역할 기반 인증이 작동하는지 확인하려면 다음을 수행해야합니다.

  • 액세스 // localhost : 8082 / protectedbyrole
  • [email protected] 로 인증 (비밀번호는 "user" )
  • 성공적인 승인 기록
  • 액세스 // localhost : 8082 / protectedbyauthority
  • 실패한 승인 기록

권한 기반 인증이 작동하는지 확인하려면 애플리케이션에서 로그 아웃 한 후 다음을 수행해야합니다.

  • 액세스 // localhost : 8082 / protectedbyauthority
  • [이메일 보호] / 관리자로 인증
  • 성공적인 승인 기록
  • 액세스 // localhsot : 8082 / protectedbyrole
  • 실패한 승인 기록

9. 결론

이 빠른 자습서에서는 Spring Security에서 역할GrantedAuthority 의 미묘하지만 중요한 차이점을 살펴 보았습니다 .