programing

Spring Security, Method Security 주석(@Secured )이 작동하지 않습니다(java config).

telebox 2023. 3. 23. 22:36
반응형

Spring Security, Method Security 주석(@Secured )이 작동하지 않습니다(java config).

@Secured("ADMIN")를 사용하여 메서드 보안 주석을 설정하려고 합니다(XML은 사용하지 않고 Java 구성만, Spring Boot).그러나 역할을 통한 액세스는 작동하지 않습니다.

보안 구성:

@Configuration
@EnableWebSecurity
public class AppSecurityConfiguration extends WebSecurityConfigurerAdapter{

.....

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/api/**").fullyAuthenticated().and()
                .addFilterBefore(tokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    }

.....

}

컨트롤러의 메서드에 대한 접근을 제한하고 싶다.

@RestController
@RequestMapping("/api/groups")
public class GroupController {

    @Autowired
    private GroupService groupService;

    @Secured("ADMIN")
    @RequestMapping
    public List<Group> list() {
        return groupService.findAll();
    }

}

다음 URL에 의한 액세스 제한:

.antMatchers("/api/**").hasAuthority("ADMIN")

역할에 따라 제한하도록 지정하는 것을 잊은 것 같습니다.

UPD: 규칙에 따라 어느 계층에 있어야 합니까?@PreAuthorize("hasRole('ADMIN')")컨트롤러 계층 또는 서비스 계층에 있습니까?

이것을 추가해 주세요.

@EnableGlobalMethodSecurity(securedEnabled = true)

이 요소는 (요소에 적절한 속성을 설정함으로써) 응용 프로그램에서 주석 기반 보안을 활성화하기 위해 사용되며 특히 다음과 같은 응용 프로그램 컨텍스트 전체에 적용되는 보안 포인트 컷 선언을 그룹화하기 위해 사용됩니다.@Secured따라서 코드는 다음과 같습니다.

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class AppSecurityConfiguration extends WebSecurityConfigurerAdapter{..

이 스레드가 꽤 오래되고 내 답변은 이 스레드에 포함된 다양한 사람들의 답변 중 일부를 암시하고 있다는 것을 알고 있습니다.하지만 다음은 함정과 답변의 목록입니다.

  1. @Secured를 사용하는 경우 역할명은 (예를 들어) ADMIN입니다.이것은 @Secured("ROLE_ADMIN")의 주석을 의미합니다.
  2. WebSecurityConfigrAdapter에는 @EnableGlobalMethodSecurity(securedEnabled = true)가 있어야 합니다.
  3. 대부분의 스프링 관련 프록시와 마찬가지로 클래스 및 보안 보호된 메서드가 최종적이지 않은지 확인하십시오.Kotlin에게 이것은 클래스뿐만 아니라 모든 방법을 개방한다는 것을 의미합니다.
  4. 클래스와 그 메서드가 가상("오픈")인 경우 인터페이스가 암시적으로 필요하지 않습니다.

다음은 동작하는 Kotlin의 예입니다.

@RestController
@RequestMapping("api/v1")

    open class DiagnosticsController {
        @Autowired
        lateinit var systemDao : SystemDao

        @RequestMapping("ping", method = arrayOf(RequestMethod.GET))
        @Secured("ROLE_ADMIN")
        open fun ping(request : HttpServletRequest, response: HttpServletResponse) : String { ... 
    }

그리고.

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
open class WebSecurityConfig : WebSecurityConfigurerAdapter() {

안부 전해요

컨트롤러의 방식 보안이 기능하지 않는 이유는 여러 가지가 있을 수 있습니다.

첫째, 스프링 보안 매뉴얼에 인용된 적이 없기 때문에... 농담이지만 스프링 도구를 원하지 않는 곳에 가져가기는 어려울 수 있습니다.

보다 중요한 것은 이미 @Mudassar에서 설명한 바와 같이 메서드보안을 활성화해야 합니다.매뉴얼에는 다음과 같이 기재되어 있습니다.

주석 기반 보안을 활성화하려면@EnableGlobalMethodSecurity임의의 주석@Configuration사례.예를 들어 다음과 같이 하면 Spring Security가 활성화 됩니다.@Secured주석입니다.

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig {
   // ...
}

Mudassar의 답은 여기까지입니다.

, 방식 보안은 기본적으로 인터페이스에서 JDK 프록시를 사용하는AOP를 기반으로 합니다.서비스 클래스는 보통 인터페이스로 컨트롤러에 삽입되기 때문에 모든 예에서 메서드보안을 서비스 레이어에 적용하는 이유입니다.

물론 컨트롤러 레이어에서는 사용할 수 있지만,

  • 가 모든 하거나 둘 중 입니다.@Secured이 달린 메서드
  • 또는 클래스 프록시로 전환해야 합니다.

제가 따르려고 하는 규칙은 다음과 같습니다.

  • URL을 보호하려면 HTTPS 보안을 사용합니다.
  • 세분화된 액세스를 허용하려면 서비스 계층에 보안을 추가합니다.

이 문제는 해결되었습니다.

@EnableGlobalMethodSecurity(prePostEnabled = true)

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AppSecurityConfiguration extends WebSecurityConfigurerAdapter{
}

가 바뀌었습니다.@Secured("ADMIN")로로 합니다.@PreAuthorize("hasRole('ADMIN')")

제 결정을 공유하고 싶습니다만, 도움이 될 것 같습니다.

사용된 스프링 MVC + 스프링 보안, 버전4.2.9.RELEASE

예를 들어, @Secured 메서드에 주석이 달린 서비스가 있습니다.

@Secured("ACTION_USER_LIST_VIEW")
List<User> getUsersList();

그러나 GlobalMethodSecurityConfiguration에는 내부 메서드가 있기 때문에 동작하지 않았습니다.

protected AccessDecisionManager accessDecisionManager()

에 의해, 「」가 되었습니다.new RoleVoter() '''로rolePrefix = "ROLE_"; RoleVoter는 'ROLE_'로 시작하는 주석 값을 예상하기 때문에 작동하지 않는 주석을 제공하는 rolePrefix를 설정하기 위해 콩을 사용할 수 없습니다.

이 문제를 해결하려면 Global Method Security Configuration을 다음과 같이 덮어씁니다.

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class AppMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
    @Override
    protected AccessDecisionManager accessDecisionManager() {
        List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList<>();
        ExpressionBasedPreInvocationAdvice expressionAdvice = new ExpressionBasedPreInvocationAdvice();
        expressionAdvice.setExpressionHandler(getExpressionHandler());
        decisionVoters.add(getRoleVoter());
        decisionVoters.add(new AuthenticatedVoter());
        return new AffirmativeBased(decisionVoters);
    }

    private RoleVoter getRoleVoter() {
        RoleVoter e = new RoleVoter();
        e.setRolePrefix("");
        return e;
    }
}

@secured(ROLE_ADM)를 사용해야 합니다.@secured(ADMIN)가 아닌 IN).역할 이름 앞에 "ROLE_"라고 적어야 합니다.관리자 역할을 가진 사용자만 list() 메서드에 액세스할 수 있도록 하기 위해 아래에 설명된 예를 참조하십시오.

@RestController
@RequestMapping("/api/groups")
public class GroupController {

    @Autowired
    private GroupService groupService;

    @Secured("ROLE_ADMIN")
    @RequestMapping
    public List<Group> list() {
        return groupService.findAll();
    }

}

AppSecurityConfiguration을 WebMvcConfig(WebMvcConfigrAdapter 확장)와 동일한 컨텍스트에 등록해야 할 수도 있습니다.

AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext();      
mvcContext.register(WebMvcConfig.class, SecurityConfig.class);

언급URL : https://stackoverflow.com/questions/31186826/spring-security-method-security-annotation-secured-is-not-working-java-con

반응형