- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一个简单的 Spring Boot 应用程序有一个自定义的 UserDetailsService。 Spring Boot Controller 由 AngularJS 应用程序调用,并且来自 AngularJS 应用程序的身份验证请求通过 /user
url 模式向后端发出。但登录请求导致 Controller 日志指示 Controller 未找到 /user
url 模式,因此 UserDetailsService 返回 null。 需要对下面的代码进行哪些具体更改,才能使后端 /user
url 模式的客户端请求能够找到 Controller 方法,从而正确实例化自定义 UserDetailsService
?
该应用程序非常简单, Controller 代码不到 200 行。
Controller 的代码是:
@SpringBootApplication
@Controller
@EnableJpaRepositories(basePackages = "demo", considerNestedRepositories = true)
public class UiApplication extends WebMvcConfigurerAdapter {
// Match everything without a suffix (so not a static resource)
@RequestMapping(value = "/{[path:[^\\.]*}")
public String redirect() {
// Forward to home page so that route is preserved.
return "forward:/";
}
@RequestMapping("/user")
@ResponseBody
public Principal user(Principal user) {
return user;
}
public static void main(String[] args) {
SpringApplication.run(UiApplication.class, args);
}
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.US);
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("login");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
protected static class AuthenticationSecurity extends
GlobalAuthenticationConfigurerAdapter {
@Autowired
private Users users;
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(users);
}
}
@SuppressWarnings("deprecation")
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().authorizeRequests()
.antMatchers("/index.html", "/", "/login", "/message", "/home")
.permitAll().anyRequest().authenticated().and().csrf()
.csrfTokenRepository(csrfTokenRepository()).and()
.addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);
}
private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null || token != null
&& !token.equals(cookie.getValue())) {
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
}
@Service
class Users implements UserDetailsService {
private UserRepository repo;
@Autowired
public Users(UserRepository repo) {
this.repo = repo;
}
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
User user = repo.findByName(username);
if (user == null) {
return null;
}
List<GrantedAuthority> auth = AuthorityUtils
.commaSeparatedStringToAuthorityList("ROLE_USER");
if (username.equals("admin")) {
auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN");
}
String password = user.getPassword();
return new org.springframework.security.core.userdetails.User(username, password, auth);
}
}
@Repository
interface UserRepository extends CrudRepository<User, Long> {
User findByName(String name);
}
@Entity
class User {
@GeneratedValue
@Id
private Long iduser;
private String name;
private String password;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private Collection<SessionLog> sessionLogCollection;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
@Entity
class SessionLog {
@GeneratedValue
@Id
private Long id;
private String sessionid;
@ManyToOne(optional = true)
@JoinColumn(name = "iduser")
private User user;
public String getSessionid() {
return sessionid;
}
}
}
登录请求生成的完整堆栈跟踪是:
2015-12-30 14:27:07.628 DEBUG 4398 --- [nio-8080-exec-5] o.s.security.web.FilterChainProxy : /js/navigation/login.html has an empty filter list
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/css/**'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/js/**'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/images/**'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/**/favicon.ico'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/error'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/configprops']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/configprops'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/configprops/**']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/configprops/**'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/configprops.*']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/configprops.*'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/configprops/']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/configprops/'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/autoconfig']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/autoconfig'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/autoconfig/**']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/autoconfig/**'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/autoconfig.*']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/autoconfig.*'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/autoconfig/']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/autoconfig/'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/metrics']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/metrics'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/metrics/**']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/metrics/**'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/metrics.*']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/metrics.*'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/metrics/']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/metrics/'
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/env']
2015-12-30 14:27:21.617 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/env'
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/env/**']
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/env/**'
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/env.*']
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/env.*'
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/env/']
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/env/'
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/trace']
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/trace'
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/trace/**']
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/trace/**'
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/trace.*']
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/trace.*'
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/trace/']
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/trace/'
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/health']
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/health'
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/health/']
2015-12-30 14:27:21.620 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/health/'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/beans']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/beans'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/beans/**']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/beans/**'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/beans.*']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/beans.*'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/beans/']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/beans/'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/info']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/info'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/info/']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/info/'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/dump']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/dump'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/dump/**']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/dump/**'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/dump.*']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/dump.*'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/dump/']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/dump/'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/mappings']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/mappings'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/mappings/**']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/mappings/**'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/mappings.*']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/mappings.*'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/mappings/']
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/user'; against '/mappings/'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.web.util.matcher.OrRequestMatcher : No matches found
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy : /user at position 1 of 13 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2015-12-30 14:27:21.621 DEBUG 4398 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy : /user at position 2 of 13 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2015-12-30 14:27:21.622 DEBUG 4398 --- [nio-8080-exec-6] w.c.HttpSessionSecurityContextRepository : HttpSession returned null object for SPRING_SECURITY_CONTEXT
2015-12-30 14:27:21.622 DEBUG 4398 --- [nio-8080-exec-6] w.c.HttpSessionSecurityContextRepository : No SecurityContext was available from the HttpSession: org.apache.catalina.session.StandardSessionFacade@71f7b6fe. A new one will be created.
2015-12-30 14:27:21.622 DEBUG 4398 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy : /user at position 3 of 13 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2015-12-30 14:27:21.622 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.header.writers.HstsHeaderWriter : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@a3b708e
2015-12-30 14:27:21.622 DEBUG 4398 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy : /user at position 4 of 13 in additional filter chain; firing Filter: 'CsrfFilter'
2015-12-30 14:27:21.622 DEBUG 4398 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy : /user at position 5 of 13 in additional filter chain; firing Filter: ''
2015-12-30 14:27:21.622 DEBUG 4398 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy : /user at position 6 of 13 in additional filter chain; firing Filter: 'LogoutFilter'
2015-12-30 14:27:21.630 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Request 'GET /user' doesn't match 'POST /logout
2015-12-30 14:27:21.630 DEBUG 4398 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy : /user at position 7 of 13 in additional filter chain; firing Filter: 'BasicAuthenticationFilter'
2015-12-30 14:27:21.632 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.a.www.BasicAuthenticationFilter : Basic Authentication Authorization header found for user 'admin'
2015-12-30 14:27:21.632 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.authentication.ProviderManager : Authentication attempt using org.springframework.security.authentication.dao.DaoAuthenticationProvider
2015-12-30 14:27:22.155 DEBUG 4398 --- [nio-8080-exec-6] .s.a.DefaultAuthenticationEventPublisher : No event was found for the exception org.springframework.security.authentication.InternalAuthenticationServiceException
2015-12-30 14:27:22.155 DEBUG 4398 --- [nio-8080-exec-6] o.s.s.w.a.www.BasicAuthenticationFilter : Authentication request for failed: org.springframework.security.authentication.InternalAuthenticationServiceException: UserDetailsService returned null, which is an interface contract violation
2015-12-30 14:27:22.155 DEBUG 4398 --- [nio-8080-exec-6] s.w.a.DelegatingAuthenticationEntryPoint : Trying to match using RequestHeaderRequestMatcher [expectedHeaderName=X-Requested-With, expectedHeaderValue=XMLHttpRequest]
2015-12-30 14:27:22.155 DEBUG 4398 --- [nio-8080-exec-6] s.w.a.DelegatingAuthenticationEntryPoint : Match found! Executing org.springframework.security.web.authentication.HttpStatusEntryPoint@784c2ce0
2015-12-30 14:27:22.155 DEBUG 4398 --- [nio-8080-exec-6] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
2015-12-30 14:27:22.155 DEBUG 4398 --- [nio-8080-exec-6] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed
最佳答案
找到 Controller 方法。问题是这段代码:
if (user == null) {
return null;
}
正如您在日志消息中清楚地看到的:
Authentication request for failed: org.springframework.security.authentication.InternalAuthenticationServiceException: UserDetailsService returned null, which is an interface contract violation
在 UserDetailsService 实现中不允许返回 null。
因此,请检查数据库中是否有管理员用户的条目,然后删除return null
并抛出UsernameNotFoundException
。
关于java - 为什么 UserDetailsService 在 Spring Boot 应用程序中返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34538768/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!