与Spring Security在同一应用程序中的两个领域?

我们正在构建一个可供经过身份validation的用户和匿名用户使用的Web应用程序。 如果您决定不注册/登录,则只有一组有限的function。 使用Spring Security通过OpenID完成用户身份validation。 这很好。

但是,该应用程序还附带了一个部署在//admin的管理UI。 我们可以在Spring Security中使用两个独立的领域(例如/admin/**基本身份validation)吗? 如何配置?

Spring Security在版本3.1中添加了对此场景的支持,该版本目前作为候选版本提供。 它由SEC-1171实现,语法的详细信息在3.1中包含的手册中。

但是它使用起来非常简单。 基本上,您只需在Spring Security配置中定义多个http元素,每个领域一个。 我们这样使用它:

         

需要注意的关键是第一个http元素上的pattern="/admin/**" 。 这告诉Spring, /admin下的所有URL都受制于该领域而不是默认领域 – 因此/admin下的URL使用基本身份validation。

可能的方法:

  • /admin添加URL拦截器需要“ROLE_ADMIN”
  • 配置org.springframework.security.web.authentication.www.BasicAuthenticationFilter实例以拦截/admin URL并将用户身份validation为ROLE_ADMIN(如果它提供了相应的凭据)

示例配置:

         

注意:BasicAuthenticationFilter的默认实现是一个被动filter,即它只是在请求中查找基本的auth头,如果它不存在 – 什么都不做。 如果您希望filter明确要求客户端进行基本身份validation,则需要将默认实现扩展为开始身份validation入口点:

 public class BasicAuthenticationFilter extends org.springframework.security.web.authentication.www.BasicAuthenticationFilter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { final HttpServletRequest request = (HttpServletRequest) req; final HttpServletResponse response = (HttpServletResponse) res; String header = request.getHeader("Authorization"); if ((header != null) && header.startsWith("Basic ")) { super.doFilter(req, res, chain); } else { getAuthenticationEntryPoint().commence(request, response, new AuthenticationCredentialsNotFoundException("Missing credentials")); } } } 

此外,您需要调整filter以仅应用于/admin URL – 通过在doFilter方法中进行硬编码或通过提供适当的包装bean。

我想不出有两个领域的直接方式(我自己也没试过):

您可以在web.xml中定义两个filter,其中每个filter都具有不同的弹簧配置并且可以自行设置环境。 全局事物进入app配置,filter配置中的域特定。

如果它只用于不同的auth方法,你可以编写自己的filter ,然后决定调用哪个filter。