【发布时间】:2016-10-20 05:36:56
【问题描述】:
假设我有一个 table z 包含 a,b,c 列。
a 列和 b 列可供任何授权用户使用,c 列只能由管理员使用。
我的休眠实体基于表 z。我的 spring mvc 控制器有一个读写方法。我可以使用 spring security 使用角色来保护 mvc 控制器。
问题是...我的客户端(通过 rest/json 与控制器进行角度交谈)可以通过设置 c 的值(即使客户端前端没有明确提供)来访问所有列,只需设置一个 json 对象并将其发送到控制器的 write 方法。同样调用 read 方法会将 c 列的值返回给任何用户。
根据角色访问该表的最佳做法是什么?
好的,下面是一个具体的例子:
实体:
@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
}
后端外观:
@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);
}
【问题讨论】:
-
需要将其缩小到更具体的问题。见How to Ask
-
添加了一些代码,希望现在能给出更多解释。
标签: angularjs hibernate rest spring-mvc spring-security