如何使用 Spring Boot 和 Spring Security 保护 REST API 的安全?

2024-01-02

我知道保护 REST API 是一个被广泛评论的话题,但我无法创建一个满足我的标准的小型原型(并且我需要确认这些标准是现实的)。如何保护资源以及如何使用 Spring 安全性有很多选择,我需要澄清我的需求是否现实。

我的要求

  • 基于令牌的身份验证器 - 用户将提供其凭据并获得唯一且有时限的访问令牌。我想在我自己的实现中管理令牌创建、检查有效性、过期。
  • 一些 REST 资源将是公开的 - 根本不需要进行身份验证,
  • 某些资源只有具有管理员权限的用户才能访问,
  • 其他资源在所有用户授权后才可以访问。
  • 我不想使用基本身份验证
  • Java代码配置(不是XML)

当前状态

我的 REST API 工作得很好,但现在我需要保护它。当我寻找解决方案时,我创建了一个javax.servlet.Filter filter:

  @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;

        String accessToken = request.getHeader(AUTHORIZATION_TOKEN);
        Account account = accountDao.find(accessToken);

        if (account == null) {    
            throw new UnauthorizedException();    
        }

        chain.doFilter(req, res);

    }

但是这个解决方案与javax.servlet.filters无法按我的需要工作,因为异常处理存在问题@ControllerAdvice与春天servlet dispatcher.

我需要的

