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

WildFly上的Spring Security性:执行筛选器链时出错

范彭亮
2023-03-14
  • Spring-boot-SAML-Integration on GitHub

通过将其作为Spring Boot应用程序运行(针对SDK内置的应用服务器运行),WebApp可以正常工作。

不幸的是,相同的AuthN进程在undertow/wildfly上根本不起作用。

根据日志,IdP实际上执行了AuthN进程:我的自定义userdetails实现的指令被正确执行。尽管有执行流程,但Spring并没有为当前用户设置和保存特权。

@Component
public class SAMLUserDetailsServiceImpl implements SAMLUserDetailsService {

    // Logger
    private static final Logger LOG = LoggerFactory.getLogger(SAMLUserDetailsServiceImpl.class);

    @Override
    public Object loadUserBySAML(SAMLCredential credential)
            throws UsernameNotFoundException, SSOUserAccountNotExistsException {
        String userID = credential.getNameID().getValue();
        if (userID.compareTo("jdoe@samplemail.com") != 0) {     // We're simulating the data access.
            LOG.warn("SSO User Account not found into the system");
            throw new SSOUserAccountNotExistsException("SSO User Account not found into the system", userID);
        }
        LOG.info(userID + " is logged in");
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_USER");
        authorities.add(authority);
        ExtUser userDetails = new ExtUser(userID, "password", true, true, true,
                true, authorities, "John", "Doe");
        return userDetails;
    }
}

在调试过程中,我发现问题出在FilterChainProxy类上。在运行时,ServletRequest的属性filter_appliced的值为空,因此Spring将清除SecurityContextHolder

private final static String FILTER_APPLIED = FilterChainProxy.class.getName().concat(".APPLIED");

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    boolean clearContext = request.getAttribute(FILTER_APPLIED) == null;
    if (clearContext) {
        try {
            request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
            doFilterInternal(request, response, chain);
        } finally {
            SecurityContextHolder.clearContext();
            request.removeAttribute(FILTER_APPLIED);
        }
    } else {
        doFilterInternal(request, response, chain);
    }
}

在VMware vFabric tc服务器和Tomcat上,一切都运行得很好。你对解决这个问题有什么想法吗?

共有1个答案

郭辉
2023-03-14

在调查这个问题时,我注意到身份验证请求中的cookie和引用存在一些混乱。

当前,如果将webapplication上下文更改为根上下文,则wildfly身份验证将起作用:

 <server name="default-server" default-host="webapp">
     <http-listener name="default" socket-binding="http"/>
     <host name="default-host" alias="localhost" default-web-module="sso.war"/>
 </server>

重新启动wildfly并清除cookie后,所有工作都将按预期进行

 类似资料:
  • 我们与实体1和实体2有多对多的关系。 现在,当我们删除Entity2的一个元素时,实际上并不是从数据库中删除它,而是简单地将字段“isactive”设置为false。 在SQL中,这将转换为entity1表、entity2表和entity1TOentity2表。在SQL中,我们可以简单地进行一次更新, 在JPA中,我们可以将Entity1的所有元素作为对象加载,并对关系进行连接提取,然后在Java

  • 我在springboot应用程序中有筛选器。在embedded tomcate 9.0.34中运行该应用程序时,它可以正常工作。然而,当我创建war并将其部署在外部Tomcate8.5上时,它会抛出以下错误。

  • 在https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html我们了解到: 以上代码显示了我们如何为t恤添加aggs,但我们如何做到: 和

  • 我的JUnitRunner无法选择具有JBehave中指定的meta标记的场景。 以下是我的故事: 下面是我的运行程序文件: 当我作为JUnit test运行上述类时,没有调用带有烟雾标记的实际测试,也没有执行任何内容。 下面是我在执行上面的代码时得到的结果

  • 我尝试创建另一个FilterChainProxy bean,在其链列表中包含上述两个过滤器,并将该bean作为自定义过滤器添加到之前的名称空间配置中,过滤器似乎可以工作,但我的JSF导航中断了,特别是在commandLink中(我认为使用此FilterChainProxy时AJAX调用失败) 有没有人可以就如何将这两个过滤器和可能的其他过滤器添加到Spring Security过滤器链提出任何想法

  • 我正在尝试将spring-security-oauth添加到一个带有spring-security的现有应用程序中。我正在使用Java配置。 我有一个已修改的筛选器链(添加了一些自定义筛选器),但是对'/oauth/token'的请求没有使用它,而是使用了'default'筛选器链。如何访问保护oauthendpoint的筛选器链,以便也可以在那里使用自定义筛选器,或者将oauthendpoint