source

역할과 부여된 역할의 차이스프링 보안 기관

factcode 2022. 8. 13. 12:07
반응형

역할과 부여된 역할의 차이스프링 보안 기관

보안에는 보안과 개념과 .GrantedAuthority액세스 허가/제어 권한을 취득하기 위한 인터페이스입니다.

createSubUsersdeleteAccounts 등의 허용 가능한 조작에 대해 관리자(역할 포함)에게 허용하고 싶다.ROLE_ADMIN

온라인으로 표시되는 튜토리얼/데모를 보니 혼란스러워지고 있습니다.저는 제가 읽은 것을 연결하려고 노력하지만, 이 둘을 서로 바꿔서 다루는 것 같아요.

, 그렇군요.hasRoleGrantedAuthority?? 내가해.나는 분명히 그것을 잘못 이해하고 있다.스프링 시큐리티 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★?

사용자의 역할을 해당 역할의 권한과 별도로 저장하려면 어떻게 해야 합니까?

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.org.springframework.security.core.userdetails.UserDetails는 인증 참조되며, 이 는 DAO를 합니다.DAOUser으로 부여됨(★★★★★

public User(String username, 
            String password, 
            boolean enabled, 
            boolean accountNonExpired,
            boolean credentialsNonExpired, 
            boolean accountNonLocked, 
            Collection<? extends GrantedAuthority> authorities)

아니면 다른 두 가지를 구분할 수 있는 다른 방법이 있을까요?아니면 지원이 안 돼서 직접 만들어야 하나요?

'을 '라고 .허가' 또는 '권리'로서의 권한.허락」, 「허락」)로 표현됩니다.getAuthority() 가 어떤 것에대한 할 수 있도록 .이러한 문자열은 권한을 식별하고 유권자가 무언가에 대한 액세스 권한을 부여할지 여부를 결정할 수 있도록 합니다.

다른 부여를 부여할 수 있습니다.사용자를 보안 컨텍스트에 배치하여 사용자에게 권한(권한)을 부여합니다.보통 필요한 Granted를 반환하는 UserDetails 구현을 반환하는 UserDetails Service를 구현함으로써 이 작업을 수행합니다.당국.

예에서 은됨(Granted)임을 "일 뿐입니다. 「」로 .ROLE_더 이상 없습니다.은 그냥 역할일 뿐이다.역할이 함께 있는 보입니다.ROLE_서 "RoleVoter" 프리픽스는 "RoleVoter" 프리픽스입니다.ROLE_됩니다. 하면 역할 역할 이름을 할 수 .ROLE_security 4 이 '취급이 가 많았습니다(들어 Spring security 4에서는 알 있습니다).hasAuthority()보안에서의 메서드ExpressionRoot - 단순히 호출하는 경우hasRole()되고 "을 다루는(Spring Security 4와 "롤"을 취급합니다RoleVoter , . . . . . . . .hasRole 등은 항상 표현 등을 합니다.ROLE_프레픽스를 입력합니다. ★★★★★★★★★★★★★★★★★.hasAuthority('ROLE_ADMIN')hasRole('ADMIN') 이유는ROLE_프리픽스가 자동으로 추가됩니다.상세한 것에 대하여는, Spring Security 3~4 의 이행 가이드를 참조해 주세요.

여전히,은 단지 을 가진 일 뿐이다: but is은 but but but but but but but but but but but but but but but but but but but but but but 。ROLE_ in 보안 3 So Spring 3 3@PreAuthorize("hasRole('ROLE_XYZ')") is is is is is와 @PreAuthorize("hasAuthority('ROLE_XYZ')") 4 봄에4 。@PreAuthorize("hasRole('XYZ')") is is is is is와 @PreAuthorize("hasAuthority('ROLE_XYZ')").

사용 사례에 대해:

사용자에게는 역할이 있으며 특정 작업을 수행할 수 있는 역할이 있습니다.

★★★★★★★★★★★★★★★★★★★★★★★★★.GrantedAuthorities사용자가 속한 역할과 역할이 수행할 수 있는 작업에 대해 설명합니다.GrantedAuthorities.ROLE_.OP_로는 .영음음음음음음음음음음음음음음 . .를 들 수 OP_DELETE_ACCOUNT,OP_CREATE_USER,OP_RUN_BATCH_JOB은 기기로 할 수 . 을 사용하다ROLE_ADMIN,ROLE_USER,ROLE_OWNERsyslog.

보면 될 도 있어요.GrantedAuthority다음 예시와 같습니다.

@Entity
class Role implements GrantedAuthority {
    @Id
    private String id;

    @ManyToMany
    private final List<Operation> allowedOperations = new ArrayList<>();

    @Override
    public String getAuthority() {
        return id;
    }

    public Collection<GrantedAuthority> getAllowedOperations() {
        return allowedOperations;
    }
}

@Entity
class User {
    @Id
    private String id;

    @ManyToMany
    private final List<Role> roles = new ArrayList<>();

    public Collection<Role> getRoles() {
        return roles;
    }
}

@Entity
class Operation implements GrantedAuthority {
    @Id
    private String id;

    @Override
    public String getAuthority() {
        return id;
    }
}

및 ID가 .권한의 대표(예:ROLE_ADMIN,OP_DELETE_ACCOUNTetc.되면 모든 가 설정되어 합니다.조작의 권한은 UserDetails.getUserDetails.get에서 됩니다.Authorities() 。

: :가 「」인 .ROLE_ADMINOP_DELETE_ACCOUNT,OP_READ_ACCOUNT,OP_RUN_BATCH_JOB할당되어 있습니다.를 사용자 ROLE_USEROP_READ_ACCOUNT.

보안 [는 [Granted]으로 됩니다. 한::ROLE_ADMIN,OP_DELETE_ACCOUNT,OP_READ_ACCOUNT,OP_RUN_BATCH_JOB

과 같이.ROLE_USER,OP_READ_ACCOUNT

User Details Service는 모든 역할과 해당 역할의 모든 작업을 수집하여 get 메서드로 사용할 수 있도록 합니다.반환된 UserDetails 인스턴스의 Authority().

AFAIK 인정스프링 보안에서는 권한과 역할이 동일합니다.허가받은권한의 취득Authority() 문자열은 역할입니다(기본 구현 SimpleGranted에 따름).권한).

이 경우 계층적 역할을 사용할 수 있습니다.

<bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
    <constructor-arg ref="roleHierarchy" />
</bean>
<bean id="roleHierarchy"
        class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
    <property name="hierarchy">
        <value>
            ROLE_ADMIN > ROLE_createSubUsers
            ROLE_ADMIN > ROLE_deleteAccounts 
            ROLE_USER > ROLE_viewAccounts
        </value>
    </property>
</bean>

네가 찾는 바로는 아니지만 그게 도움이 되길 바라

편집: 코멘트에 회신합니다.

역할은 봄철 보안의 허가와 같다.intercept-url을 hasRole과 함께 사용하면 어떤 역할/권한이 허용되는지 매우 세밀하게 제어할 수 있습니다.

어플리케이션에서는 view_account, delete_account, add_account 등의 각 조작(또는 rest url)에 대한 권한(역할)을 정의합니다.그런 다음 admin, guest_user, normal_user 등의 사용자별로 논리 프로파일을 만듭니다.프로파일은 스프링 보안과는 무관한 권한의 논리적인 그룹화일 뿐입니다.새 사용자가 추가되면 프로필이 할당됩니다(모든 허용 권한이 있음).사용자가 어떤 액션을 수행하려고 하면 해당 액션에 대한 권한/역할이 부여된 사용자에 대해 체크됩니다.당국.

또한 defaultn RoleVoter는 프리픽스 ROLE_을 사용하기 때문에 ROLE_로 시작하는 모든 권한이 역할로 간주됩니다.이 기본 동작을 변경하려면 역할 유권자의 커스텀 RolePrefix를 사용하여 봄 보안에서 사용합니다.

이러한 개념 간의 관계를 이해하는 또 다른 방법은 ROLE을 권한 컨테이너로 해석하는 것입니다.

당국은 특정 액션을 특정 데이터 범위 또는 컨텍스트와 결합하는 것을 목표로 하는 세분화된 권한입니다.예를 들어, 읽기, 쓰기, 관리는 주어진 정보 범위에 대한 다양한 수준의 권한을 나타낼 수 있습니다.

또한 요청 처리 흐름의 깊은 부분에서 권한이 강제되는 반면 ROLE은 컨트롤러에 도달하기 전에 요청 필터 방식으로 필터링됩니다.베스트 프랙티스는 비즈니스 계층에서 컨트롤러를 경유하여 권한의 실행을 규정합니다.

반면 ROLE은 권한 세트를 대략적으로 나타냅니다.ROLE_READER는 읽기 권한 또는 보기 권한만 가지며 ROLE_EDITOR는 읽기 권한과 쓰기 권한을 모두 가집니다.역할은 주로 요청 처리의 외부(http.... . antMatcher (...).hasRole (ROLE_MANAGER) 등)에서 첫 번째 스크리닝에 사용됩니다.

요청 프로세스 흐름의 깊은 곳에서 시행되는 권한에 따라 권한을 보다 세밀하게 적용할 수 있습니다.예를 들어, 사용자는 리소스를 처음 수준화할 수 있는 읽기 쓰기 권한을 가지고 있지만 하위 리소스에 대한 읽기 권한만 가질 수 있습니다.ROLE_READER가 있으면 이 리소스를 편집하기 위해 쓰기 권한이 필요하지만 @PreAuthorize 가로채기는 서브 리소스를 편집하기 위해 임시 리소스를 차단할 수 있으므로 첫 번째 수준의 리소스를 편집할 수 있는 권한이 제한됩니다.

제이크.

다른 사람들이 언급했듯이, 저는 역할을 보다 세분화된 권한을 위한 컨테이너로 생각합니다.

그러나 계층 역할 구현에는 이러한 세분화된 권한에 대한 세밀한 제어가 부족하다는 것을 알게 되었습니다.
그래서 저는 관계를 관리하고 보안 컨텍스트에서 권한을 부여받은 권한으로 권한을 주입하기 위해 라이브러리를 만들었습니다.

앱에 CREATE, READ, UPDATE, DELETE 등의 권한 세트가 있을 수 있습니다.이러한 권한은 사용자의 역할과 관련되어 있습니다.

또는 READ_와 같은 보다 구체적인 권한POST, 읽기_PUBLISHED_POST, CREATE_POST, PUBLISH_POST

이러한 권한은 비교적 정적이지만 역할과 역할의 관계는 동적일 수 있습니다.

예 -

@Autowired 
RolePermissionsRepository repository;

public void setup(){
  String roleName = "ROLE_ADMIN";
  List<String> permissions = new ArrayList<String>();
  permissions.add("CREATE");
  permissions.add("READ");
  permissions.add("UPDATE");
  permissions.add("DELETE");
  repository.save(new RolePermissions(roleName, permissions));
}

API를 생성하여 이러한 권한과 역할의 관계를 관리할 수 있습니다.

다른 답변을 복사/붙여넣고 싶지 않습니다.SOO를 사용하다.
https://stackoverflow.com/a/60251931/1308685https.com/a/60251931/1308685

레포담없없기기!
https://github.com/savantly-net/spring-role-permissionshttpsgithub.com/savantly-net/

언급URL : https://stackoverflow.com/questions/19525380/difference-between-role-and-grantedauthority-in-spring-security

반응형