복붙노트

[SPRING] 스프링 보안은 "hasRole ( 'ROLE_ADMIN') '또는 ROLE_ADMIN과 함께 작동하지 않습니다.

SPRING

스프링 보안은 "hasRole ( 'ROLE_ADMIN') '또는 ROLE_ADMIN과 함께 작동하지 않습니다.

스프링 보안 버전 4.1을 사용하고 있습니다. 보안 구성에서 access = "hasRole ( 'ROLE_ADMIN')"또는 access = "ROLE_ADMIN"을 지정하면 로그인 할 수는 있지만 관리자 페이지에 액세스 할 수 없습니다.

<security:http use-expressions="true">
    <security:intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
    <!-- security:intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" / -->
    <security:intercept-url pattern="/createmanufsensors" access="isAuthenticated()" />
</security:http>
<security:global-method-security secured-annotations="enabled"></security:global-method-security>

다음은 디버그 오류입니다.

DEBUG [http-bio-8080-exec-10] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Secure object: FilterInvocation: URL: /admin; Attributes: [hasRole('ROLE_ADMIN')]     
2016-06-25 10:07:53,667 [] DEBUG [http-bio-8080-exec-10] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Previously Authenticated: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@cc305a73: Principal: org.springframework.security.core.userdetails.User@74b46745: Username: francatore                                                  ; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN                                ; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@166c8: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: 7F702A6911A71EA5556C750B6D424FF5; Granted Authorities: ROLE_ADMIN                                   
2016-06-25 10:07:53,667 [] DEBUG [http-bio-8080-exec-10] [org.springframework.security.access.vote.AffirmativeBased] Voter: org.springframework.security.web.access.expression.WebExpressionVoter@170ea084, returned: -1
2016-06-25 10:07:53,668 [] DEBUG [http-bio-8080-exec-10] [org.springframework.security.web.access.ExceptionTranslationFilter] Access is denied (user is not anonymous); delegating to AccessDeniedHandler

나는 무엇을 놓칠 수 있겠는가?

해결법

  1. ==============================

    1.나는 이것에 대한 작은 설명이있다. 여기에서는 일반 사용자로 인증되지만 관리 페이지를 볼 권한이 없습니다.

    나는 이것에 대한 작은 설명이있다. 여기에서는 일반 사용자로 인증되지만 관리 페이지를 볼 권한이 없습니다.

    만약 access = "hasRole ( 'ROLE_ADMIN')"식을 사용한다면, Spring EL 클래스 (즉, SecurityExpressionRoot)는 모든 역할에 접두어 ROLE_를 추가 ​​할 것입니다 hasRole () 표현식에서 우리가 제공 한 것입니다. 따라서 귀하의 경우 hasRole ( 'ROLE_ADMIN')에서 제공 한 역할이 ROLE_ROLE_ADMIN으로 결정됩니다.

    ROLE_ADMIN을 (를) 가진 사용자로 인증 된 이유입니다. 하지만 스프링 보안 프레임 워크에서 관리자 페이지를 볼 수있는 사용자는 ROLE_ROLE_ADMIN (SecurityExpressionRoot 클래스에 ROLE_ 접두어가 추가 되었기 때문에).

    따라서 코드에서 ROLE_ 접두사를 제거하십시오 (예 : access = "hasRole ( 'ADMIN') '). 따라서 스프링 시큐리티는 ROLE_ 접두어를 자동으로 추가합니다. ROLE_ADMIN (으)로 데이터베이스에서 관리 역할을 지정했는지 확인하십시오.

  2. from https://stackoverflow.com/questions/38030022/spring-security-does-not-work-with-hasrolerole-admin-or-role-admin by cc-by-sa and MIT license