为什么我的/ books / book POST端点返回未经授权的信息

时间:2019-03-30 17:13:18

标签: spring spring-boot spring-security

我正在学习Spring Security,并且正在尝试制作一个拥有书名的简单Web服务。我正在尝试实现我的安全性,以便每个人都可以在我的/ books / book端点上使用GET,并且授权用户可以POST到/ books / book。由于某种原因,我的POST端点说我的用户被授权,即使我通过添加具有正确凭据的身份验证标头也是如此。

我一直在网上查看不同的示例,但是我似乎无法找出我的错误所在。

我的UserDetailsS​​ervice拥有一个名为batman的用户,该用户具有POST到/ books / book所需的USER角色

@Component
public class CustomUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String string) throws UsernameNotFoundException {
        return User.withDefaultPasswordEncoder().username("batman").password("pass").roles("ADMIN", "USER").build();

    }

}

我的SecurityConfig应该允许未经授权的用户对/ book / books进行GET请求。这部分有效。

/ book / books的POST方法应仅允许授权用户使用。这部分无效,并且所有人都未经授权返回。

@EnableWebSecurity
public class CustomSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().and().cors().disable().authorizeRequests()
                .antMatchers(HttpMethod.GET, "/books/book").permitAll()
                .antMatchers(HttpMethod.POST, "/books/**").hasRole("ADMIN")
                .and()
                .httpBasic();
    }

}

我的BookController看起来像这样

@RestController
@RequestMapping("/books")
public class BookController {
   @Autowired
   private BookService bookService;

   @GetMapping("/book")
   public ResponseEntity<Object> getAll() {
       return new ResponseEntity<>(bookService.getAll(), HttpStatus.OK);
   }

   @PostMapping("/book")
   public ResponseEntity<Object> add(@RequestBody Book book) {
       bookService.addBook(book);
       return ResponseEntity.ok().build();
   }
}

我的BookService

@Service
public class BookService {

    @Autowired
    private BookRepository bookRepository;

    public Collection getAll() {
        return bookRepository.findAll();
    }

    public void addBook(Book book) {
        bookRepository.save(book);
    }

    public void deleteBook(Long id) {
        bookRepository.deleteById(id);
    }

    public void updateBook(Long id, Book book){
        bookRepository.findById(id).map((entry) -> {
            entry.setTitle(book.getTitle());
            bookRepository.save(book);
            return entry;
        });
    }

}

我的BookRepository

@Repository
public interface BookRepository extends JpaRepository<Book, Long>{
    List<Book> findBookByTitle(String title);
}

我的书本课

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Book {
    @Id
    @GeneratedValue
    private Long id;
    private String title;
}

预期结果是对/ book / books进行未经授权的GET请求,对/ book / books进行授权的POST请求

2 个答案:

答案 0 :(得分:0)

您正在使用Spring Boot吗?

对我来说似乎很奇怪的一件事是您没有使用CustomUserDetailsS​​ervice做任何事情。

尝试添加到CustomSecurityConfig

namespace App;

use Illuminate\Database\Eloquent\Model;

class Vote extends Model
{
    public function user(){
      return $this->belongsTo('App\User');
    }

    public function options(){
      return $this->hasMany('App\Option');
    }
}

答案 1 :(得分:0)

问题出在我的Spring依赖项的版本上。当我升级版本时,问题不再发生。