代码之家  ›  专栏  ›  技术社区  ›  Marcel Stör

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

  •  17
  • Marcel Stör  · 技术社区  · 14 年前

    我们正在构建一个web应用程序,该应用程序对经过身份验证的用户和匿名用户都可用。如果您决定不注册/登录,那么您只有一组有限的功能。用户身份验证是通过具有Spring安全性的OpenID完成的。很好用。

    但是,该应用程序还附带了一个部署在 <host>/<context-root>/admin . 我们可以有两个独立的领域与春天的安全性(例如,基本身份验证 /admin/**

    3 回复  |  直到 9 年前
        1
  •  18
  •   gutch    13 年前

    springsecurity在版本3.1中增加了对该场景的支持,该版本目前作为候选版本提供。它是由 SEC-1171

    不过,它的使用非常简单。基本上你只需要定义多个 http

    <!-- Configure realm for system administration users -->
    <security:http pattern="/admin/**" create-session="stateless">
        <security:intercept-url pattern='/**' access='ROLE_ADMIN' requires-channel="https" />
        <security:http-basic/>  
    </security:http>
    
    
    <!-- Configure realm for standard users -->
    <security:http auto-config="true" access-denied-page="/error/noaccess" use-expressions="true" create-session="ifRequired">
        <security:form-login login-page="/login"
                ...
                ...
    </security:http>
    

    要注意的关键是 pattern="/admin/**" 一开始 http协议 /admin 属于该领域而不是默认领域,因此URL位于 /管理员

        2
  •  1
  •   Boris Kirzner    14 年前

    • 为添加URL拦截器 /admin
    • 配置的实例 org.springframework.security.web.authentication.www.BasicAuthenticationFilter /管理员 如果用户提供了适当的凭据,则使用URL和身份验证用户为角色\ u ADMIN

    配置示例:

    <security:intercept-url pattern="/admin" access="ROLE_ADMIN"/>
    
    <bean id="basicAuthenticationEntryPoint" 
          class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
        <property name="realmName" 
                  value="WS realm"/>
    </bean>
    
    <bean id="basicAuthenticationProcessingFilter"
          class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
        <property name="authenticationManager" 
                  ref="authenticationManager"/>
        <property name="authenticationEntryPoint" 
                  ref="basicAuthenticationEntryPoint"/>    
    </bean>
    

    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"));
            }
        }
    }
    

    此外,还需要调整要应用到的过滤器 /管理员 doFilter 方法或提供适当的包装bean。

        3
  •  0
  •   dube    14 年前

    我想不出一个直截了当的方法来拥有两个领域(我自己也没试过):

    in your web.xml 其中每一个都有一个不同的spring配置和一个自己的环境。全局内容进入app config,filter config中特定的领域。

    write your own filter 然后决定调用哪个过滤器。