首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的/book/book POST终结点返回未授权

为什么我的/book/book POST终结点返回未授权
EN

Stack Overflow用户
提问于 2019-03-31 01:13:18
回答 2查看 96关注 0票数 0

我正在学习Spring Security,并试图创建一个简单的web服务来保存书名。我正在尝试实现我的安全性,这样每个人都可以在我的/book/book端点上使用GET,并且授权用户可以发布到/book/book。由于某些原因,我的POST端点显示我的用户是经过授权的,即使我已经使用正确的凭据添加了身份验证头。

我一直在网上查看不同的例子,但我似乎就是找不到我的错误在哪里。

我的书包含一个名为蝙蝠侠的用户,该用户的用户角色对于POSTing to / UserDetailsService /POSTing是必需的

代码语言:javascript
复制
@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方法应该只允许授权用户使用。此部分不起作用,并向所有人返回未经授权的内容。

代码语言:javascript
复制
@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看起来像这样

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@Repository
public interface BookRepository extends JpaRepository<Book, Long>{
    List<Book> findBookByTitle(String title);
}

我的Book类

代码语言:javascript
复制
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Book {
    @Id
    @GeneratedValue
    private Long id;
    private String title;
}

预期结果是对/book/book的未经授权的GET请求和对/book/book的授权的POST请求

EN

回答 2

Stack Overflow用户

发布于 2019-03-31 09:58:18

你在用Spring Boot吗?

有一件事对我来说似乎很奇怪,那就是你没有用你的CustomUserDetailsService做任何事情。

尝试添加到CustomSecurityConfig

代码语言:javascript
复制
@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService());
    }
票数 0
EN

Stack Overflow用户

发布于 2020-01-22 05:43:53

问题出在我的Spring依赖的版本上。当我升级版本时,这个问题不再出现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55433835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档