自动登录进行测试

时间:2018-01-18 22:53:26

标签: java sql spring spring-boot spring-security

我有一个测试方法,我尝试使用@WITHMOCKUSER进行授权,也可以通过创建一个接受用户名和密码并为其提供身份验证的方法来手动创建。 方法我想测试看起来像这样

@PreAuthorize("hasAuthority('USER')")
    @RequestMapping("/bookDetail")
    public String bookDetail(
            @PathParam("id") Long id, Model model, Principal principal
    ) {.....

我在测试中使用此自动登录方法

@Override
    public void autologin(String username, String password) throws AuthenticationException {


        UserDetails userDetails;
        try {
            userDetails = userDetailsService.loadUserByUsername(username);

            UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities());

            authenticationManager.authenticate(usernamePasswordAuthenticationToken);

            SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
        } catch (Exception ex) {

            throw new AuthenticationServiceException("invalid username or password");
        }
    }
}

关于此测试

@Test 
    public void checkBookDetail() throws Exception {
        securityService.autologin("V", "A");

        Book book = new Book();
        book.setId(1L);

我收到错误

org.springframework.security.authentication.AuthenticationServiceException: invalid username or password

当我使用@WithMockUser时

 @Test
        @WithMockUser(username = "V", authorities = {"USER"})
        public void checkBookDetail() throws Exception {

            Book book = new Book();
            book.setId(1L);
            expect(bookService.findOne(anyLong())).andReturn(book);
            replay(bookService);

我收到错误

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [select user0_.id as id1_9_, user0_.email as email2_9_, user0_.enabled as enabled3_9_, user0_.first_name as first_na4_9_, user0_.last_name as last_nam5_9_, user0_.password as password6_9_, user0_.phone as phone7_9_, user0_.username as username8_9_ from user user0_ where user0_.username=?]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement

    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167)

在我的sql数据中意味着 我有

INSERT INTO user VALUES
  (1, 'admin@yahoo.com', 'TRUE', NULL, NULL, '$2a$12$LtbYtEzOBdnsiD/E9Wtj2OZz80wXDrKDMacktYr8pq3j0X6HO75Fm', NULL, 'admin'),
  (2, 'valentineezugu@yahoo.com', 'TRUE', 'Valentine', 'Ezugu', '$2a$12$LtbYtEzOBdnsiD/E9Wtj2Oj7SuEU4Z0YOHffjdDm2t01lMnQLyeCe', NULL, 'V'),
  (3, 'egbusonltd@yahoo.com', 'TRUE', NULL, NULL, '$2a$12$LtbYtEzOBdnsiD/E9Wtj2OsFAal5Zn4UPZpYT22PorhapAGnanfWq', NULL, 'ema');

INSERT INTO password_reset_token VALUES (1, '2017-10-01 16:27:48', '59bdd703-c3e4-4a59-b0b8-cbc936f47fbf', 3);

INSERT INTO role VALUES (0, 'ADMIN', 0), (1, 'USER', 1);

INSERT INTO shopping_cart VALUES (1, NULL, 2), (2, NULL, 3);

INSERT INTO user_role VALUES (1, 0, 1), (2, 1, 2), (3, 1, 3);

所以我不明白为什么它不起作用以及我可以做些什么来解决它?提前致谢

安全配置

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private static final String[] PUBLIC_MATCHERS = {
            "/css/**",
            "/js/**",
            "/image/**",
            "/",
            "/newUser",
            "/ForgetPassword",
            "/login",
            "/fonts/**",
            "/bookshelf",
            "/hours",
            "faq",
            "/SearchByCategory"
    };

    @Autowired
    private SecurityUtility securityUtility;

    @Autowired
    private UserDetailsServiceImpl userDetailsServiceImpl;

    private BCryptPasswordEncoder passwordEncoder() {
        return securityUtility.passwordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
                .csrf().disable().cors().disable().
                authorizeRequests().and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .failureUrl("/login?error")
                .defaultSuccessUrl("/")
                .and()
                .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/?logout").deleteCookies("remember-me").permitAll()
                .and()
                .rememberMe();
    }


    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsServiceImpl).passwordEncoder(passwordEncoder());

    }

    @Bean
    public JavaMailSenderImpl mailSender() {

        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setProtocol("SMTP");
        javaMailSender.setHost("127.0.0.1");
        javaMailSender.setPort(25);

        return javaMailSender;
    }

}

0 个答案:

没有答案