点击此处---> 群内免费提供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的定义; 以下相关主题:
-
/img/questions/12756517/define-a-different-success-handler-in-spring-secur-1.html
-
https ://answers.sap.com/questions/12755552/cant-able-to-override-the-spring-security-configur.html
-
/img/questions/12754623 /backoffice-authentification.html (此处建议触摸core-spring-security.xml)
我坚决认为问题出在处理顺序上:我的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
服务的替代版本来解决该问题,因为这种方法对我而言似乎更有希望且可控制。
但是,我仍然对如何成功地遵循两种最初的方法感到好奇:
-
是否可以仅通过Spring的依赖项注入(即不实际接触)来覆盖由股票
backoffice-spring-security.xml
引用的bean? -
后台处理如何处理? 为什么使用JUnit租户而不是主租户? 难道这实际上是 bug ?
我对方面和junit租户的猜测是,您的方面bean具有应用程序范围,因此首先将其配置为主机的租户组件,然后将其重新绑定到junit的租户组件。
关于修改安全配置-明天我会仔细看,但是我个人不喜欢将授权和某种程度上的业务逻辑混在一起的想法。
你好,
在这里感谢您的提问。 这让我没有失去希望,因为我尝试了所有与您相关的事情,但均未成功。 但是,我对各个方面都不满意,因此我继续进行调查,发现了Bean Extenders机制。 https://help.hybris.com/6.7.0/hcd/94ac56a0aa1f9490486bbe125457 .html#loio94ac56a0aa9f486490bbe1251d994457
这样,我可以更改最初在平台backoffice中设置的属性和bean,现在,使用BackofficeCockpitUserService的自定义实现登录后,可以在新会话中填充其他内容。
嗨,
请在后台内容(即customBackoffice/backoffice/src文件夹)中移动Java文件(扩展了backofficeAuthenticationSuccessHandler的自定义文件)。 它不应位于customBackoffice/src文件夹中。
对我有用。 我应该记录他/她登录后勤办公室时的上次登录时间。
您好,请问您能详细介绍一下如何做吗? 谢谢
从BackofficeCockpitUserService创建一个扩展bean,并覆盖所需的方法。 在覆盖的方法中添加逻辑。
然后使用座舱和Backoffice spring xml中可用的扩展器机制为Backoffice扩展将更改添加到Backoffice中任何已配置的Hybris bean。 在身份验证成功处理程序中,您将能够在成功身份验证之后将事物添加到使用新的酷炫的BackofficeCockpitUserService创建的会话中。
今天愉快
哦,太棒了! 如果这些事件侦听器仅记录在您的帮助页面之一中! :-)
一周热门 更多>