스프링 부트 + 스프링 보안 + 계층적 역할
Spring Boot 앱에서 계층적 역할을 설정하려고 하지만 실패했습니다.저는 인터넷의 다른 장소에서 말한 모든 것을 했습니다.하지만 그들 중 누구도 문제를 해결할 수 없었습니다.
다음은 내 SecurityConfig 클래스의 코드입니다.ROLE_ADMIN을 사용하는 사용자로 앱에 로그인하면 '/users'에서 데이터를 검색할 수 있어야 하지만 현재는 Access Denied Exception(액세스 거부 예외)을 수신합니다.사용자가 ROLE_USER 자격 증명을 가지고 있으면 정상적으로 작동합니다.무엇이 실패하고 있는지 알아내는 것을 도와줄 수 있는 사람이 있습니까?잘 부탁드립니다.
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private SigpaUserDetailsService userDetailsService;
@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
return roleHierarchy;
}
@Bean
public RoleHierarchyVoter roleVoter() {
return new RoleHierarchyVoter(roleHierarchy());
}
@Bean
public DefaultWebSecurityExpressionHandler expressionHandler(){
DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy());
return expressionHandler;
}
@Bean
@SuppressWarnings(value = { "rawtypes" })
public AffirmativeBased accessDecisionManager() {
List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();
WebExpressionVoter webExpressionVoter = new WebExpressionVoter();
webExpressionVoter.setExpressionHandler(expressionHandler());
decisionVoters.add(webExpressionVoter);
decisionVoters.add(roleVoter());
return new AffirmativeBased(decisionVoters);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.accessDecisionManager(accessDecisionManager())
.expressionHandler(expressionHandler())
.antMatchers("/users/**")
.access("hasRole('ROLE_USER')")
.anyRequest().authenticated();
http
.formLogin()
.loginPage("/login").permitAll()
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder registry)
throws Exception {
registry.userDetailsService(userDetailsService);
}
}
업데이트: 여기 당신의 제안으로 업데이트된 코드가 있지만 여전히 작동하지 않습니다.
방금 이 설정을 확인했으므로 지금 바로 실행할 수 있습니다.거래 내용은 다음과 같습니다.
은 이 주석을 .@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
사전/사후 인증/필터를 사용할 코드를 보여주지 않아서 실제로 필요한지 모르겠습니다.
클래스/메소드 수준의 보안/필터링이 필요하지 않은 경우 다음 작업만 수행하면 됩니다.
@Bean public RoleHierarchyImpl roleHierarchy() { RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl(); roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER"); return roleHierarchy; }
그리고.
private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
return defaultWebSecurityExpressionHandler;
}
http
.authorizeRequests()
.expressionHandler(webExpressionHandler())
역할 계층을 도입하기만 하면 되는 경우에는 자신의 액세스 권한인 Decision Manager를 재정의할 필요가 없습니다.
보안도 "/" 사용):
PreAuthorize, PostAuthorize, PreFilter, PostFilter
@Configuration @EnableGlobalMethodSecurityConfig (GlobalMethodSecurityConfig @EnableGlobalMethodSecurity는 다음과 같습니다.@Configuration @EnableGlobalMethodSecurity(prePostEnabled=true) public class AnyNameYouLike extends GlobalMethodSecurityConfiguration { @Resource private RoleHierarchy roleHierarchy; @Override protected MethodSecurityExpressionHandler createExpressionHandler() { DefaultMethodSecurityExpressionHandler expressionHandler = (DefaultMethodSecurityExpressionHandler) super.createExpressionHandler(); expressionHandler.setRoleHierarchy(roleHierarchy); return expressionHandler; }
}
이 새 클래스에 GlobalMethodSecurityConfig라는 이름을 지정하고 현재 GlobalMethodSecurityConfig 클래스를 WebSecurityConfig 또는 웹 계층의 보안 설정임을 반영하는 것으로 변경합니다.
나는 정의합니다.RoleHierarchy
webSecurityConfig에 포함되어 있고 globalMethodSecurityConfig에 주입/사용할 수 있지만 불필요하게 빈 2개를 만들지 않는 한 원하는 방식으로 사용할 수 있습니다.
이게 도움이 되길 바랍니다.
웹 표현 유권자의 역할 계층을 설정해야 합니다.다음과 같은 것:
DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy);
webExpressionVoter.setExpressionHandler(expressionHandler);
업데이트: 위 식 핸들러를 다음과 같이 설정할 수도 있습니다.
http
.authorizeRequests()
.expressionHandler(expressionHandler)
...
MethodSecurity에서 역할 계층을 설정해야 합니다.식 처리기:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public static class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Autowired
private RoleHierarchy roleHierarchy;
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
final DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
handler.setRoleHierarchy(this.roleHierarchy);
return handler;
}
}
자세한 내용은 Javadoc에서 @EnableGlobalMethodSecurity를 확인하십시오.설정을 확인하려면 EnableGlobalMethodSecurity가 GlobalMethodSecurityConfiguration을 확장하는 클래스에 포함되어 있어야 합니다.
RoleHierarchyImpl 클래스의 setHierarchy 메서드를 명확하게 볼 수 있습니다.두 개 이상의 계층 역할에 대해 "\n"으로 분할합니다.
@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_WRITER\n" +
"ROLE_ADMIN > ROLE_EDITOR");
return roleHierarchy;
}
WebSecurityConfigurerAdapter에서 계층적 역할을 지원하고 메서드 수준 보안(@EnableGlobalMethodSecurity(prePostEnabled = true))을 활성화합니다.
1. @Bean으로 주석이 달린 다른 클래스에서 역할 계층을 분리하기만 하면 됩니다.
2. WebSecurityConfigurerAdapter에서 @Autowired를 사용하여 주입합니다.그것은 제 프로젝트에서 완벽하게 작동하고 있습니다.
제 코드를 확인해 주세요.
WeSecurityConfig.class
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private RoleHierarchy roleHierarchy;
private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy);
return defaultWebSecurityExpressionHandler;
}
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
web.ignoring().antMatchers("/static/**");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.
authorizeRequests()
.expressionHandler(webExpressionHandler())
.antMatchers("/static/**","/bower_components/**","/").permitAll()
.antMatchers("/user/login","/user/login?error").anonymous()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/user/login").passwordParameter("password").usernameParameter("username")
.defaultSuccessUrl("/")
.permitAll()
.and()
.logout().logoutUrl("/user/logout")
.logoutSuccessUrl("/user/login?logout")
.and().csrf();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(daoAuthenticationProvider());
}
public DaoAuthenticationProvider daoAuthenticationProvider(){
final DaoAuthenticationProvider auth = new DaoAuthenticationProvider();
auth.setUserDetailsService(userDetailService);
auth.setPasswordEncoder(passwordEncoder);
return auth;
}
}
BeanConfiguration.class
@Configuration
public class BeanConfiguration {
@Bean
public RoleHierarchy roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
/* tricks lies here */
roleHierarchy.setHierarchy("ROLE_SUPREME > ROLE_ADMIN ROLE_ADMIN > ROLE_OPERATOR ROLE_OPERATOR > ROLE_GUEST");
return roleHierarchy;
}
}
도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/26661192/spring-boot-spring-security-hierarchical-roles
'programing' 카테고리의 다른 글
폴더를 라벨로 만들기 전에 폴더가 있는지 확인하는 방법은 무엇입니까? (0) | 2023.08.24 |
---|---|
추가 방지 ▁prevent추가ed▁content▁adding 추가 방지 ▁prevent추가ed▁content▁adding 추가 방지 ▁prevent추가ed▁content▁addingENTER - Chrome에서 (0) | 2023.08.24 |
PowerShell의 UTF-8 출력 (0) | 2023.08.24 |
SpinxSE를 사용하는 MariaDB 10.0 (0) | 2023.08.24 |
jQuery - 텍스트 영역에서 모든 텍스트 선택 (0) | 2023.08.24 |