当前位置: 首页 > 知识库问答 >
问题:

打开和关闭spring security SAML的方法

晁国发
2023-03-14

除了其他身份验证机制外,我还在应用程序中实现了spring security saml的一个相当标准的实现。开箱即用的SAML不会配置,但可以通过表单配置,因此默认情况下应该禁用SAML。我希望能够轻松地切换SAML开/关,但不确定这样做的最佳方式是什么。

<http auto-config="false" use-expressions="true"
      access-decision-manager-ref="webAccessDecisionManager"
      disable-url-rewriting="false"
      create-session="never"
      authentication-manager-ref="authenticationManager">

    <custom-filter before="FIRST" ref="metadataGeneratorFilter"/>
    <custom-filter after="BASIC_AUTH_FILTER" ref="samlFilter"/>
</http>
<beans:bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
    <beans:constructor-arg>
        <beans:bean class="org.springframework.security.saml.metadata.MetadataGenerator">
            <beans:property name="entityId" value="${saml.entityId}"/>
            <beans:property name="signMetadata" value="${saml.signMetadata}"/>
        </beans:bean>
    </beans:constructor-arg>
</beans:bean>
<beans:bean id="samlFilter" class="org.springframework.security.web.FilterChainProxy">
    <filter-chain-map request-matcher="ant">
        <filter-chain pattern="/saml/login/**" filters="samlEntryPoint"/>
        <filter-chain pattern="/saml/logout/**" filters="samlLogoutFilter"/>
        <filter-chain pattern="/saml/metadata/**" filters="metadataDisplayFilter"/>
        <filter-chain pattern="/saml/SSO/**" filters="samlWebSSOProcessingFilter"/>
        <filter-chain pattern="/saml/SSOHoK/**" filters="samlWebSSOHoKProcessingFilter"/>
        <filter-chain pattern="/saml/SingleLogout/**" filters="samlLogoutProcessingFilter"/>
        <filter-chain pattern="/saml/discovery/**" filters="samlIDPDiscovery"/>
    </filter-chain-map>
</beans:bean>
public class MyMetadataGeneratorFilter extends MetadataGeneratorFilter {

    private boolean isActive = false;

    public MyMetadataGeneratorFilter(MetadataGenerator generator) {
        super(generator);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        if (isActive) {
            processMetadataInitialization((HttpServletRequest) request);
        }
        chain.doFilter(request, response);
    }

    public void setActive(boolean active) {
        isActive = active;
    }
}

初始化后,我获得filterchainmap值:

private Map<RequestMatcher, List<Filter>> map;

@Override
public void init() throws ServiceException, MetadataProviderException {

    SamlConfig samlConfig = getConfig();
    map = samlFilter.getFilterChainMap();

    applySamlConfig(samlConfig);

}

在下面的方法中,我将过滤器链映射设置为spring xml中提供的原始映射(如果启用)或空映射(如果禁用)。

public void applySamlConfig(SamlConfig samlConfig) throws ServiceException, MetadataProviderException {


    if (!samlConfig.isEnabled()) {
        Map<RequestMatcher, List<Filter>> emptyMap = samlFilter.getFilterChainMap();
        emptyMap.clear();
        samlFilter.setFilterChainMap(emptyMap);
        return;
    }

    samlFilter.setFilterChainMap(map);

共有1个答案

何涵忍
2023-03-14

我在entry-point-ref定义中添加了一个自定义筛选器。如果未启用该功能,则此筛选器将跳过以下所有筛选器。

<security:http entry-point-ref="samlEntryPoint">
  <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" />
  <!-- This filter checks if the SSO-Feature is enabled - otherwise all following security filters will be skipped -->
  <security:custom-filter before="BASIC_AUTH_FILTER" ref="ssoEnabledFilter"/>
  <security:custom-filter before="FIRST" ref="metadataGeneratorFilter" />
  <security:custom-filter after="BASIC_AUTH_FILTER" ref="samlFilter" />

SsoEnabledFilter:

    public class SsoEnabledFilter extends GenericFilterBean {

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain) throws IOException, ServletException {
        boolean ssoEnabled = isSsoEnabled();

        if (ssoEnabled) {
            filterChain.doFilter(request, response);
        } else {
            request.getRequestDispatcher(((HttpServletRequest) request).getServletPath()).forward(request, response);
        }
      }
   }
 类似资料:
  • 本章讨论的是如何进入和退出CGDB。有如下几种方法: 在命令行下输入 'cgdb' 运行CGDB 在GDB窗口输入 'quit' 或者按下 'Ctrl+D' 退出CGDB 在源代码窗口输入 ':quit' 也可以退出CGDB。这在GDB挂起或者运行一条耗时很长的指令时也同样起作用

  • 问题内容: 在一个类中,我有两种使用扫描器类的不同方法。我为第一个方法创建了一个扫描程序对象的新实例,然后在第一个方法的结尾将其关闭…然后在第二个方法中创建了一个对象(具有不同名称)的新实例,最后在此方法的结尾。 除非我打开扫描仪一次,然后关闭扫描仪,否则它将无法工作并返回错误。扫描器类的双重用途似乎不起作用。我究竟做错了什么? 这是我的两种返回错误的方法… 问题答案: 您应该将Scanner声明

  • 问题内容: 这可能是一个愚蠢的问题,但是作为PHP的新手,我想知道在HTML模板代码中频繁打开和关闭PHP标签是否存在任何与性能相关的问题,如果是,那么最佳实践是什么?使用PHP标签? 我的问题不是关闭标签的重要性/正确性,或者不是哪种类型的代码比另一种更具可读性,而是关于文档的解析/执行方式及其对性能的影响。 为了说明,请考虑以下两个极端: 混合使用PHP和HTML标签: 分离PHP和HTML标

  • 本文向大家介绍Android 打开关闭DrawerLayout,包括了Android 打开关闭DrawerLayout的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 打开 M600 长按侧边电源按钮直至屏幕上出现 Polar 标志。 关闭 M600 导航至 Settings(设定)应用程式,滚动菜单找到并轻触 System(系统)。 轻触关机。 通过轻触核取标记图标确认关闭电源。

  • 问题内容: 这样做有什么好处?我已经看过这种代码。 问题答案: 做这种事情并不常见,我通常不会做。 那些内部块(即)可以用于两个目的: 块限制了在其中声明的任何变量的范围;例如 } 但是,我不建议您这样做。IMO,最好使用不同的变量名或将代码重构为较小的方法。无论哪种方式,大多数Java程序员都会将和视为令人讨厌的视觉混乱。 块可用于粘贴标签。 } 但是,实际上,您几乎看不到标记为break的语句