从EJB服务层中的JSF会话记录登录的用户标识

时间:2015-12-11 15:05:52

标签: jsf logging log4j ejb

我实际上使用log4j作为记录器。记录器用于所有应用程序层(控制器,服务,dao等)。控制器层下的所有层也由非JSF应用程序使用。

当我的JSF应用程序运行时,如果出现异常(例如,在服务层中),如何在记录器中获取记录的用户ID?登录用户实际存储在JSF会话中。

注意:我的问题可能与How to get the name of the logged in user in JSF service in GlassFish有关,似乎认为这是不可能的。

1 个答案:

答案 0 :(得分:1)

当使用本地身份验证并手动将登录用户放入HTTP会话时,您必须将其作为方法参数传递给自己,因为服务层应该不知道任何前端细节,例如HTTP会话(即,禁止在服务层中导入/使用来自javax.faces.*javax.servlet.*javax.ws.*等的任何内容。

通过j_security_checkrequest.login()使用container managed authentication时,EJBContext#getCallerPrincipal()可以使用@RolesAllowedEJBContext反过来只能通过@Resource注射。这是日志记录拦截器中的一个用法示例。

@Resource
private EJBContext ejbContext; // You can also inject SessionContext.

@AroundInvoke
public Object log(InvocationContext invocationContext) {
    String username = ejbContext.getCallerPrincipal().getName();
    // ...
}

请注意,在未登录时,它永远不会null,默认为"anonymous"

容器管理身份验证的其他优点是您可以在服务方法上添加How to handle authentication/authorization with users in a database?等安全限制注释。然而,如何使用容器管理的身份验证又是一个故事。从这里开始:http://docs.spring.io/spring-data/neo4j/docs/4.0.0.RELEASE/reference/html/#_spring_s_conversionservice