5

我需要将现有应用程序与 Acegi/Spring 安全接口。

为了开始,我正在寻找一条简单的信息:在这种情况下,从我的应用程序调用的 HttpServletRequest.getUserPrincipal() 是否会正确返回通过 Spring 获得的用户名(而不是使用 Spring 特定的对象)?我在谷歌上搜索了这方面的相互矛盾的信息。

我假设如果 Acegi 使用过滤器实现,它能够重载 Servlet API 的 getUserPrincipal(),对吗?

附属问题:如果默认情况下不是这样,有什么办法可以开启吗?

谢谢,

-埃里克

4

3 回答 3

6

正如之前的用户已经回答的那样,spring security 支持 getUserPrincipal 和 isUserInRole。这是 Spring Security 的工作方式。

当你配置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/main/java/org/springframework/security/wrapper/SecurityContextHolderAwareRequestFilter。 java?r=2514

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

When you make a call to isUserInRole or getUserPrincipal from the JSP page, Servlet or any framework behind this filter, it is calling the HttpServletRequest implementation from Spring Security.

于 2009-04-10T11:03:36.480 回答
1

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

您要返回的确切类取决于您的配置,但它们都通过 Spring 自己的 org.springframework.security.Authentication 接口实现了 Principal 接口,该接口扩展了它。

我在 Spring 应用程序中使用了 request.getUserPrincipal() 和 request.isUserInRole() 并且它可以无缝地工作,即使在 JSP 中也是如此。

于 2009-03-12T12:52:47.817 回答
0

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

于 2009-03-19T16:23:02.947 回答