如何使用 Spring 通过 OAuth2 保护 MVC 应用程序?

2023-11-22

对不起,我的英语。

我有一个可以以通常方式登录的应用程序。

@Configuration
@EnableWebSecurity
public class LoginSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        System.out.println("LoginSecurityConfig :: configure");

        auth.jdbcAuthentication().dataSource( getDataSource() )
            .passwordEncoder( new BCryptPasswordEncoder(16) )
            .usersByUsernameQuery(
                "select user_name as username,password,enabled from users where user_name=?")
            .authoritiesByUsernameQuery(
                "select user_name as username, role_name from users_roles ur join users u on ur.user_id = u.user_id and u.user_name = ?");

    }

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


        http
        .csrf().disable()
        .authorizeRequests()
        .antMatchers("/login*").anonymous()
        .antMatchers("/resources/**").permitAll()
        .antMatchers("/fotos/**").permitAll()
        .antMatchers("/users").access("hasRole('ROLE_ADMIN')")
        .antMatchers("/user").access("hasRole('ROLE_ADMIN')")
        .anyRequest().authenticated()
        .and()

        .formLogin()
        .loginPage("/loginPage")
        .defaultSuccessUrl("/home", true)
        .failureUrl("/loginPage?error=true")
        .loginProcessingUrl("/login")
        .usernameParameter("username")
        .passwordParameter("password")
        .and()

        .logout()
        .logoutSuccessUrl("/loginPage")
        .invalidateHttpSession(true); 



    }    

}

使用此功能,我可以尝试访问任何受保护的资源,系统会将我发送到loginPage我可以在哪里发帖username and password到内部login控制器然后我有Principal并且可以访问受保护的资源(家庭、用户、用户)。工作正常。

但是...我需要删除用户控制数据库内容并使用 OAuth2 来允许相同类型的访问。我不想再有任何用户在我的数据库中。我需要一个登录屏幕,然后需要一个令牌请求,例如http://myserver/oauth/token?grant_type=password&username=admin&password=admin通过client_id and client_secret in Basic。我知道如何执行“获取令牌”部分,并且我的服务器工作正常,并为我提供令牌和刷新令牌,但仅使用 Postman,因为我不知道如何在我的 Web 应用程序代码中使用它。我发现的所有教程都在同一应用程序中使用服务器和客户端,实际上没有展示如何使用 OAuth2 远程服务器。

已经尝试使用this。这是一个很棒的教程,非常接近我需要的内容,但对我来说太复杂了。

我有这段代码并了解它可以使用服务器并使用客户端凭据发出令牌,但不知道如何向用户提供登录屏幕并获取他的凭据来完成请求(GET part).

@Configuration
@EnableResourceServer
public class OAuth2ResourceServerConfigRemoteTokenService extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(final HttpSecurity http) throws Exception {
                http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                    .and()
                    .authorizeRequests().anyRequest().permitAll();              
    }

    @Primary
    @Bean
    public RemoteTokenServices tokenServices() {
        final RemoteTokenServices tokenService = new RemoteTokenServices();
        tokenService.setCheckTokenEndpointUrl("http://myoauthserver/oauth/check_token");
        tokenService.setClientId("clientid");
        tokenService.setClientSecret("password");
        return tokenService;
    }

}

那么...我如何保护我的系统,从用户那里获取登录名和密码,并使用此代码来控制凭据,就像我使用常用​​的数据库方法一样?

或者 OAuth2 仅适用于安全 REST API?

enter image description here

请对新手友好,因为我不太习惯使用 Spring。


我自己最近一直在研究这个问题,我希望我能说我有一个简单的答案,但我没有。我必须首先提出这样的问题:这是一个 Web 应用程序(JSP 等)还是一个 Web 应用程序使用的 REST API,还是一个移动应用程序使用的 REST API,等等。

这很重要的原因是,您首先必须选择 OAuth2 配置文件和授权类型之一,并且它们在 Spring 中都有不同的要求和配置。

此外,您是否正在尝试与第三方 OAuth2 身份验证提供程序(例如 Facebook)集成,或者您的应用程序是否同时充当身份验证提供程序(发生登录和密码验证)和受保护资源(网页请求或 API 调用所在的位置)到)?

所以我想我能做的最好的就是给你布置一些作业:

(1) 阅读各种 OAuth2 配置文件并确定哪一个最适合您的应用程序,并学习所有术语(例如,什么是客户端密钥?)。

这绝对不是您可以在不理解示例代码的情况下剪切和粘贴示例代码的情况之一。如果您对 OAuth2 的工作原理没有合理的理解,您将会遇到很多困难。

另外:我们在这里讨论的是安全性,因此在不了解安全性的情况下做事是一个非常糟糕的主意。如果你不小心,你可能会认为它有效,但实际上你很容易受到攻击。

(2) 如果您不熟悉 Spring Framework Security,您需要有基本的基础才能理解您在做什么。

(3) 一旦您知道要使用哪个配置文件,请在谷歌搜索中使用它,例如“Spring oauth2 隐式授权”可以找到为该配置文件量身定制的示例。

有一些例子,这是一个很好的起点,尽管我发现我无法将任何示例直接应用到我的应用程序中,因为它们的假设和我的应用程序之间存在细微的差异。

Spring 参考指南也很有帮助,但不一定提供您可能遇到的所有问题的所有详细信息。最后,尝试在您的应用程序中实现。

您需要一些好的工具来向您的应用程序发送请求(我喜欢 PostMan 用于此目的),以便您可以检查来回的数据。 OAuth2 涉及一系列复杂的 HTTP 重定向,因此测试可能有点困难。

另外,要有耐心。我认为自己是 Spring 专家,但我仍然花了几天时间才让事情完全按照我想要的方式工作。请注意,实际上您最终编写的代码非常少,但让少量代码完全正确是很困难的。

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

