spring-boot 在单个 Web 应用程序路径上设置基本身份验证?

2023-12-25

我正在尝试在基于 spring-boot spring MVC 的应用程序中设置单个路径(/basic)以进行基本身份验证保护。我将使用我自己的自定义配置参数进行配置,因此用户名和密码只是“admin”和“admin”。

目前这适用于 /basic 路径(系统会提示我并且可以正确登录)。问题是注销不起作用(我不确定为什么),并且其他路径(如 /other 显示)也被要求提供基本身份验证凭据(在总是被拒绝之前)。

static class MyApplicationSecurity extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/open").permitAll();
        http.authorizeRequests().antMatchers("/other").denyAll(); // Block it for now
         http.authorizeRequests().antMatchers("/basic").authenticated().and().httpBasic().and().logout().logoutUrl("/basic/logout").invalidateHttpSession(true).logoutSuccessUrl("/");
    }
}

我预计 /other 总是会被拒绝,但我不明白为什么会出现基本身份验证。 /open 按预期工作。我也不明白为什么 /basic/logout 不让我退出(它也不会产生错误消息)。我确实有一段简单的代码作为注销端点的占位符,但如果我没有,则会收到 404。“主页”视图是我的 Web 应用程序根目录,因此我只想在注销后将用户发送到那里。

@RequestMapping("/logout")
public ModelAndView logout() {
    // should be handled by spring security
    return new ModelAndView("home");
}

更新: 这是最终似乎有效的解决方案(除了注销部分,仍然无效):

@Configuration
@Order(1) // HIGHEST
public static class OAuthSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/oauth").authorizeRequests().anyRequest().denyAll();
    }
}

@Configuration
public static class BasicAuthConfigurationAdapter extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/basic").authorizeRequests().anyRequest().authenticated().and().httpBasic();
        http.logout().permitAll().logoutUrl("/logout").logoutSuccessUrl("/").invalidateHttpSession(true);
        //.and().logout().logoutUrl("/basic/logout").invalidateHttpSession(true).logoutSuccessUrl("/");
    }
}

我不确定注销的情况,但我们也遇到了类似的问题,我们的一些网站处于基本状态,而另一些则没有。我们的解决方案是仅对需要 http basic 的路径使用第二个嵌套配置类。我们给这个配置一个@Order(1)..但我不确定这是否有必要。

更新了代码

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
    private static final Logger LOG = LoggerFactory.getLogger(SecurityConfig.class);

    @Autowired
    public void registerAuthentication(AuthenticationManagerBuilder auth, Config appConfig) throws Exception {
        auth.inMemoryAuthentication()
            .withUser(appConfig.getString(APIConfig.CONFIG_KEY_MANAGEMENT_USER_NAME))
            .password(appConfig.getString(APIConfig.CONFIG_KEY_MANAGEMENT_USER_PASS))
            .roles(HyperAPIRoles.DEFAULT, HyperAPIRoles.ADMIN);        
    }



    /**
     * Following Multiple HttpSecurity approach:
     * http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#multiple-httpsecurity 
     */
    @Configuration
    @Order(1)
    public static class ManagerEndpointsSecurityConfig extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
            .antMatcher("/management/**").authorizeRequests().anyRequest().hasRole(HyperAPIRoles.ADMIN).and()
            .httpBasic();
        }
    }

    /**
     * Following Multiple HttpSecurity approach:
     * http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#multiple-httpsecurity 
     */
    @Configuration
    public static class ResourceEndpointsSecurityConfig extends WebSecurityConfigurerAdapter {        



       @Override
       protected void configure(HttpSecurity http) throws Exception {                  

            http
            //fyi: This adds it to the spring security proxy filter chain
            .addFilterBefore(createBBAuthenticationFilter(), BasicAuthenticationFilter.class)
            ;      
       }
    }
}

这似乎通过基本身份验证来保护 /management 处的执行器端点,而其他端点则使用自定义身份验证令牌标头。尽管对于任何事情,我们都不会提示提供凭据(不会发出质询)。我们必须注册一些其他内容才能实现这一点(如果我们想要的话)。

希望这可以帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring-boot 在单个 Web 应用程序路径上设置基本身份验证? 的相关文章

