我正在使用Spring Boot开发一个应用程序。现在,我想实现帐户控制,并介绍Spring Session和Spring Security。这是基于REST服务的后端应用程序,前端将是使用这些服务的单独应用程序。我想控制访问资源的每个用户都已登录。
我不希望Spring Security自动处理登录,我想在我现有的CustomerController中实现我的自定义登录服务,该客户控制器正在控制其他服务。
我的控制器:
@RestController
@RequestMapping("/customer")
public class CustomerController {
@Autowired
private AuthenticationService authenticationService;
@PostMapping("/login")
public ResponseEntity loginSubmit(@RequestBody LoginForm form) {
Errors errors = authenticationService.validateLoginForm(form);
if (!errors.hasErrors()) {
CustomerDTO result = authenticationService.findCustomerByEmailAndPassword(form);
return new ResponseEntity(result, HttpStatus.OK);
} else {
return new ResponseEntity(errors.getAllErrors(), HttpStatus.OK);
}
}
@GetMapping("/login")
public ResponseEntity testBrowser() {
return new ResponseEntity("Hello world", HttpStatus.OK);
}
[ . . . Other services . . . ]
}
Spring Security配置:
@EnableWebSecurity
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/customer/login")
.permitAll()
.and()
.logout()
.permitAll()
.and()
.httpBasic();
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/h2-console/**");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
有效地,这限制了所有未登录的用户访问除登录之外的任何服务。在控制器中,我实现了两种登录方法。一个是用于测试目的的GET,另一个是POST。当我使用浏览器(GET)进行访问时,它可以工作并且可以到达断点。但是,当我尝试POST(通过Postman)时,它会返回401 Unauthorized(未授权),就像其他需要登录的服务一样。断点永远不会被击中。
我相信我会遵循这种模式。我想念什么?
答案 0 :(得分:1)
Spring Security文档中提到了两个参数:
第一个是在未登录的情况下使用GET重定向用户的位置,第二个是使用POST提交登录页面的表单的位置。
您收到401未经授权,因为login-processing-url的默认值为/ login而不是/ customer / login
docs:https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/