gpt4 book ai didi

java - 如何使用 Spring Boot 和 Spring Security 保护 REST API?

转载 作者:IT老高 更新时间:2023-10-28 11:51:07 26 4
gpt4 key购买 nike

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

我的要求

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

当前状态

我的 REST API 运行良好,但现在我需要保护它。当我在寻找解决方案时,我创建了一个 javax.servlet.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 的解决方案不能按我的需要工作,因为 Spring servlet 通过 @ControllerAdvice 处理异常存在问题调度员.

我需要什么

我想知道这些标准是否现实并获得任何帮助,如何开始使用 Spring Security 保护 REST API。我阅读了许多教程(例如 Spring Data REST + Spring Security ),但所有教程都在非常基本的配置中工作 - 他们的凭据存储在内存中配置中的用户,我需要使用 DBMS 并创建自己的身份 validator 。

请给我一些建议如何开始。

最佳答案

Token based authentication - users will provide its credentials and get unique and time limited access token. I would like to manage token creation, checking validity, expiration in my own implementation.

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

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

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

和 token 服务实现

http://pastebin.com/dUYM555E

Some REST resources will be public - no need to authenticate at all

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

Some resources will be accessible only for users with administrator rights,

看看 @Secured 类的注解。示例:

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

The other resource will be accessible after authorization for all users.

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

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

I don't want to use Basic authentication

是的,通过 token 过滤器,您的用户将通过身份验证。

Java code configuration (not XML)

回到上面的话,看@EnableWebSecurity。你的类(class)将是:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {}

您必须重写 configure 方法。下面的代码,仅举例说明如何配置匹配器。它来自另一个项目。

    @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();
}

关于java - 如何使用 Spring Boot 和 Spring Security 保护 REST API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32548372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com