【问题标题】:Overriding a class defined in Spring Boot \ Spring Security覆盖 Spring Boot \ Spring Security 中定义的类
【发布时间】:2022-01-06 06:34:29
【问题描述】:

我们正在将遗留应用程序迁移到 Spring Boot。为了在我们为用户分配角色之前继续测试,我想覆盖以下内容:

SecurityContextHolderAwareRequestWrapper

方法public boolean isUserInRole(String role)

我创建了一个扩展SecurityContextHolderAwareRequestWrapper 并覆盖isUserInRole() 的新类,如下所示:

@Component
public class MySecurityContextHolderAwareRequestWrapper extends org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper {

    public MySecurityContextHolderAwareRequestWrapper(HttpServletRequest request,
            AuthenticationTrustResolver trustResolver, String rolePrefix) {
        super(request, trustResolver, rolePrefix);
    }

    @Override
    public boolean isUserInRole(String role) {
        return true;
    }

当应用程序运行时,新 bean 不会取代现有的 SecurityContextHolderAwareRequestWrapper 类。这一点很清楚,因为当新类被实例化时,构造函数不会被注入到SecurityContextHolderAwareRequestWrapper 中的 bean 中。应用程序无法启动,因为找不到新类 MySecurityContextHolderAwareRequestWrappercouldAuthenticationTrustResolverString 类型的参数

什么是覆盖 SecurityContextHolderAwareRequestWrapper 或 Spring Boot 框架中的任何类的正确方法?

谢谢

【问题讨论】:

    标签: spring-boot spring-security


    【解决方案1】:

    SecurityContextHolderAwareRequestWrapper 类最终由配置了http.servletApi()SecurityContextHolderAwareRequestFilter 使用。 Spring Security reference docs 中提供了有关此功能的一些信息。

    此功能使您免于直接依赖 Spring Security,并通过 Servlet API 提供与 Spring Security 的非常高级集成。您不能直接影响用于包装请求的类。

    但是,如果您希望临时修改角色检查的结果,您可以在身份验证期间影响Authentication 对象中可用的角色。请参阅GrantedAuthority 上的文档中的信息,并注意您需要在身份验证期间通过提供自定义UserDetailsService 来自定义角色。

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 2016-06-06
      • 2016-10-31
      • 2015-12-20
      • 2015-05-01
      • 1970-01-01
      • 2019-03-23
      • 2015-09-20
      • 2020-04-26
      相关资源
      最近更新 更多