[y6.2]后台:在后台用户登录后立即使用自定义属性丰富会话

2020-08-16 02:49发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中) 每当后台用户登录时,我都希望使...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


每当后台用户登录时,我都希望使用自定义名称/值映射(稍后在弹性搜索查询中使用)来丰富其会话。

更准确地说,我在 PointOfService Employee 之间创建了一种关系。 关系定义了允许员工管理的服务点。 我的方法是在员工登录到后台后立即累积分配给该员工的所有服务点(POS)。 我将POS的PK存储到会话中,然后添加一个Personalization规则,该规则将员工限制为以前收集的POS。

我的目标是在不修改任何股票代码的情况下实现这一目标,这意味着我想仅依靠Spring框架提供的功能(依赖项注入,AOP)来保持我的应用程序的模块化和可维护性。

我到目前为止所做的事情

1。 使用bean/别名的替代行为

我发现,只要用户登录到后台,就会调用方法 [Backoffice | ResetConfiguration] AuthenticationSuccessHandler.onAuthenticationSuccess()。 在 backoffice/web/webroot/WEB-INF/lib/backoffice-core-[...]。jar/META-INF/backoffice-core-spring-security.xml 中配置实例化。 我的第一种方法是通过覆盖 [backoffice | resetConfiguration] AuthenticationSuccessHandler bean来注入代码。

但是,正如其他人已经报告的那样,我无法在自己的 custombackoffice-backoffice-spring.xml 中覆盖这些bean的定义; 以下相关主题:

我坚决认为问题出在处理顺序上:我的bean/别名定义必须在原始bean定义之后之后和之前中实际使用 股票 backoffice-spring-security.xml 中的 。 我猜想在所有已定义的扩展中合并 spring.xml 文件的常规过程不适用于这种情况。

2。 使用Spring AOP

由于我不想接触任何Hybris股票代码/配置,因此我的第二种方法是使用AOP解决我的问题。 在与自定义后台办公相关的扩展 custombackoffice 中,我实现了一个方面,该方面应响应对 com.hybris.cockpitng.util.web.authorization.BackofficeAuthenticationSuccessHandler.onAuthenticationSuccess 的调用:

 打包my;
 //...
  @方面
  公共课程MyAspect {
      私人UserService userService;
 
      @Around("执行(void com.hybris.cockpitng.util.web.authorization.ResetConfigurationAuthenticationSuccessHandler.onAuthenticationSuccess(..))&& args(请求,响应,认证)")
      public void myAdvice(ProceedingJoinPoint jp,HttpServletRequest req,HttpServletResponse res,final Authentication auth)抛出Throwable {
         //...
          jp.proceed();
         //...
          EmployeeModel u = userService.getUserForUID(auth.getName(),
                  EmployeeModel.class); //#FAILING LINE#
         //...
          request.getSession()。setAttribute(...);
      }
  }

  

我通过在 custombackoffice/resources/META-INF

中创建一个 aop.xml 配置文件来配置AOP。
  
    
      
      
    
    <方面>
       
    
  

  

并在 custombackoffice/resources/custombackoffice-spring.xml 中配置方面的Bean:

  
      
  

  

但是,当我让此配置运行时,我会收到一个异常:

  java.lang.NullPointerException
          在de.hybris.platform.servicelayer.session.impl.DefaultSessionService.executeInLocalView(DefaultSessionService.java:94)
          在de.hybris.platform.servicelayer.search.impl.DefaultFlexibleSearchService.getJaloResult(DefaultFlexibleSearchService.java:396)
          在de.hybris.platform.servicelayer.search.impl.DefaultFlexibleSearchService.search(DefaultFlexibleSearchService.java:168)
          在de.hybris.platform.servicelayer.internal.dao.DefaultGenericDao.find(DefaultGenericDao.java:53)
          在de.hybris.platform.servicelayer.user.daos.impl.DefaultUserDao.findUserByUID(DefaultUserDao.java:36)
          在de.hybris.platform.servicelayer.user.impl.DefaultUserService.getUserForUID(DefaultUserService.java:90)
          在de.hybris.platform.servicelayer.user.impl.DefaultUserService.getUserForUID(DefaultUserService.java:103)
          在my.MyAspect.aspect(MyAspect.java:#FAILING LINE#)

  

由于 DefaultSessionService.getOrCreateCurrentJaloSession()返回 null ,该异常发生在 userService.getUserForUID 行上。 在调查此问题时,我发现服务(包括 userService )在我的建议运行时会在 准租户 上执行其操作。 他们的字段 AbstractService.currentTenant 拥有对junit租户的引用。

然后我仔细查看了服务器启动过程,该过程提供了以下日志(摘录):

  [PlatformInPlaceClassLoader @ 462b582b]信息AspectJ Weaver版本1.8.5(建于2015年1月29日星期四,格林尼治标准时间)
  [...]
  [PlatformInPlaceClassLoader @ 462b582b]使用配置/C:/y-6.2/hybris/bin/custom/custombackoffice/resources/META-INF/aop.xml的信息
  [...]
  [PlatformInPlaceClassLoader @ 462b582b]信息寄存器方面my.MyAspect
  [...]
  [32mINFO [localhost-startStop-1] [TenantActivationAspect]为方面配置了租户<< master >>
  [...]
  [InnerLoader @ 3ced5597]信息注册方面my.MyAspect
  [32mINFO [localhost-startStop-1](junit)[TenantActivationAspect]已配置方面的租户<< junit >> [327654167]

  

值得注意的是,我的方面正在同时注册为主租户和junit租户。 我最初的猜测是该建议执行了两次(一次是"主",第二次是" junit"),但事实并非如此。 该建议仅在junit租户上下文中执行。

此外,我在没有激活junit租户的情况下强制启动hybris服务器。 因此,我添加了

已安装
  .tenants =

  

进入我的 config/local.properties 配置。 这有效!

3。

用其他方法解决问题

现在,我将通过提供 Default [User | Session] Service 服务的替代版本来解决该问题,因为这种方法对我而言似乎更有希望且可控制。

但是,我仍然对如何成功地遵循两种最初的方法感到好奇:

  1. 是否可以仅通过Spring的依赖项注入(即不实际接触)来覆盖由股票 backoffice-spring-security.xml 引用的bean?

  2. 后台处理如何处理? 为什么使用JUnit租户而不是主租户? 难道这实际上是 bug