テーブルzを保持カラムa、b、cを持っているといいますか?スプリングMVCと休止状態を確保するためのベストプラクティス
カラムaとbは、許可されたユーザが使用でき、カラムcは管理者だけが使用できます。
私の休止状態エンティティはテーブルzに基づいています。私のスプリングMCUコントローラには、読み込みと書き込みのメソッドがあります。私は春のセキュリティを使用してロールを使用してmvcコントローラを保護することができます。
問題は...(クライアントのフロントエンドがこれを明示的に提供しない場合でも)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(iはメソッドレベルで "専用" アクセスを制限コントローラ)
conrete例えば以下[OK]を、
@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);
}
これをより具体的な問題にスケールする必要があります。 See [ask] – charlietfl
にいくつかのコードを追加しました。 –