代码之家  ›  专栏  ›  技术社区  ›  ebruchez

Acegi/Spring安全是否支持getUserPrincipal()?

  •  5
  • ebruchez  · 技术社区  · 15 年前

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

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

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

    次要问题:如果不是默认情况,有没有办法打开它?

    谢谢,

    -埃里克

    3 回复  |  直到 15 年前
        1
  •  6
  •   lsiu    15 年前

    正如前面的用户所回答的,Spring安全性支持getUserPrincipal和isUserInRole。以下是Spring Security的工作方式。

    配置弹簧时,它可以加载以下过滤器:

    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(httpservletrequest) 并反馈给标准servlet过滤器-过滤器-过滤器链。自弹簧安全过滤器 应该 被配置为第一个过滤器,所有后续类将看到 SecurityContextHolderWareRequestWrapper 相反。这包括这个过滤器后面的JSP页面或servlet。

    当你打电话给 isUserInRole getUserPrincipal 从JSP页面、servlet或此过滤器后面的任何框架中,它调用 httpservletrequest(httpservletrequest) 从Spring Security实现。

        2
  •  1
  •   Tore A.    15 年前

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

    您要返回的具体类取决于您的配置,但它们都通过Spring自己的org.springframework.security.authentication接口实现了主体接口,该接口对其进行了扩展。

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

        3
  •  0
  •   Gandalf    15 年前

    我相信SpringSecurity将这些信息存储在SecurityContext中,而不是请求中。您可以很容易地编写一个filtersecurityInterceptor,它也可以配置为将此信息添加到请求中。