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{..
이 스레드가 꽤 오래되고 내 답변은 이 스레드에 포함된 다양한 사람들의 답변 중 일부를 암시하고 있다는 것을 알고 있습니다.하지만 다음은 함정과 답변의 목록입니다.
- @Secured를 사용하는 경우 역할명은 (예를 들어) ADMIN입니다.이것은 @Secured("ROLE_ADMIN")의 주석을 의미합니다.
- WebSecurityConfigrAdapter에는 @EnableGlobalMethodSecurity(securedEnabled = true)가 있어야 합니다.
- 대부분의 스프링 관련 프록시와 마찬가지로 클래스 및 보안 보호된 메서드가 최종적이지 않은지 확인하십시오.Kotlin에게 이것은 클래스뿐만 아니라 모든 방법을 개방한다는 것을 의미합니다.
- 클래스와 그 메서드가 가상("오픈")인 경우 인터페이스가 암시적으로 필요하지 않습니다.
다음은 동작하는 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
'programing' 카테고리의 다른 글
Spring Boot 응용 프로그램에서 테이블 재생을 사용하지 않도록 설정합니다. (0) | 2023.03.23 |
---|---|
오류: 이 메서드는 단일 노드에서만 실행됩니다.대신 0이 발견됨 (0) | 2023.03.23 |
ASP에서 Camel Case를 강제 적용합니다.컨트롤러당 NET WebAPI 수 (0) | 2023.03.23 |
Wordpress 외부 구텐베르크 에디터 (0) | 2023.03.23 |
jQuery UI 자동 완성:제안된 리스트에서 선택한 값만 허용 (0) | 2023.03.18 |