使用Spring Security手动实现登录

时间:2018-12-19 15:14:25

标签: java spring spring-boot spring-security spring-session

我正在使用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(未授权),就像其他需要登录的服务一样。断点永远不会被击中。

我相信我会遵循这种模式。我想念什么?

1 个答案:

答案 0 :(得分:1)

Spring Security文档中提到了两个参数:

  1. 登录页面
  2. login-processing-url

第一个是在未登录的情况下使用GET重定向用户的位置,第二个是使用POST提交登录页面的表单的位置。

您收到401未经授权,因为login-processing-url的默认值为/ login而不是/ customer / login

docs:https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/