我有一个测试方法,我尝试使用@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;
}
}