将@HandleBeforeSave方法添加到我的@RepositoryEventHandler类中会从我的REST API

时间:2016-06-03 17:46:03

标签: java spring rest spring-mvc spring-data-rest

问题

我正在使用spring,在此过程中,我在修改用户时添加了@RepositoryEventHandler(User.class)更新(PUT)。

我希望能够设置对User进行编辑的人员。

我创建的@HandleBeforeCreate适用于HTTP POST,但只要我添加@HandleBeforeSave User REST API就不再可用了。我没有看到正在创建stack trace

问题

我是否遗漏了有关创建@HandleBeforeSave

的内容

@RepositoryEventHandler

@Component
@RepositoryEventHandler(User.class)
public class SpringDataRestEventHandler {

    private final UserRepository userRepository;

    @Autowired
    public SpringDataRestEventHandler(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @HandleBeforeCreate
    public void applyUserInformationUsingSecurityContext(User user) throws  {


        String name = SecurityContextHolder.getContext().getAuthentication().getName();
        User manager = this.userRepository.findByUserName(name);

        if (!manager.hasRole("ROLE_MANAGER")) {
            throw new Exception("No manager found for user on applyUserInformationUsingSecurityContext.");
        }
        user.setManager(name);

    }

    @HandleBeforeSave
    public void applyManagerFromSecurityContext(User user)  {

        System.out.println("calling before save");
    }
}

SecurityConfiguration

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

  @Autowired
  private SpringDataJpaUserDetailsService userDetailsService;

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
      .userDetailsService(this.userDetailsService)
        .passwordEncoder(MCBPasswordEncoder.PASSWORD_ENCODER);
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
        .antMatchers("/built/**", "/main.css").permitAll()
        .anyRequest().authenticated()
        .and()
      .formLogin()
        .defaultSuccessUrl("/", true)
        .permitAll()
        .and()
      .httpBasic()
        .and()
      .csrf().disable()  // TODO enable for production
      .logout()
              .invalidateHttpSession(true)
              .deleteCookies("JSESSIONID")
        .logoutSuccessUrl("/");
  }

}

1 个答案:

答案 0 :(得分:0)

最后,问题实际上与我为User @Entity创建的2个存储库有关。我得到了奇怪的结果,其中API将显示(使用一个回购)并与另一个回购消失。

我已经通过

解决了这个问题
  • 只使用一个repo而不是两个Extend Repository JPARepository
  • 从PagingAndSortingRepository复制并粘贴我需要的方法。
  • 相应地为特定方法添加@PreAuthorize,而不是 班级。当我想在REST api之外操作repo时,这是最初的问题。