programing

여러 역할을 확인하는 데 사용하는 방법은 무엇입니까?

closeapi 2023. 8. 14. 22:52
반응형

여러 역할을 확인하는 데 사용하는 방법은 무엇입니까?

Spring Security JSP 태그립을 사용하여 역할을 기준으로 일부 콘텐츠를 조건부로 표시하려고 합니다.그러나 Spring Security 3.1.x에서는 하나의 역할만 확인합니다.

AllGranted가 사용되지 않는 경우 사용할 수 있습니다.

도와드릴까요?

스프링 보안에는 특별한 보안 표현이 있습니다.

hasAnyRole(역할 목록) - 사용자에게 지정된 역할(쉼표로 구분된 문자열 목록으로 제공됨)이 부여된 경우 true입니다.

저는 그것을 사용해 본 적이 없지만 당신이 찾고 있는 것이 바로 그것이라고 생각합니다.

사용 예:

<security:authorize access="hasAnyRole('ADMIN', 'DEVELOPER')">
    ...
</security:authorize>

다음은 표준 스프링 보안 표현식이 설명된 참조 문서에 대한 링크입니다.또한, 필요한 경우 사용자 지정 표현식을 만드는 방법에 대해 설명한 내용이 있습니다.

@디마스의 대답이 당신의 질문과 논리적으로 일치하지 않습니다.ifAllGranted로 직접 대체할 수 없습니다.hasAnyRole.

Spring Security 3—>4 마이그레이션 가이드:

이전:

<sec:authorize ifAllGranted="ROLE_ADMIN,ROLE_USER">
    <p>Must have ROLE_ADMIN and ROLE_USER</p>
</sec:authorize>

새로 만들기(SPeL):

<sec:authorize access="hasRole('ROLE_ADMIN') and hasRole('ROLE_USER')">
    <p>Must have ROLE_ADMIN and ROLE_USER</p>
</sec:authorize>

교체ifAllGranted와 직접적으로hasAnyRole스프링이 다음을 사용하여 진술을 평가하도록 할 것입니다.OR대신에AND.그것은,hasAnyRole돌아올 것입니다true인증된 주체에 지정된 역할 중 하나 이상이 포함되어 있는 반면 Spring의 역할(현재 Spring Security 4에서 사용되지 않음)ifAllGranted메서드만 반환됨true인증된 주체에 지정된 역할이 모두 포함된 경우.

TL;DR: 동작을 복제하는 방법ifAllGrantedSpring Security Taglib의 새로운 인증 표현 언어를 사용하여,hasRole('ROLE_1') and hasRole('ROLE_2')패턴을 사용해야 합니다.

사용했습니다hasAnyRole('ROLE_ADMIN','ROLE_USER')하지만 나는 오류 아래 콩 창작물을 받고 있었습니다.

Error creating bean with name     'org.springframework.security.web.access.intercept.FilterSecurityInterceptor#0': Cannot create inner bean '(inner bean)' of type [org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource] while setting bean property 'securityMetadataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#2': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Expected a single expression attribute for [/user/*]

그 다음에 나는 노력했습니다.

access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')"저한테는 잘 작동하고 있어요.

내 사용자 중 한 명이 관리자이자 사용자이기 때문입니다.

이를 위해 추가해야 합니다.use-expressions="true" auto-config="true"http 태그 뒤에 붙습니다.

<http use-expressions="true" auto-config="true" >.....</http>

Spring Boot 2.4 내에서는

sec:authorize="hasAnyRole('ROLE_ADMIN')

다음 항목이 있는지 확인합니다.

백합잎-백합-스프링 보안5

당신들의 종속 속에.또한 네임스페이스를 포함해야 합니다.

xmlns:sec="http://www.thymeleaf.org/extras/spring-security"

html에...

만약 당신이 타임리프를 사용하고 있다면 당신은 이 방법으로 시도할 수 있습니다.

sec:authorize="hasAnyRole('ROLE_ADMIN','ROLE_USER')"

hasAnyRole은 인증된 주체에 지정된 역할 중 하나 이상이 포함되어 있으면 true를 반환하고, 포함되지 않으면 false를 반환합니다.

다음과 같이 HTML 선언 태그에 sec 태그를 사용해야 합니다.

<html xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

언급URL : https://stackoverflow.com/questions/11469211/how-to-use-secauthorize-access-hasroleroles-for-checking-multiple-roles

반응형