我实际上使用log4j作为记录器。记录器用于所有应用程序层(控制器,服务,dao等)。控制器层下的所有层也由非JSF应用程序使用。
当我的JSF应用程序运行时,如果出现异常(例如,在服务层中),如何在记录器中获取记录的用户ID?登录用户实际存储在JSF会话中。
注意:我的问题可能与How to get the name of the logged in user in JSF service in GlassFish有关,似乎认为这是不可能的。
答案 0 :(得分:1)
当使用本地身份验证并手动将登录用户放入HTTP会话时,您必须将其作为方法参数传递给自己,因为服务层应该不知道任何前端细节,例如HTTP会话(即,禁止在服务层中导入/使用来自javax.faces.*
,javax.servlet.*
,javax.ws.*
等的任何内容。
通过j_security_check
或request.login()
使用container managed authentication时,EJBContext#getCallerPrincipal()
可以使用@RolesAllowed
。 EJBContext
反过来只能通过@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