我正在学习Spring Security,并试图创建一个简单的web服务来保存书名。我正在尝试实现我的安全性,这样每个人都可以在我的/book/book端点上使用GET,并且授权用户可以发布到/book/book。由于某些原因,我的POST端点显示我的用户是经过授权的,即使我已经使用正确的凭据添加了身份验证头。
我一直在网上查看不同的例子,但我似乎就是找不到我的错误在哪里。
我的书包含一个名为蝙蝠侠的用户,该用户的用户角色对于POSTing to / UserDetailsService /POSTing是必需的
@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的GET请求。这部分起作用了。
对/book/book的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);
}我的Book类
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Book {
@Id
@GeneratedValue
private Long id;
private String title;
}预期结果是对/book/book的未经授权的GET请求和对/book/book的授权的POST请求
发布于 2019-03-31 09:58:18
你在用Spring Boot吗?
有一件事对我来说似乎很奇怪,那就是你没有用你的CustomUserDetailsService做任何事情。
尝试添加到CustomSecurityConfig
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService());
}发布于 2020-01-22 05:43:53
问题出在我的Spring依赖的版本上。当我升级版本时,这个问题不再出现。
https://stackoverflow.com/questions/55433835
复制相似问题