我用SpringBoot做了一个Rest API项目。控制器中有各种标准的方法,如get、post、put和delete。
我的目标是让我只能通过我的angular应用程序访问api调用(get调用除外(。其他方法(张贴、放置和删除(无法从外部访问。
我试图用WebSecurityConfigurerAdapter和configure函数来解决这个问题,但我无法得到它。当我第一次在pom.xml上导入安全依赖项(spring-boot-starter-security(时,所有方法都被阻止了。我试图在configure方法中允许get调用,但后来我无法通过poster使用基本的auth进行post调用。每次我得到403禁止错误。
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.antMatchers(HttpMethod.GET)
.antMatchers("/h2-console/**")
.antMatchers("/login/**");
}
}
顺便说一下,我想在application.properties文件中为spring安全性创建自己的用户名和密码。但我认为如果我使用SecurityConfig配置文件,这是不起作用的。
spring.security.user.name=myUsername
spring.security.user.password=myPassword
不管我做了什么尝试,我怎么能用最短、最简单的方法做到这一点呢?那么我如何从我的angular应用程序中调用被阻止的方法(post、put、delete(呢?
谢谢。
如果我没有错的话,您希望您的项目对GET
方法没有访问限制,并且每个人都应该可以访问此方法类型。
所有剩余的请求(post、put、delete等(都可以通过身份验证进行访问。
您可以通过以下方式实现这一点。假设你有一个控制器如下:
@RestController
@RequestMapping("security")
public class SecurityController {
@GetMapping("get")
public ResponseEntity<String> get() {
return ResponseEntity.ok("Get Method");
}
@PostMapping("post")
public ResponseEntity<String> post() {
return ResponseEntity.ok("Post Method");
}
@PutMapping("put")
public ResponseEntity<String> put() {
return ResponseEntity.ok("Put Method");
}
@DeleteMapping("delete")
public ResponseEntity<String> delete() {
return ResponseEntity.ok("delete");
}
}
在这种情况下,您的WebSecurityConfigurer
应该如下所示:
@EnableWebSecurity
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().authorizeRequests()
.antMatchers(HttpMethod.GET).permitAll()
.anyRequest().authenticated().and().httpBasic();
}
}
这里要做的第一件事是确定GET
(一种http方法(可以在没有任何授权的情况下访问。然后,它授权其余HttpMethod
的访问。最后,我们指定使用Basic Auth
和httpBasic()
。此信息由application.properties
文件中定义的username
和password
信息组成。
通过检查这里的问题,您可以看到HttpSecurity
和WebSecurity
之间的区别。
我希望这个答案对你有帮助。