컨트롤러에서 PreAuthorize가 작동하지 않음
액세스 규칙을 메서드레벨로 정의하려고 합니다만, 전혀 기능하지 않습니다.
보안 설정
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().
withUser("user").password("user").roles("USER").and().
withUser("admin").password("admin").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/v2/**").authenticated()
.and()
.httpBasic()
.realmName("Secure api")
.and()
.csrf()
.disable();
}
}
예컨트롤러
@EnableAutoConfiguration
@RestController
@RequestMapping({"/v2/"})
public class ExampleController {
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@RequestMapping(value = "/home", method = RequestMethod.GET)
String home() {
return "Hello World";
}
}
/v2/home에 접속하려고 할 때마다user:user
정상적으로 동작합니다.이것에 의해, 「user」의 액세스 거부 에러가 발생합니다.ROLE_ADMIN
?
실제로는 메서드 레벨에서 접근규칙을 파기하고 http() 개미규칙을 고수하려고 하는데 왜 나에게 효과가 없는지 알아야 합니다.
를 추가해야 합니다.@EnableGlobalMethodSecurity(prePostEnabled = true)
Web Security Config로 이동합니다.
다음 URL에서 찾을 수 있습니다.http://www.baeldung.com/spring-security-expressions-basic
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
컨트롤러에서 PrePost 주석을 사용할 때의 일반적인 문제는 Spring 메서드의 보안이 기본적으로 JDK 프록시를 사용하여 구현되는 Spring AOP에 기반한다는 것입니다.
즉, 컨트롤러 레이어에 인터페이스로 삽입되는 서비스 레이어에서는 정상적으로 동작하지만 컨트롤러는 일반적으로 인터페이스를 구현하지 않기 때문에 컨트롤러 레이어에서는 무시됩니다.
제 의견은 다음과 같습니다.
- 선호하는 방법: 서비스 계층에서 게시 전 주석을 이동합니다.
- 할 수 없는 경우(또는 하고 싶지 않은 경우), 컨트롤러에 주석 첨부 모든 메서드를 포함한 인터페이스를 실장하도록 합니다.
- 마지막으로 proxy-target-class=true를 사용합니다.
놓다@EnableGlobalMethodSecurity(prePostEnabled = true)
(Web SecurityConfigrAdapter를 확장) 대신 MvcConfig 클래스로 이동합니다(WebMvcConfigrAdapter 확장).
다음 예시와 같습니다.-
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MvcConfiguration extends WebMvcConfigurerAdapter {
저도 비슷한 문제가 있었는데 다음 방법으로 해결했습니다.
1) 메서드를 공개하지 않으면 안 되었다(즉, 당신의 메서드를 home() 공개한다).
2) has Authority 대신 has Role을 사용해야 합니다.
이것을 사용하는 방법에는 프레픽스(prefix)와 프레픽스(not)의 두 가지가 있습니다.그리고 넌 바뀔지도 몰라@PreAuthorize("hasAuthority('ROLE_ADMIN')")
로.@PreAuthorize("hasAuthority('ADMIN')")
괜찮을 거예요.
다음은@PreAuthorize
소스 코드
private String defaultRolePrefix = "ROLE_";
public final boolean hasAuthority(String authority) {
return hasAnyAuthority(authority);
}
public final boolean hasAnyAuthority(String... authorities) {
return hasAnyAuthorityName(null, authorities);
}
public final boolean hasRole(String role) {
return hasAnyRole(role);
}
public final boolean hasAnyRole(String... roles) {
return hasAnyAuthorityName(defaultRolePrefix, roles);
}
AD Group을 승인하려고 할 때 같은 문제에 직면했습니다.이 절차들은 저에게 효과가 있었습니다.
@EnableGlobalMethodSecurity(prePostEnabled = true)
주석이 달린 수업에서@EnableWebSecurity
userName과 권한을 가지며 사용자 상세 정보 서비스에서 Group User Details 인스턴스를 반환하는 커스텀(Group User Details) User Details를 작성했습니다.
컨트롤러 메서드에 주석을 달다
@PreAuthorize("hasAuthority('Group-Name')")
내 통제관의 방법은 비공개로 공개해야 했다.
컨트롤러 레이어에서 동작하도록 하기 위해서.넣어야 했다@EnableAspectJAutoProxy
를 참조해 주세요. 예:
@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy
@ComponentScan(basePackages = { "com.abc.fraud.ts.userservices.web.controller" })
public class WebConfig extends WebMvcConfigurerAdapter{
}
멘토를 h from롤 the the the에서 .private
로로 합니다.public
과가있있 있있있다다
방식은 " " " " 입니다.protected
이 안 it (셋 잇)public
보안 콩용 xml 콘텍스트파일과 웹/서블릿콘텍스트용 xml 콘텍스트파일이 있는 경우는, 다음의 순서를 추가할 필요가 있습니다.
<security:global-method-security pre-post-annotations="enabled"/>
servlet 콘텍스트로 이동합니다.보안 컨텍스트 xml에 추가하는 것만으로는 충분하지 않습니다.
하위 컨텍스트에서는 상속되지 않습니다.
HTH
언급URL : https://stackoverflow.com/questions/32442408/preauthorize-not-working-on-controller
'source' 카테고리의 다른 글
Wordpress PHP에서 메타 태그를 사용하는 동적 페이스북 (0) | 2023.03.31 |
---|---|
Mongodb:사용하기 전에 알아야 할 사항 (0) | 2023.03.26 |
jquery의 약속 방법은 실제로 어떻게 작동합니까? (0) | 2023.03.26 |
스프링 파일 업로드 - MultipartHttpServletRequest 가져오기: MultipartResolver가 구성되어 있습니까?에러 (0) | 2023.03.26 |
요소 외부를 클릭할 때 이벤트를 발생시키는 지시어 (0) | 2023.03.26 |