我有一个使用struts2和旧式servlet的java-web-application。 使用Acegi安全性。
在我的servlet中,我正在记录用户正在尝试做什么以及它是哪个用户。要让用户使用request.getRemoteUser()
但是对于我的大抱怨,结果并不一致。大多数时候getRemoteUser()
会返回正确的用户名,但每隔一段时间我就会得到一个空值。
这背后的原因是什么?
编辑:
在您的反馈之后,我发现servlet-urls根本没有被安全保护。这样可能会导致getRemoteUser()
为空。我现在将为这些实现安全性,并在发回结果之前进行更多测试。
答案 0 :(得分:3)
getRemoteUser()
将返回登录的用户,否则将返回null。
您使用什么样的身份验证(Jaas with basic / digest等)?
您是否看到特定URL(servlet)的此错误?在这种情况下,URL可能具有其他安全约束。
另一个原因是客户端(浏览器)没有发送带有请求的用户名。如果您位于要求身份验证的URL树之外,则会发生这种情况。
答案 1 :(得分:2)
doc说明了为什么你得到null:
如果用户已经过身份验证,则返回发出此请求的用户的登录名;如果用户尚未通过身份验证,则返回null。是否随每个后续请求一起发送用户名取决于浏览器和身份验证类型。与CGI变量REMOTE_USER的值相同。
您需要调查导致问题的浏览器。
答案 2 :(得分:2)
登录表单是否已被Acegi Security( AuthenticationProcessingFilterEntryPoint 的loginFormUrl
)过滤?
如果是,请通过
获取登录的用户名SecurityContextHolder.getContext().getAuthentication().getName();