如何使用 Spring 通过 OAuth2 保护 MVC 应用程序? 的相关文章

随机推荐

  • Shiny - 在输出中使用观察函数调用的结果

    我有一个闪亮的应用程序 其中基于所选选项 列 数据集动态重新计算 重新计算的结果用于向用户显示另一组选项并创建绘图 目前我正在使用observe 读取用户选择 重新计算数据集并更新 UI 但是 当显示输出 图 时 我必须再次重新计算 因为o
  • 无法解析 com.android.support:appcompat-v7:28.0.0

    对此有很多不同的问题 但使用时存在问题v7 28 0 v7 28 v7 28 0 0 rc02但是当我同步我的项目时 我收到此错误 无法解决 app debug compileClasspath 的依赖关系 可以 无法解析 com andr
  • 如何防止 Android 设备从 Qt 应用程序进入睡眠状态

    我正在 Android 上部署 Qt 应用程序 需要防止设备进入待机状态 否则 我的线程会被中断 而且我的 BLE 连接也会丢失 我发现这样 如何以编程方式防止 Android 设备进入睡眠状态 应执行此 Java 代码 PowerMana
  • 如何知道每次通话/短信的 SimSlot 号码?

    您只知道广播接收器中的 sim 插槽号 经过一个月的研究 我得到了一个对我来说效果很好的解决方案 如下所示 首先将 android permission READ PHONE STATE 权限添加到您的清单文件中 实现电话事件接收器 为您的
  • 如何在 android 文本视图中使用 getlinecount()

    我想知道我的文本视图中有多少行 我已经设置了文本视图文本 然后我想获取文本视图中需要多少行 我使用 mytextview getLineCount 但它不起作用 它总是返回 0 有人能帮我吗 您需要发布获取行数的方法 这是示例代码 imag
  • C# Windows 服务自终止服务

    如何让服务自行终止 Environment Exit 将导致应用程序启动 但服务保持运行 任何想法 您可以使用 SCM 从服务本身关闭您的服务 System ServiceProcess ServiceController svc new
  • 启用 CORS 的服务器不拒绝请求

    我正在尝试使用快递Cors使用我的 resitfy 服务器 它似乎并没有拒绝来自其他 ip 的请求 我在本地工作 所以我尝试将 origin 设置为随机公共 IP 但我的所有请求仍在处理中 这是我的路线 module exports fun
  • Hibernate:删除多对多关联

    我有两个具有多对多关联的表 数据库片段 loads Id Name sessions Id Date 会话负载 LoadId会话ID Hibernate 映射片段 loads hbm xml
  • 跨数据库外键错误

    这是我的第一个数据库 DB1 的模型 from django db import models class Company models Model name models CharField max length 100 null Tru
  • 初始化 Objective-C 类别中的静态变量

    我试图创建一个静态变量来存储图像字典 不幸的是 我能找到的初始化它的最好方法是检查使用该变量的每个函数 由于我是在类别内创建此变量 因此我不能仅在初始化程序内初始化它 有没有更简洁的方法来初始化 navigationBarImages st
  • Typescript:对象和基元之间的 keyof typeof union 始终是 never

    首先 我的问题的一些背景信息 我有一个项目 在其中我通过 Socket IO 接收一个对象 因此我没有关于它的类型信息 此外 它是一种相当复杂的类型 因此需要进行大量检查以确保接收到的数据良好 问题是我需要访问由接收到的对象中的字符串指定的
  • 不(最大宽度:512px)不工作

    我有以下 HTML 页面 Foobar 但是 这对窗口没有响应width 媒体规则从未适用 如果我删除not 它按预期工作 我不明白什么not max width 是的 我知道还有其他方法可以完成同样的事情 并且not max width
  • 角度单元测试失败,但不是本地测试

    升级到 Angular 版本 11 后 Travis CI 上的单元测试现在失败 在本地 它们确实成功了 即使在使用相同的节点 nvm 和 npm 版本进行全新安装之后 所有单元测试的错误都是相同的 Failed fn bind is no
  • Java Regex 从 HTML 锚点 (...) 标记获取文本

    我正在尝试获取某个标签内的文本 所以如果我有 a href http something com Found a a 我希望能够检索Found text 我正在尝试使用正则表达式来做到这一点 我能够做到 如果 a href a a gt 我
  • 显示 w.r.t. 的语义转义字符

    考虑以下示例 gt ghci 外壳 gt writeFile d show d cat d d gt writeFile d d cat d d gt writeFile backslash show cat backslash gt wr
  • Python - 不支持的类型:范围和范围

    我在尝试运行脚本时遇到这个奇怪的错误 代码似乎是正确的 但似乎 python 3 不喜欢这部分 def function x if integer return int x else return x non nil randrange 2
  • 避免内存泄漏/使用 Javascript

    我是 jQuery 的新手 我有点困惑这是否正常或可能导致内存泄漏 代码如下 在某些日期过滤器上为每个新值调用此方法 function preapreTooltip chart var tickLength chart xAxis 0 ti
  • linux uinput:简单的例子?

    我在获取时遇到一些问题both代码的两侧使用uinput在职的 Based on Getting started with uinput the user level input subsystem dead link archived I
  • 如何将PictureBox.Image保存到文件?

    我使用以下命令将 jpgImage 写入 PictureBox Image var jpgImage new Byte jpgImageSize pictureBox Image new Bitmap new MemoryStream jp
  • 如何使用 Spring 通过 OAuth2 保护 MVC 应用程序?

    对不起 我的英语 我有一个可以以通常方式登录的应用程序 Configuration EnableWebSecurity public class LoginSecurityConfig extends WebSecurityConfigur