Скажем, у меня есть таблица z проведение столбец a, b, c.Лучшая практика обеспечения весеннего mvc и спящего режима
Столбец a и b может использоваться любым авторизованным пользователем, а столбец c может использоваться только администраторами.
Мой объект спящего режима основан на таблице z. Мой контроллер весны mvc имеет метод чтения и записи. Я могу защитить контроллеры mvc, используя роли, используя весеннюю безопасность.
Проблема заключается в том, что мой клиент (угловой разговор через rest/json для контроллера) может получить доступ ко всем столбцам, установив значение для c (даже если клиентский интерфейс не предоставляет это явно) простой настройкой json объект и отправить его методу записи контроллеров. Кроме того, вызов метода чтения возвращает значение столбца c любому пользователю.
Какова хорошая практика доступа к этой таблице на основе ролей?
Хорошо, ниже конкретными видами Например:
Entity:
@Entity
@Table(name = "hotel")
@XmlRootElement
public class Hotel extends BaseEntity implements Serializable {
private String name;
private String street;
private String houseNo;
private String postalcode;
private String city;
private String country;
private String shortDesc;
private Boolean landing; // admin acceess only
}
Backend Фасад:
@Component
public class HotelAccessImpl extends BackendBaseAccess implements HotelAccess {
@Autowired
private AccountAccess accountAccess;
@Override
public List<Hotel> findAll() {
TypedQuery<Hotel> query = getEm().createQuery("FROM Hotel WHERE DELETED = false ORDER BY CREATED DESC",
Hotel.class);
List<Hotel> results = query.getResultList();
return results;
}
@Override
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRES_NEW)
public Hotel upsert(Hotel hotel) {
if (find(hotel.getId()) == null) {
getEm().persist(hotel);
} else {
hotel = getEm().merge(hotel);
}
getEm().flush();
return hotel;
}
}
API (контроллер, где я ограничить доступ "только" на уровне метода)
@RestController
@RequestMapping("hotel")
public class HotelController extends BaseController {
private static Logger logger = LogManager.getLogger(HotelController.class);
@Autowired
private FileAccess fileAccess;
@Autowired
private HotelAccess hotelAccess;
@Autowired
private MailAccess mailAccess;
@RequestMapping(value = "list", method = RequestMethod.GET)
public ResponseEntity<List<Hotel>> findAll() {
logger.info("FindAll");
return new ResponseEntity<List<Hotel>>(hotelAccess.findAll(), HttpStatus.OK);
}
@RequestMapping(value = "upsert", method = RequestMethod.POST)
public ResponseEntity<Hotel> upsert(@RequestBody Hotel hotel) {
logger.info("Upsert: " + hotel.getName());
if (isAuthorized(hotel.getAccount())) {
Hotel response = hotelAccess.upsert(hotel);
if (response.isInitial()) {
mailAccess.sendHotelUpsert(response);
}
return new ResponseEntity<Hotel>(response, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
}
}
@Secured({ "ROLE_ADMIN" })
@RequestMapping(value = "delete", method = RequestMethod.POST)
public ResponseEntity<Hotel> delete(@RequestBody Hotel hotel) {
logger.info("Delete: " + hotel.getId());
boolean deleted = hotelAccess.delete(hotel);
return (deleted) ? new ResponseEntity<>(HttpStatus.OK) : new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
Необходимо уменьшить масштаб до более конкретной проблемы. См. [Ask] – charlietfl
добавил код, надеюсь, теперь это даст больше объяснений. –