作为序言,我根本没有春天的经验,无论我发现什么,仍然可能是错误的:)。
我正在尝试通过@Secured在控制器的rest方法上运行角色层次结构:
@Secured("ROLE_USER")
@JsonView(value=View.Detail.class)
@RequestMapping(path = "/{id}", method = RequestMethod.GET)
public Lamp getLamp(@PathVariable UUID id) {
return lampService.getLampById(id);
}
我为启用此功能所做的/我尝试过的操作:
我启用了WebSecurity,并将secureEnabled设置为true
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
我还添加/尝试了不同口味的RoleHierarchy:
@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_EDITOR");
// TODO: add ROLE_EDITOR > ROLE_USER
return roleHierarchy;
}
试图调用/配置RoleHierarchyVoter
@Bean
public RoleHierarchyVoter roleHierarchyVoter(RoleHierarchy roleHierarchy) {
return new RoleHierarchyVoter(roleHierarchy);
}
我还尝试了WebSecurityExpressionHandler
private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
return defaultWebSecurityExpressionHandler;
}
在此处进行全部配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().expressionHandler(webExpressionHandler())
.antMatchers("/api/**").authenticated()
;
http.httpBasic();
http.csrf().disable();
}
现在我完全迷路了。我通过配置启用安全日志记录:
logging.level.org.springframework.security=DEBUG
在我的application.properties中,它工作正常。它向我展示了MethodSecurityInterceptor对其进行处理,而RoleVoter拒绝访问。应该有一个RoleHierarchyVoter,但是根本没有出现。我还调试了它以确保。
在spring安全参考中,也只有一个bean用于配置层次结构,但是我没有尝试过。
我确定层次结构本身可以工作,因为调试器中的对象表明ADMIN包括EDITOR,而我的测试用户也具有ADMIN角色。我进入Principal并调试了RoleVoter。
我也不明白为什么有人建议使用WebSecurityExpressionHandler。我猜想这不适用于方法安全性。
我也很烦恼为什么我的用例看起来不那么常见。人们还在做其他事情吗?
Tx!