随机推荐

  • 从 Android JNI 程序调用的 Log API 是什么?

    我想通过将日志消息插入到 logcat 来调试 JNI C 应用程序 执行此操作的 C API 是什么 像这样 include
  • 无法在 Android 中配置 Fiddler 代理来解密 HTTPS

    我正在尝试设置 Fiddler 代理来捕获来自 Xamarin 应用程序的流量 我已完成以下步骤 在Windows机器上安装了Fiddler v5 0 20173 50948 Set 允许远程计算机连接和港口8888 Set 捕获 HTTP
  • javascript - Express.js 中的 app.set('port', 8080) 与 app.listen(8080)

    我一直在尝试使用 Express js 来启动一个网站 起初 我使用的是app set port 8080 但浏览器无法连接到该页面 后来我把代码改成了app listen 8080 并且网页正常显示 这让我想知道 这两个函数有什么区别 a
  • R Shiny - 使用 updateSelectizeInput 优化页面加载时间

    我们的闪亮页面有多个selectizeInput控件 其中一些在下拉框中有很长的列表 因此 初始加载时间很长 因为需要预先填充所有下拉框selectizeInput控制 编辑 请参阅下面的示例 显示加载长列表如何影响页面加载时间 请复制以下
  • 图中的颜色点根据值向量的不同而不同

    我正在使用 R 绘制下图plot 功能 这是一个向量图shiftTime的时间转变 我有另一个向量intensity强度值范围从 3到 9 我想根据具有颜色渐变的这些值对图中的点进行着色 在示例中 我可以在实际绘制点的值上找到颜色 因此在本
  • 如何让 Knockout.js 设置属性的命名空间 URI?

    在 svg 中 如果我使用淘汰赛来设置xlink href属性为a节点 属性的命名空间设置不正确 因此a单击时不能用作链接 例如 请考虑以下包含两个链接的椭圆的 svg 有其一xlink href属性是硬编码的 另一个是通过淘汰赛设置的da
  • 在discord.py中我该如何制作才能使机器人仅在一台服务器上工作

    在discord py 中 我该如何让机器人只在一个上运行 有没有办法做到这一点 x channel id if x 12454431344645423 this is the channel id print hi 最简单的方法是不将其添
  • 如何确定 cv::Mat 是否为零矩阵?

    我有一个根据以下代码动态更改的矩阵 for It all frames begin It all frames end It ItTemp It subtract ItTemp Base NewData cout lt lt The siz
  • Android ArrayAdapter 和 JSONArray

    我是 Android 开发新手 考虑到 JSON Carrier 相对于 XML 的轻便性 我纯粹喜欢在我的简单应用程序中使用 JSON 对象和数组 我在使用 ArrayAdapter 填充 ListView 时遇到了挑战 这就是我克服的方
  • 对于 Scala 来说,类型擦除有什么优点吗?

    我听说过很多关于不同 JVM 语言的信息 这些语言仍处于蒸气软件模式 建议以某种方式实现具体化 我有一个半记得的 或者完全想象的 不知道是哪一个 的想法 我在某处读到 Scala 以某种方式利用 JVM 的类型擦除来完成具体化无法完成的事情
  • Android Wear 5.1 手腕手势 API?

    适用于可穿戴设备的 Android 5 1 1 引入了通过旋转 轻拂手腕来关闭通知的功能 这个API是否暴露给开发者使用 我无法找到任何相关信息 并且他们的可穿戴设备开发人员网站似乎没有更新 不 目前没有适用于 Wear 1 0 设备的手腕
  • 如何在Silverlight Image控件上显示TIFF(以Byte[]的形式)

    我创建了一个窗口服务 将所有 TIFF 文件放入数据库并将它们存储为Byte 现在我希望能够通过Silverlight Image控件来显示它们 所以我在绑定 XAML 期间使用转换器来转换Byte to Bitmap因为Image Sou
  • Delphi - 从类和接口继承(适配器模式)?

    我正在尝试执行 GoF 适配器模式 在 C 示例中 我遵循的 Adapter 类继承了原始类和一个适配接口 据我所知 在Delphi 2007 中 这是不可能的 或者是吗 因为如果一个类继承一个接口 它需要从 TInterfacedObje
  • Strawberry Perl v5.30.0 无法安装 Tcl (Windows 10)

    我从下载并安装了草莓 perl 5 30 0 1 64bit msi草莓perl com http strawberryperl com 在我的 Windows 10 上并尝试使用 cpan 安装 Tcl 模块 但由于缺少 tclsh 而失
  • 通过预定义的静态地址访问寄存器在 C++ 中是未定义的行为吗?

    我正在编译一个 C 程序以在独立环境中运行 并且我正在运行的 CPU 定义了一个可用的 32 位外设寄存器 编辑 内存映射 at PERIPH ADDRESS 正确对齐 并且不与任何其他 C 对象 堆栈等重叠 我编译以下代码PERIPH A
  • cmake、add_custom_command 以及来自不同目录的依赖项

    我有一个关于 CMake 的问题 这似乎是这里常见的问题 但没有一个答案似乎能解决我的问题 In the details子目录下有一个CMakeLists txt其中包含 add custom command OUTPUT part out
  • gforth 出错,libtool 编译失败

    我正在尝试跑步gforth与Rosetta 代码上的 Echo 服务器 https rosettacode org wiki Echo server 但是我得到以下信息 sh 1 libtool not found in file incl
  • 从 GridView 发起的 ContextMenu

    只是想知道是否有人可以帮助解决这个问题 我正在学习但无法弄清楚 如果我使用上下文菜单注册 GridView 对象 如下所示 registerForContextMenu gridview 如何确定菜单是从网格中的哪个视图对象 方块启动的 任
  • iOS:使用 iPad 键盘的 Enter 键进行操作

    我有两个文本字段 在第一个文本字段中我写 Hello 当我在 iPad 键盘中按 Enter 时 我希望在第二个文本字段中出现 World 如何使用 Enter 在我的应用程序中创建操作 您通常会将视图控制器指定为文本字段的委托 然后实现t
  • spring-boot 在单个 Web 应用程序路径上设置基本身份验证?

    我正在尝试在基于 spring boot spring MVC 的应用程序中设置单个路径 basic 以进行基本身份验证保护 我将使用我自己的自定义配置参数进行配置 因此用户名和密码只是 admin 和 admin 目前这适用于 basic