如何解决使用MySQL和JPA的Spring自定义安全性拒绝403访问
我试图通过使用UserDetailsService提供身份验证来访问邮递员上的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);
}
}
解决方法
我看到您的安全配置有几个问题:
- 未启用基本身份验证,但您尝试在邮递员中进行基本身份验证
执行以下操作以启用基本身份验证
http
.authorizeRequests()
...
.and()
.httpBasic();
- 我猜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
奖金反馈:
- User.userName->您可能希望使该字段唯一
-
@Repository
在您的存储库界面中不需要此注释 - UserService接口。我看不出有使用该界面和impl的任何理由。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。