我想知道这些标准是否现实并获得任何帮助,如何开始使用 Spring Security 保护 REST API。我读了很多教程(例如Spring Data REST + Spring Security https://github.com/spring-projects/spring-data-examples/tree/master/rest/security)但所有工作都在非常基本的配置中 - 用户他们的凭证存储在内存中在配置中,我需要使用 DBMS 并创建自己的身份验证器。

请给我一些如何开始的想法。


基于令牌的身份验证 - 用户将提供其凭据并获得 唯一且有时间限制的访问令牌。我想管理代币 在我自己的实现中创建、检查有效性、过期。

实际上,使用过滤器进行令牌身份验证 - 在这种情况下最好的方法

最终,您可以通过 Spring Data 创建 CRUD 来管理 Token 的属性,例如过期等。

这是我的令牌过滤器:http://pastebin.com/13WWpLq2 http://pastebin.com/13WWpLq2

和令牌服务实施

http://pastebin.com/dUYM555E http://pastebin.com/dUYM555E

一些 REST 资源将是公开的 - 根本不需要进行身份验证

这不是问题,你可以通过 Spring 安全配置来管理你的资源,如下所示:.antMatchers("/rest/blabla/**").permitAll()

某些资源只有具有管理员权限的用户才能访问,

看一眼@Secured类的注释。例子:

@Controller
@RequestMapping(value = "/adminservice")
@Secured("ROLE_ADMIN")
public class AdminServiceController {

其他资源在所有用户授权后都可以访问。

回到 Spring Security 配置,您可以像这样配置您的 url:

    http
            .authorizeRequests()
            .antMatchers("/openforall/**").permitAll()
            .antMatchers("/alsoopen/**").permitAll()
            .anyRequest().authenticated()

我不想使用基本身份验证

是的,通过令牌过滤器,您的用户将得到身份验证。

Java代码配置(不是XML)

回到上面的话,看看@EnableWebSecurity。 你的班级将是:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {}

你必须覆盖配置方法。下面的代码,只是举例说明如何配置匹配器。这是来自另一个项目的。

    @Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers("/assets/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
                .usernameParameter("j_username")
                .passwordParameter("j_password")
                .loginPage("/login")
                .defaultSuccessUrl("/", true)
                .successHandler(customAuthenticationSuccessHandler)
                .permitAll()
            .and()
                .logout()
                .logoutUrl("/logout")
                .invalidateHttpSession(true)
                .logoutSuccessUrl("/")
                .deleteCookies("JSESSIONID")
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .and()
                .csrf();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Spring Boot 和 Spring Security 保护 REST API 的安全? 的相关文章

随机推荐

  • DocumentDB - 集合中的 WHERE 子句

    给定一个来自 Microsoft 示例的示例文档 id AndersenFamily lastName Andersen parents firstName Thomas firstName Mary Kay children firstN
  • 如何将数组(JSON数组)转换为Map?

    我的脚本返回一个数组 JSON 数组 如下所示 redirectCount 0 encodedBodySize 60962 unloadEventEnd 0 responseEnd 1601 699999999255 domainLooku
  • 头递归和尾递归的区别[重复]

    这个问题在这里已经有答案了 我试图找出这两种递归策略之间的区别 我被告知的定义如下 尾递归 如果调用返回后无需执行任何操作 即调用返回时 返回值立即从调用函数返回 则调用是尾递归的 头递归 当函数的第一条语句是递归调用时 调用是头递归的 在
  • 如何计算 Ruby 数组中相同字符串元素的数量

    我有以下内容Array Jason Jason Teresa Judah Michelle Judah Judah Allison 我如何为每个生成一个计数相同的元素 Where Jason 2 Judah 3 Allison 1 Tere
  • 无法从 Google Sheets API 链接访问 JSON 数据

    v3 的 Google Sheets API 已被弃用 该链接不再有效https spreadsheets google com feeds list
  • std::dynarray 与 std::vector

    C 14 呈现std dynarray http en cppreference com w cpp container dynarray std dynarray 是一个序列容器 它将数组封装为 尺寸在施工时固定 并且在整个施工过程中不会
  • 不带 null XMLArray 的 XML 序列化

    让我直接说吧 如果 XMLArray 元素为空 是否可以不序列化它 如下所示 使用了 XML 详细信息 如果它为空 是否可以在 XML 中不包含它 请检查我的代码 并会欣赏一些关于它的想法
  • 如何使用 VS Code 在 .vue 文件中使用 Typescript?

    我正在使用 Visual Studio Code Vue 2 webpack 模板 和 Typescript 这是我的 App vue 组件
  • 使用 vscode 扩展 api 函数的单元测试函数

    我正在尝试找出一种对函数进行单元测试的方法 其中包括 vscode 扩展 api 中包含的辅助函数 例如显示快速选择 用法示例 vscode window showQuickPick one two 我一直在尝试存根和嘲笑那些 但虽然我不确
  • 使用 Automapper 将字符串映射到 List,反之亦然

    基本上我有这个类与我的数据库代表 1 1 public class User public int UserID get set public string Username get set public string Role get s
  • 跟踪 svg 路径(以离散步骤获取 x,y 坐标)[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如何在 SVG 路径上找到多个 均匀分布的 点 我发现它在这里完成code pen https cod
  • CORS 请求已预检,但似乎不应该

    以下跨源 POST 请求 内容类型为 multipart form data 并且仅预检简单标头 根据 W3C 规范 除非我读错了 否则不应该进行预检 我已经确认 Chrome 27 和 Firefox 10 8 3 中会发生这种情况 我没
  • C++ 命名空间,与 Java 包的比较

    我最近完成了一堆 Java 编码 并且已经习惯了非常具体的包命名系统 例如深度嵌套 com company project db 这在 Java AS3 Flex 和 C 中运行良好 我也看到过 C 中应用了相同的范例 但我也听说将 C 命
  • 有没有使用 firebug 的教程/指南?

    我刚刚获得了 Firefox 的附加组件 到目前为止它非常棒 但我所做的只是在页面上移动光标来获取 css html 我知道还有更多的 Firebug 应用程序 既然 Firebug 如此受欢迎 是否有一个初学者指南 或者只是需要练习的东西
  • 如何查找存储过程中使用的表列表,而无需“With(nolock)”字样[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有很大的表数据 每个表都需要以语句 nolock 结尾 请帮我在所有存储过程中查找 Example 如果存储过程使用两个表 a 和 b 并
  • MySQL Linq 使用 .Contains(变量)

    设置信息 VS2013 C EF6 MySQL数据库 Net 连接器 6 9 5 我正在尝试创建一种方法 该方法使用部分名称作为搜索条件返回帐户记录的集合 如果我使用 IQueryable Contains 扩展方法对字符串值进行硬编码 它
  • 是否可以在 React Native 中使用 React hooks?

    在 React 文档中 它说变量和监听器钩子必须在组件内声明 但当我尝试这样做时 React Native 会抱怨 有没有办法在React Native中使用Hooks 或者有谁知道它们将来是否会实施 不过有点像useEffect不管用 当
  • 使用.NET检查AWS中是否存在SQS

    我能够使用 AWSSDK SQS 包中的 AmazonSQSClient 客户端成功将消息发送到 NET 中的队列 如何检查特定队列是否存在以及是否未创建 您需要使用以下命令运行检查AmazonSQSClient GetQueueUrl s
  • bash 脚本中的 if 条件取反

    我一直试图否定以下命令 wget q tries 10 timeout 20 spider http google com if eq 0 then echo Sorry you are Offline exit 1 如果我连接到互联网 则
  • 如何使用 Spring Boot 和 Spring Security 保护 REST API 的安全?

    我知道保护 REST API 是一个被广泛评论的话题 但我无法创建一个满足我的标准的小型原型 并且我需要确认这些标准是现实的 如何保护资源以及如何使用 Spring 安全性有很多选择 我需要澄清我的需求是否现实 我的要求 基于令牌的身份验证