gpt4 book ai didi

spring-mvc - 使用@RolesAllowed 和@PreAuthorize 保护 Controller 方法

转载 作者:行者123 更新时间:2023-12-04 02:23:02 25 4
gpt4 key购买 nike

一段时间以来,我一直在努力解决这个问题。为了找到合适的解决方案,我已尽我所能,并遵循了许多 Stackoverflow 示例和解决方案。

首先,我使用的是基于注释的解决方案。当我注释我的服务时,prePostEnabled 有效,但当我注释 Controller 时,它不起作用。此外,即使在我的服务上,jsr250Enabled 也不起作用。

通过将注释从安全配置移动到 MVC 配置,我发现很多案例已关闭,在我的情况下这不起作用。

我的设置如下所示:https://github.com/spring-projects/spring-security-oauth-javaconfig/tree/master/samples/oauth2-sparklr

但我使用 Servlet 3.0 并且在我的 web.xml 中没有任何内容。

我的 SecurityInitializer 看起来像这样:

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
}

我的 MVC 初始化程序如下所示:
public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{WebSecurityConfig.class, MethodSecurityConfig.class};
}

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

@Override
protected String[] getServletMappings() {
return new String[]{ApiPaths.API + "/*", "/res.jsp"};
}

我的 WebSecurity 配置初始化如下:
@Configuration
@EnableWebSecurity
@ComponentScan(value = {"com.roler.res.**.server"}, excludeFilters = {
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = SpringMvcConfig.class),
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = MethodSecurityConfig.class),
@Filter(type = FilterType.REGEX, pattern = "com.xyz.*.controller.*")})
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

我的 SpringMvcConfig 是这样初始化的:
@Configuration
@EnableWebMvc
@ComponentScan(value = "com.xyz.**.controller")
public class SpringMvcConfig extends WebMvcConfigurerAdapter {

如果你有任何想法,我没有果汁,谢谢!

最佳答案

您描述的症状让我想到了代理问题。 Annotations 在服务层工作得很好,因为服务通常实现接口(interface),Spring 可以很容易地使用 JDK 代理来放置 AOP 授权。

但是 Controller 一般不实现接口(interface)。这就是为什么 PreAuthorize 注解更频繁地用于服务层的原因。恕我直言,您最好尝试使用基于 URL 模式的授权,而不是 Controller 上的 PreAuthorize 注释。另一种方法是使用带有 CGLIB 的目标类代理。

使用 PreAuthorize和 JSR-250 注释,您必须

  • 使用以下命令注释您的 spring 安全配置类:
    @EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true)
  • 如果您在应用程序中的其他任何地方使用带有 JDK 代理的 Spring AOP,请让所有要使用方法安全性的 Controller 类实现声明所有 protected 方法的接口(interface)
  • 如果您在应用程序的其他任何地方使用带有 CGLIB 代理的 Spring AOP,请添加 proxyTargetClass = true@EnableGlobalMethodSecurity :
    @EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true,
    proxyTargetClass = true)
  • 如果您想在 Spring 3.2 版本下使用 CGLIB 代理,请将 CGLIB 库添加到您的类路径(CGLIB 类包含在 Spring 3.2+ 中)
  • 避免混合 CGLIB 和 JDK 代理,因为 Spring 文档不建议这样做:多个部分在运行时折叠成一个统一的自动代理创建器,它应用任何部分的最强代理设置(通常来自不同的 XML bean 定义文件)指定的。这也适用于 and 元素。
    需要明确的是:使用 'proxy-target-class="true"' on 或元素将强制对所有三个元素使用 CGLIB 代理。

  • 但无论如何,我的建议是尝试将方法安全性转移到通常已经支持 AOP 的服务层。

    关于spring-mvc - 使用@RolesAllowed 和@PreAuthorize 保护 Controller 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27006438/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com