image.png

  • prefiltering 过滤参数
  • postfiltering过滤的是返回值

    17.1 Applying prefiltering for method authorization

    定义配置类:

    1. @Configuration
    2. @EnableGlobalMethodSecurity(prePostEnabled = true)
    3. public class ProjectConfig {
    4. @Bean
    5. public UserDetailsService userDetailsService() {
    6. InMemoryUserDetailsManager uds = new InMemoryUserDetailsManager();
    7. UserDetails u1 = User.withUsername("nikolai")
    8. .password("123345")
    9. .authorities("read")
    10. .build();
    11. UserDetails u2 = User.withUsername("julien")
    12. .password("12345")
    13. .authorities("write")
    14. .build();
    15. uds.createUser(u1);
    16. uds.createUser(u2);
    17. return uds;
    18. }
    19. @Bean
    20. public PasswordEncoder passwordEncoder() {
    21. return NoOpPasswordEncoder.getInstance();
    22. }
    23. }

    image.png
    定义一个service

    1. @Service
    2. public class ProductService {
    3. /**
    4. * 只允许当product owner是authenticated user时才允许卖product
    5. * @param products
    6. * @return
    7. */
    8. @PreFilter("filterObject.owner == authentication.name")
    9. public List<Product> sellProducts(List<Product> products) {
    10. return products;
    11. }
    12. }

    定义一个controller

    1. @RestController
    2. public class ProductController {
    3. @Autowired
    4. private ProductService productService;
    5. @GetMapping("/sell")
    6. public List<Product> sellProduct() {
    7. ArrayList<Product> products = new ArrayList<>();
    8. products.add(new Product("beer", "nikolai"));
    9. products.add(new Product("candy", "nikolai"));
    10. products.add(new Product("chocolate", "julien"));
    11. return productService.sellProducts(products);
    12. }
    13. }

    项目启动并测试:
    image.png
    必须保证提供的集合不是不可改变的,不然在aspect进行处理的时候会报异常

    17.2 Applying postfiltering for method authorization

    postfiltering只能用于返回值为arrays或collections
    image.png
    filterObject用来表示返回的集合中的元素,authentication表示的是存储在Security Context中的Authenticated Object
    image.png
    image.png
    controller的逻辑:
    image.png
    测试的结果:
    image.png

    17.3 Using filtering in Spring Data repositories

    添加依赖
    image.png
    image.png
    配置文件:

    1. spring.datasource.url=jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    2. spring.datasource.username=root
    3. spring.datasource.password=root
    4. spring.datasource.initialization-mode=always

    实体类
    image.png
    repository
    image.png
    controller
    image.png
    启动并测试:
    image.png
    在repository中使用PostFilter不是最好的选择,我们应该确保我们不会从数据库中选择我们不需要的数据

  1. 我们添加SecurityEvaluationContextExtention到spring context中
  2. 我们调整查询条件

该类是spring-security-data依赖的下的类
image.png
image.png
启动并测试:结果与前一种方法一致