-1

내 응용 프로그램에서 스프링 보안을 사용하고 있습니다. 역할 (관리자, 사용자)을 기반으로 API를 인증합니다. 매개 변수로 전달 된 변수의 값을 사용하여 액세스를 제한하려는 API 끝점이 하나 있습니다.스프링 보안 클래스의 변수 값을 사용하여 인증하기

내가 가진

@Override 
protected void configure(HttpSecurity httpSecurity) throws Exception { 

    httpSecurity.csrf().disable().exceptionHandling().authenticationEntryPoint(this.unauthorizedHandler).and() 
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests() 
      .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 
      .antMatchers("/api/**").authenticated() 
      .anyRequest().permitAll(); 

    httpSecurity.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class); 
} 

내가 가진 전화

@PostMapping("/something") 
public ResponseEntity<BotResponse> handleRequest(@Valid @RequestBody SomeClass someClass) { 
     // if someClass.getSomeValue() is not present in the User permissions, then it should give an unauthorized response. 
     return value(someClass); 
} 

봄 보안의 사용자는 다음과 같습니다

public Class User { 
    String userId; 
    String userName; 
    String authorities; 
    List<String> someList; 
    //Getters and setters for variables 
} 

그리고 사용 SomeClass은 다음과 같습니다

public Class SomeClass { 
    String someValue; 
    String userName; 
    ... 
    // Getters and Setters 
} 

someClass.getSomeValue의 값이 User의 someList에있는 경우 사용자 기반으로 허용하지 않으려면 어떻게해야합니까?

답변

0

질문에 따라, 한 가지 방법은 Spring 보안 인증 컨텍스트에 저장된 UserDetails를 가져온 다음이 컨텍스트 오브젝트의 관련 데이터를 매개 변수로 전달 된 값과 비교하여 점검하는 것입니다. 보안 컨텍스트에 저장된 모든 필수 값을 가지고 있다고 가정합니다.
이 검사는 엔드 포인트 코드 자체에서 수행 할 수 있습니다 (API가 적다면). 동일한 로직을 필요로하는 API가 여러 개있는 경우 이러한 API 만 필터하는 필터 (web.xml에 config를 작성할 수 있음) 또는 AOP를 통해 pointcut을 구현해야합니다.

0

아마도 스프링의 전역 메소드 보안을 통해 이러한 종류의 권한 부여를 수행 할 수 있습니다.

메소드 레벨 권한 부여를 사용하려면 보안 설정 클래스에 다음 주석을 추가해야합니다.

@EnableGlobalMethodSecurity(prePostEnabled = true) 

그런 다음 봄 표현 언어를 사용하여 @PreAuthorize을 끝점에 적용하십시오. 뭔가 같은 ..

@PostMapping("/something") 
@PreAuthorize("@someService.checkUserAccess(principal, #someClass)") 
public ResponseEntity<BotResponse> handleRequest(@Valid @RequestBody SomeClass someClass) { 
     // if someClass.getSomeValue() is not present in the User permissions, then it should give an unauthorized response. 
     return value(someClass); 
} 

@someService 당신이되어이() 메서드 컨트롤러에 autowire가와 checkUserAccess을 정의하는 것 콩입니다. 뭔가 같은 ..

public boolean checkUserAccess(Pricipal principal, SomeClass someClass) { 
     // here you can fetch your full user object from db or session (depending on your application architecture) 
     // apply what ever logic you want to apply, return true if user has access and false if no. 
} 

주/Suggestion- 당신은 당신의 애플리케이션 설계가 허용하는 경우 기존 사용자 서비스에이 checkUserAccess() 방법을 추가하고, 컨트롤러에서 자동으로 묶어 사용자 서비스 할 수 있습니다.