UserDetailsServiceを使用して認証を提供することにより、postmanで残りのAPIにアクセスしようとしていますが、リクエストを実行するたびに、403 AccessDeniedをリクエストします。動作は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();
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
ボーナスフィードバック:
@Repository
この注釈は、リポジトリインターフェイスでは必要ありませんこの記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加