我需要将现有应用程序与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过滤器已加载。

检查过滤器@ https://fisheye.springsource.org/browse/spring-security/tags/spring-security-parent-2.0.4/core/的src /主/ JAVA /组织/ springframework的/安全/包装/ SecurityContextHolderAwareRequestFilter.java R = 2514

您可以看到它将HttpServletRequest对象包装并更改为扩展SecurityContextHolderAwareRequestWrapperHttpServletRequestWrapper类,该类实现isUserInRole并将其反馈给标准的Servlet Filter doFilter链。由于spring安全过滤器配置为第一个过滤器,因此所有后续类都将看到getUserPrincipal。这包括此过滤器后面的JSP页面或Servlet。

当您从JSP页面,Servlet或此过滤器后面的任何框架调用<=>或<=>时,它将调用Spring Security的<=>实现。

其他提示

如果您使用安全过滤器,是的确如此。我相信这是默认行为。

你正在取回哪个类取决于你的配置,但它们都通过Spring自己的org.springframework.security.Authentication接口实现了Principal接口,扩展了它。

我在Spring应用程序中使用了request.getUserPrincipal()和request.isUserInRole(),它甚至可以在JSP中无缝地工作。

我确实相信Spring Security会将此信息存储在SecurityContext中,而不是存储在请求中。您可以轻松编写一个FilterSecurityInterceptor,可以将其配置为将此信息添加到请求中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top