使用MySQL和JPA的Spring自定义安全性拒绝403访问

问题描述

我试图通过使用UserDetailsS​​ervice提供身份验证来访问邮递员上的rest api,但是每次我每次发出403访问被拒绝请求时都触发该请求。 POST和GET方法的行为相同。我已经阅读了论坛上记录的其他问题,但是每个答案都说这是由于CSRF引起的,我禁用了它,但是问题仍然相同。

完整的代码已启用:https://github.com/afulz29/spring-security-demo.git

请帮助我,自3天以来,我一直在努力解决这个问题。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer{

@Autowired
UserDetailsService userDetailsService;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .userDetailsService(userDetailsService)
        .passwordEncoder(passwordEncoder());
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    http
        .authorizeRequests()
            .antMatchers("/api/**").authenticated().anyRequest().hasAnyRole("ADMIN");
}

@Bean
public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**").allowedMethods("*");
}
}



@RestController
@RequestMapping("/api")
public class UserController {

@Autowired
private UserService userService;

@GetMapping(path = "/users")
public User getUserById(@RequestParam("userId") Integer userId) {
    return userService.getUserById(userId);
}

@PostMapping(path = "/users",consumes = MediaType.APPLICATION_JSON_VALUE)
public User addUser(@RequestBody User user) {
    return userService.addUser(user);
}
}

Postman request

解决方法

我看到您的安全配置有几个问题:

  1. 未启用基本身份验证,但您尝试在邮递员中进行基本身份验证

执行以下操作以启用基本身份验证

        http
            .authorizeRequests()
                ...
                .and()
                .httpBasic();
  1. 我猜POST / api / users是用户注册端点。您必须将此端点列入白名单,以便任何人都可以注册
        http
            .authorizeRequests()
                    .antMatchers( HttpMethod.POST,"/api/users").permitAll()
                    .antMatchers("/api/**").authenticated()
                    .anyRequest().hasAnyRole("ADMIN")
                .and()
                    .httpBasic();

测试:

创建用户

POST: localhost:8080/api/users

{
        "userName" : "user1","password": "pass"
}

获取用户信息


GET: localhost:8080/api/users?userId=1   //use the correct ID

With Basic Auth: userName = user1,password = pass

奖金反馈:

  1. User.userName->您可能希望使该字段唯一
  2. @Repository在您的存储库界面中不需要此注释
  3. UserService接口。我看不出有使用该界面和impl的任何理由。