[英]Spring Security request.getUserPrincipal() always null
[英]Does Acegi/Spring security support getUserPrincipal()?
我需要使用Acegi / Spring安全性连接现有应用程序。
为了开始,我正在寻找一个简单的信息:在这个上下文中,从我的应用程序调用的HttpServletRequest.getUserPrincipal()是否正确返回通过Spring获得的用户名(而不是使用特定于Spring的对象)? 我用Google搜索了相互矛盾的信息。
我假设如果使用过滤器实现Acegi,它可以重载Servlet API的getUserPrincipal(),对吗?
附属问题:如果默认不是这种情况,有没有办法打开它?
谢谢,
-Erik
正如之前的用户所回答的那样,spring security支持getUserPrincipal和isUserInRole。 以下是Spring安全性的方法。
配置spring时,它可以加载以下过滤器:
http://static.springframework.org/spring-security/site/reference/html/ns-config.html#filter-stack
作为标准过滤器配置的一部分,将加载SecurityContextHolderAwareRequestFilter
过滤器。
你可以看到它包装和改变HttpServletRequest
对象的SecurityContextHolderAwareRequestWrapper
延伸类HttpServletRequestWrapper
它实现HttpServletRequest
并反馈到标准的Servlet过滤器的doFilter链。 由于spring安全过滤器应配置为第一个过滤器,因此所有后续类都将看到SecurityContextHolderAwareRequestWrapper
。 这包括此过滤器后面的JSP页面或Servlet。
当您从JSP页面,Servlet或此过滤器后面的任何框架调用isUserInRole
或getUserPrincipal
,它将从Spring Security调用HttpServletRequest
实现。
如果您使用安全过滤器,是的确如此。 我相信这是默认行为。
究竟哪个类取决于你的配置,但它们都通过Spring自己的org.springframework.security.Authentication接口实现了Principal接口,扩展了它。
我在Spring应用程序中使用了request.getUserPrincipal()和request.isUserInRole(),它可以无缝地工作,即使在JSP中也是如此。
我相信Spring Security会将此信息存储在SecurityContext中,而不是存储在请求中。 您可以轻松编写FilterSecurityInterceptor,可以将其配置为将此信息添加到请求中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.