我是Spring Boot的新手,我开始使用一个简单的应用程序,并使用CrudRepositories提供标准的api(GET,POST,PATCH,DELETE)。
使用crud存储库的标准公开api有没有一种简单的方法来实现这一点?或者是实现我自己的api端点的唯一安全方法?
类别:
/**
* A category.
*/
@Entity
@Data
@NoArgsConstructor
@RequiredArgsConstructor
public class Category extends BaseEntity {
private String description;
private Boolean confidential;
@OneToMany(mappedBy = "category")
@JsonIgnore
private Set<Entry> entries;
}
CategoryRepository:
/**
* Spring Data CRUD repository for the Category entity.
*/
@SuppressWarnings("unused")
public interface CategoryRepository extends CrudRepository<Category, Long> { }
参赛作品:
/**
* A entry.
*/
@Entity
@Data
public class Entry extends AuditingEntity {
private String title;
private String value;
@ManyToOne
@JsonBackReference
private Category category;
}
EntryRepository:
/**
* Spring Data CRUD repository for the Entry entity.
*/
@SuppressWarnings("unused")
public interface EntryRepository extends CrudRepository<Entry, Long> {
List<Entry> findByCategoryId(@Param("categoryId") long categoryId);
}
答案 0 :(得分:1)
使用少量配置向项目添加spring-boot-starter-security
依赖项应解决您的问题。基本上,您希望根据您的具体需要使用@PreAuthorize
和/或@PreFilter
注释。
考虑调整CategoryRepository
:
public interface CategoryRepository extends CrudRepository<Category, Long> {
@Override
@PreFilter("hasRole('ROLE_ADMIN') and filterObject.confidential")
List<Category> findAll();
}
@PreFilter
通过检查用户的过滤对象的角色(ROLE_ADMIN
)和confidential
属性,定义将在返回对象列表之前应用于列表中每个元素的规则。只需根据您的需要进行调整。
@PreAuthorize
和@PreFilter
的更多信息:http://www.baeldung.com/spring-security-prefilter-postfilter。答案 1 :(得分:0)
我会这样做。
List<Category> categories;
if(user is not specific role)
categories = categoryRepository.findByConfidential(false);
else
categories = categoryRepository.findAll();
稍后可以使用列表类别列出类别,每个gategory都有方法getEntries()来获取条目列表。