我正在学习Spring Security,并且正在尝试制作一个拥有书名的简单Web服务。我正在尝试实现我的安全性,以便每个人都可以在我的/ books / book端点上使用GET,并且授权用户可以POST到/ books / book。由于某种原因,我的POST端点说我的用户被授权,即使我通过添加具有正确凭据的身份验证标头也是如此。
我一直在网上查看不同的示例,但是我似乎无法找出我的错误所在。
我的UserDetailsService拥有一个名为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请求
答案 0 :(得分:0)
您正在使用Spring Boot吗?
对我来说似乎很奇怪的一件事是您没有使用CustomUserDetailsService做任何事情。
尝试添加到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依赖项的版本上。当我升级版本时,问题不再发生。