【问题标题】:Spring Security: @PreAuthorized("hasAuthority()") Not Being CheckedSpring Security:@PreAuthorized("hasAuthority()") 未被检查
【发布时间】:2014-05-24 11:32:16
【问题描述】:

根据 Spring Security 3.2.0 文档,我创建了一个 Spring Security 配置并在 getRootConfigClasses 中引用它:

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class[]{RootConfiguration.class, SpringSecurityConfig.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class[]{SpringWebConfiguration.class};
}

我可以证明这主要是因为 Spring Security 强制用户根据我的配置登录。问题在于方法的安全性。我已经用 @EnableGlobalMethodSecurity 对 SpringSecurityConfig 进行了注释,如下所示:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

然后在我的控制器中注释了一个方法:

@PreAuthorize("hasAuthority('ROLE_ADMIN')")

只允许具有 ROLE_ADMIN 的人访问此控制器方法。但是,使用 ROLE_USER 和 ROLE_ADMIN 登录的用户可以调用此方法,而不是预期的。

通过修改我的 Web 应用程序初始化程序以双重包含 Spring Security 配置,它开始工作,但我想对我的根上下文以及 Web 上下文中的方法使用方法身份验证,我似乎无法做到这一点发生:

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class[]{RootConfiguration.class, SpringSecurityConfig.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class[]{SpringSecurityConfig.class, SpringWebConfiguration.class};
}

每个上下文都需要自己的安全配置吗?还是在父上下文中一个就足够了?

谢谢。

【问题讨论】:

  • 你发现了吗?我面临同样的问题。我(未成功)尝试将安全配置拆分为 2:根(父)上下文安全性和 Web 上下文(子)安全性...
  • 不,我没有。我将此特定应用程序移至使用一个上下文的 Spring Boot,这对我的目的来说很好。

标签: spring-security


【解决方案1】:

我终于设法拥有了一个根上下文,一个子 Web 上下文,并让 @Pre 和 @Post 授权注释适用于控制器。

诀窍是公开在 RootContext 中创建的 AuthenticationProvider,默认情况下不公开。

所以,我的设置是:

@Order(1)
public class SecurityWebAppInitializer extends AbstractSecurityWebApplicationInitializer {}



@Order(2)
public class ApiDispatcherInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { RootConfiguration.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { ApiWebMvcConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/*" };
    }
}


@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // IMPORTANT: to expose it to the WebContext
    @Bean(name = "myAuthenticationManager")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

}



@Configuration
@EnableWebMvc
@EnableGlobalMethodSecurity(prePostEnabled = true, mode = AdviceMode.PROXY, proxyTargetClass = true) // <-- IMPORTANT to make it work for controllers
@ComponentScan(basePackageClasses = { foo.bar.Package.class }, useDefaultFilters = false, includeFilters = { @Filter(Controller.class) })
public class WebMvcConfig extends WebMvcConfigurerAdapter {

}

希望这可能对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 2021-10-29
    • 2021-09-20
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2017-09-21
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多