Tôi biết rằng bảo mật REST API là chủ đề được bình luận rộng rãi nhưng tôi không thể tạo một nguyên mẫu nhỏ đáp ứng các tiêu chí của mình (và tôi cần xác nhận rằng các tiêu chí này là thực tế). Có rất nhiều lựa chọn về cách bảo mật tài nguyên và cách hoạt động với bảo mật Spring, tôi cần phải làm rõ xem nhu cầu của mình có thực tế không.
Yêu cầu của tôi
- Trình xác thực dựa trên mã thông báo - người dùng sẽ cung cấp thông tin đăng nhập của nó và nhận mã thông báo truy cập giới hạn thời gian và duy nhất. Tôi muốn quản lý việc tạo mã thông báo, kiểm tra tính hợp lệ, hết hạn trong quá trình triển khai của riêng tôi.
- Một số tài nguyên REST sẽ được công khai - không cần xác thực gì cả,
- Một số tài nguyên sẽ chỉ có thể truy cập được đối với người dùng có quyền quản trị viên,
- Tài nguyên khác sẽ có thể truy cập được sau khi cấp quyền cho tất cả người dùng.
- Tôi không muốn sử dụng Xác thực cơ bản
- Cấu hình mã Java (không phải XML)
Tình trạng hiện tại
API REST của tôi hoạt động rất tốt, nhưng bây giờ tôi cần bảo mật nó. Khi tìm kiếm giải pháp, tôi đã tạo một javax.servlet.Filter
bộ lọc:
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String accessToken = request.getHeader(AUTHORIZATION_TOKEN);
Account account = accountDao.find(accessToken);
if (account == null) {
throw new UnauthorizedException();
}
chain.doFilter(req, res);
}
Nhưng giải pháp này với javax.servlet.filters
không hoạt động như tôi cần vì có vấn đề với việc xử lý ngoại lệ thông qua @ControllerAdvice
Spring servlet dispatcher
.
Tôi cân gi
Tôi muốn biết liệu những tiêu chí này có thực tế không và nhận bất kỳ trợ giúp nào, cách bắt đầu bảo mật API REST với Spring Security. Tôi đã đọc nhiều hướng dẫn (ví dụ: Spring Data REST + Spring Security ) nhưng tất cả đều hoạt động ở cấu hình rất cơ bản - người dùng với thông tin đăng nhập của họ được lưu trữ trong bộ nhớ trong cấu hình và tôi cần làm việc với DBMS và tạo trình xác thực riêng.
Xin vui lòng cho tôi một số ý tưởng làm thế nào để bắt đầu.