当前位置: 首页 > 面试题库 >

在Spring Security Java Config中创建多个HTTP部分

李安歌
2023-03-14
问题内容

使用Spring Security
XML配置,您可以定义多个HTTP元素,以为应用程序的不同部分指定不同的访问规则。8.6高级命名空间配置中给出的示例定义了应用程序的有状态和无状态部分,其中前者使用会话和表单登录,而后者不使用会话和BASIC身份验证:

<!-- Stateless RESTful service using Basic authentication -->
<http pattern="/restful/**" create-session="stateless">
    <intercept-url pattern='/**' access='ROLE_REMOTE' />
    <http-basic />
</http>

<!-- Empty filter chain for the login page -->
<http pattern="/login.htm*" security="none"/>

<!-- Additional filter chain for normal users, matching all other requests -->
<http>
    <intercept-url pattern='/**' access='ROLE_USER' />
    <form-login login-page='/login.htm' default-target-url="/home.htm"/>
    <logout />
</http>

我不知道如何使用Java Config执行相同的操作。重要的是,我禁用会话并为Web服务使用其他入口点。现在,我有以下内容:

@Override
public void configure(WebSecurity security)
{
    security.ignoring().antMatchers("/resource/**", "/favicon.ico");
}

@Override
protected void configure(HttpSecurity security) throws Exception
{
    security
            .authorizeRequests()
                .anyRequest().authenticated()
            .and().formLogin()
                .loginPage("/login").failureUrl("/login?loginFailed")
                .defaultSuccessUrl("/ticket/list")
                .usernameParameter("username")
                .passwordParameter("password")
                .permitAll()
            .and().logout()
                .logoutUrl("/logout").logoutSuccessUrl("/login?loggedOut")
                .invalidateHttpSession(true).deleteCookies("JSESSIONID")
                .permitAll()
            .and().sessionManagement()
                .sessionFixation().changeSessionId()
                .maximumSessions(1).maxSessionsPreventsLogin(true)
                .sessionRegistry(this.sessionRegistryImpl())
            .and().and().csrf()
                .requireCsrfProtectionMatcher((r) -> {
                    String m = r.getMethod();
                    return !r.getServletPath().startsWith("/services/") &&
                            ("POST".equals(m) || "PUT".equals(m) ||
                                    "DELETE".equals(m) || "PATCH".equals(m));
                });
}

使用此功能,我可以为我的Web服务禁用CSRF保护。但是我确实需要一个完整的单独HTTP配置,以便可以禁用会话并指定其他入口点。我知道我可以使用requestMatcherrequestMatchers限制它适用的URI,但是似乎您不能使用它来创建单独的配置。几乎就像我需要
两种 configure(HttpSecurity security)方法一样。


问题答案:

在Spring
Security中,为了模仿<http>Java配置中XML中多个元素的行为,请创建多个用于安全性配置的类。通常它是最好的/最容易制作具有共同的安全配置
的多个内部类 用于安全定义HttpSecurity。请参阅此处的样本。

这里是官方的Spring Security文档中的相关部分:
5.7 Multiple HttpSecurity



 类似资料:
  • 如果不检查If语句中的myRange值,它不会给出错误,但不会创建pendingIntent2和PendingIntent3。 我尝试发送不同的请求代码,但它没有工作。

  • 我想在我的web服务器上运行多个非集群垂直市场。每个verticle由一个单独的进程/命令行启动,并为同一个主机和具有唯一路由的同一个端口创建自己的HTTP服务器(vertx.createHttpServer)。然而,这似乎不起作用,因为在开始一个垂直之后,所有进一步的垂直抛出一个BindException“地址已经在使用中”。 作为Vert. x的新手,我只能想到两种方法来通过这个考试: < l

  • 当使用嵌入式HSQLDB进行单元测试时,似乎无法正确处理hibernate实体映射文件中定义的模式和/或目录。hibernate映射如下所示: 我不能更改hibernate实体映射,我不想使用其他数据库引擎(我知道H2DB可以处理这个)。有人能说明如何使HSQLDB在这个单元测试上下文中工作吗?

  • 我有一个多节点集群星火集群。我正在使用log4j创建日志。日志只创建集群中的所有节点。它们也是在/tmp目录中创建的,而不是在任何其他目录中创建的。这是

  • 问题内容: 我想用Python(不是数组)中的一个创建10个变量。像这样: 我想创建的变量名,在这种情况下: ,,,…, 我不想一个数组 我有一个坐标图(640 x 480)。我正在确定像素颜色为白色的坐标。地面上有3个球,我想获取每个球的中心坐标,因此,如果要评估的坐标距离最后一个球很近,则x和y坐标将被平均(如果该坐标属于a)新球的坐标将属于新坐标组。 问题答案: 您不应该这样做,但是如果您真

  • 我创建了一个rest API来接受,如下所示。但当我使用Postman访问该服务时,我会得到HTTP状态415-不受支持的媒体类型异常 这里怎么了?要使用,是否需要进行任何修改?在Postman中,我在正文中附加了一个文本文件,并命中了endpoint。内容类型设置为“多部分/表单-数据”