Я знаю, что это n. сообщение о Spring Security, и я много читал об этом, пока не решил опубликовать свой вопрос, потому что, я полагаю, из-за природы Spring Boot должна быть какая-то проблема, скрытая под капотом, что характерно для созвездие версии загрузки/типа безопасности, которую я использую.Spring Boot 1.3.3., Spring Security basic custom config
Позвольте мне прямо в него.
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Моей основная Security Config:
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private StudentRepository studentRepository;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/").access("hasRole('ROLE_STUDENT')")
.antMatchers("/**").permitAll();
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error=true");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(new UserDetailsService() {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Iterable<Student> studentsWithIds = studentRepository.findAll();
for (Student student: studentsWithIds) {
if (student.getName() == username) {
return studentRepository.findOne(student.getId());
}
}
throw new UsernameNotFoundException("User '" + username + "' not found.");
}
});
}
}
Мой класс Student реализует UserDetails (с. Зашитыми учетными данными для сакэ роли простоты является ROLE_STUDENT):
@Entity
public class Student implements UserDetails {
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
@Column(unique=true)
private Integer facebookId;
@Column(unique=true)
private Integer googleId;
private String name = "";
private String password = "";
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public String getPassword() {
return this.password;
}
public void initialize(String studentName) {
this.name = "student1";
this.password = "password";
}
@Override
public String toString(){
return "Student with name " + name + "id: " + id;
}
public Integer getId() {
return id;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("ROLE_STUDENT"));
}
@Override
public String getUsername() {
return this.name;
}
@Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
}
Все. У меня нет никакой другой связанной с безопасностью конфигурации и аннотации, и, насколько я знаю, мне больше нечего делать.
Проблема в том, что при запуске приложения я все еще не могу аутентифицироваться самостоятельно с помощью «student1»/«password», но только с по умолчанию «пользователь» /.
Любая идея, что не хватает, пожалуйста? Спасибо!
Naturally there is a user already in the database После отладочный режим превратился в:
22: 06: 54.067 [HTTP-NiO-8280-ехес-1] DEBUG osswaAnonymousAuthenticationFilter - Населенные SecurityContextHolder с анонимным маркером: «org.springframework.security .authentication.AnonymousAuthenticationToken @ 9055c2bc: Principal: anonymousUser; Учетные данные: [ЗАЩИТА]; Authenticated: true; Подробности: org.sprin[email protected]b364: RemoteIpAddress: 0: 0: 0: 0: 0: 0: 0: 1; SessionId: null; Предоставленные полномочия: ROLE_ANONYMOUS ' 22: 06: 54.067 [http-nio-8280-exec-1] DEBUG org.springframework.security.web.FilterChainProxy -/students/1 в позиции 9 из 11 в дополнительной цепочке фильтров; firing Filter: 'SessionManagementFilter' 22: 06: 54.067 [http-nio-8280-exec-1] DEBUG org.springframework.security.web.FilterChainProxy -/students/1 в позиции 10 из 11 в дополнительной цепочке фильтров; firing Filter: 'ExceptionTranslationFilter' 22: 06: 54.067 [http-nio-8280-exec-1] DEBUG org.springframework.security.web.FilterChainProxy -/students/1 в позиции 11 из 11 в дополнительной цепочке фильтров; firing Filter: 'FilterSecurityInterceptor' 22: 06: 54.068 [http-nio-8280-exec-1] DEBUG o.s.s.w.access.intercept.FilterSecurityInterceptor - Защищенный объект: FilterInvocation: URL:/students/1; Атрибуты: [hasAnyRole ('ROLE_USER')] 22: 06: 54.068 [http-nio-8280-exec-1] DEBUG osswaccess.intercept.FilterSecurityInterceptor - ранее прошедший проверку: org.sprin[email protected]9055c2bc: Руководитель: anonymousUser; Учетные данные: [ЗАЩИТА]; Authenticated: true; Подробности: org.sprin[email protected]b364: RemoteIpAddress: 0: 0: 0: 0: 0: 0: 0: 1; SessionId: null; Предоставленные полномочия: ROLE_ANONYMOUS 22: 06: 54.072 [http-nio-8280-exec-1] DEBUG ossecurity.access.vote.AffirmativeBased - Избиратель: org.sp[email protected]272de199, возвращено : -1 22: 06: 54.072 [http-nio-8280-exec-1] DEBUG osbfactory.support.DefaultListableBeanFactory - Возвращает кешированный экземпляр singleton bean 'delegatingApplicationListener' 22: 06: 54.073 [http-nio-8280- exec-1] DEBUG ossecurity.web.access.ExceptionTranslationFilter - доступ запрещен (пользователь анонимный); перенаправление на точку входа аутентификации org.springframework.security.access.AccessDeniedException: доступ запрещен по адресу org.springframework.security.access.vote.AffirmativeBased.decide (AffirmativeBased.java:83) at org.springframework.security.access .intercept.AbstractSecurityInterceptor.beforeInvocation (AbstractSecurityInterceptor.java:232) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke (FilterSecurityInterceptor.java:123) at org.springframework.security.web.access.intercept .FilterSecurityInterceptor.doFilter (FilterSecurityInterceptor.java:90) в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) в org.springframework.security.web.access.ExceptionTranslationFilter.doF МСДЭНИ (ExceptionTranslationFilter.java:114) в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) в org.springframework.security.web.session.SessionManagementFilter.doFilter (SessionManagementFilter.java: 122) в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) в org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter (AnonymousAuthenticationFilter.java:111) в орг. springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) в org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter (SecurityContextHolderAwareRequestFilter.java:169) в org.springfr amework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) в org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter (RequestCacheAwareFilter.java:48) в org.springframework.security.web. FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) в org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal (BasicAuthenticationFilter.java:158) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter (LogoutFilter.java: 120) at org.spring framework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) на org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal (HeaderWriterFilter.java:64) на org.springframework.web.filter. OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) в org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter (SecurityContextPersistenceFilter. Java: 91) в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) в org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal (WebAsyncManagerIntegrationFilter.java: 53) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:330) в org.springframework.security. web.FilterChainProxy.doFilterInternal (FilterChainProxy.java:213) на org.springframework.security.web.FilterChainProxy.doFilter (FilterChainProxy.java:176) на org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate (DelegatingFilterProxy.java: 346) at org.springframework.web.filter.DelegatingFilterProxy.doFilter (DelegatingFilterProxy.java:262) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.Java: 240) на org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:207) на org.springframework.web.filter.RequestContextFilter.doFilterInternal (RequestContextFilter.java:99) на org.springframework. web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) на org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:240) на org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain. Java: 207) на org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal (HttpPutFormContentFilter.java:87) на org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) на org.apache. catalina.core.Applicati onFilterChain.internalDoFilter (ApplicationFilterChain.java:240) на org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:207) на org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal (HiddenHttpMethodFilter.java:77) на org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:240) на org.apache.catalina.core. ApplicationFilterChain.doFilter (ApplicationFilterChain.java:207) на org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:121) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) на org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:240) на org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:207) на org.apache.catalina.core. StandardWrapperValve.invoke (StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:502) на org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:141) на org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:79) на org.apache.catalina.core. СтандартноеEngineValve.invoke (StandardEngineValve.java:88) at org.apache .catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:522) at org.apache.coyote.http11.AbstractHttp11Processor.process (AbstractHttp11Processor.java:1095) at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol .java: 672) at org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1500) at org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run (NioEndpoint.java : 1456) at java.util.concurrent.ThreadPoolExecutor.runWorker (Неизвестный источник) at java.util.concurrent.ThreadPoolExecutor $ Worker.run (Неизвестный источник) на org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable .run (TaskThread.java:61) at java.lang.Thread.run (Неизвестный источник) 22: 06: 5 4.073 [http-nio-8280-exec-1] DEBUG o.s.ececurity.web.access.ExceptionTranslationFilter - Вызов точки входа для проверки подлинности. 22: 06: 54.073 [http-nio-8280-exec-1] DEBUG ossweb.context.SecurityContextPersistenceFilter - SecurityContextHolder теперь очищен, по завершении обработки запроса 22: 06: 54.073 [http-nio-8280-exec-1] DEBUG osboot.context.web.OrderedRequestContextFilter - очищенный контекст запроса потока: [email protected] 22: 06: 54.077 [http-nio-8280-exec-1] DEBUG org.springframework. web.servlet.DispatcherServlet - DispatcherServlet с обработкой имени «dispatcherServlet» Запрос GET для [/ error] 22: 06: 54.080 [http-nio-8280-exec-1] DEBUG oswsmmaRequestMappingHandlerMapping - Поиск метода обработчика пути/ошибки 22: 06: 54.083 [http-nio-8280-exec-1] DEBUG oswsmmaRequestMappingHandlerMapping - метод возвращаемого обработчика [public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml (javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)] 22: 06: 54.083 [http-nio-8280-exec-1] DEBUG osbfactory.support.DefaultListableBeanFactory - Возвращает кешированный экземпляр singleton bean 'basicErrorController' 22: 06: 54.084 [http-nio-8280-exec-1] DEBUG org .springframework.web.servlet.DispatcherServlet - Последнее исправленное значение для [/ error]: -1 22: 06: 54.084 [http-nio-8280-exec-1] DEBUG osojsupport.OpenEntityManagerInViewInterceptor - открытие JPA EntityManager в OpenEntityManagerInViewInterceptor 22: 06: 54.104 [http-nio-8280-exec-1] DEBUG oswservlet.view.ContentNegotiatingViewResolver - запрошенные типы медиа - это [text/html, text/html; q = 0.8] на основе Принимать типы заголовков и типы носителей типа [text/html]) 22: 06: 54.104 [http-nio-8280-exec-1] DEBUG osbfactory.support.DefaultListableBeanFactory - Возвращает кешированный экземпляр одноэлементного бина 'error' 22: 06: 54.107 [http-nio-8280-exec-1] DEBUG osbfactory.support.DefaultListableBeanFactory - вызов afterPropertiesSet() в bean-компоненте с именем 'error' 22: 06: 54.107 [http-nio-8280-exec-1] DEBUG oswservlet.view.ContentNegotiatingViewResolver - Возврат [org.springfram[email protected]2fb1fefe] на основе запрошенного типа носителя 'text/html' 22: 06: 54.107 [http-nio-8280-exec -1] DEBUG org.springframework.web.servlet.DispatcherServlet - просмотр рендеринга [org.springfram[email protected]2fb1fefe] в DispatcherServlet с именем 'dispatcherServlet' 2 2: 06: 54.113 [http-nio-8280-exec-1] DEBUG osojsupport.OpenEntityManagerInViewInterceptor - Закрытие JPA EntityManager в OpenEntityManagerInViewInterceptor 22: 06: 54.113 [http-nio-8280-exec-1] DEBUG osorm.jpa. EntityManagerFactoryUtils - Закрытие JPA EntityManager 22: 06: 54.113 [http-nio-8280-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - успешно завершенный запрос 22: 06: 54.114 [http-nio-8280-exec -1] DEBUG osbfactory.support.DefaultListableBeanFactory - Возвращает кешированный экземпляр singleton bean 'delegatingApplicationListener' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG osboot.context.web.OrderedRequestContextFilter - Связанный контекст запроса to thread: [email protected] 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG ossweb.util.matcher.AntPathRequestMatcher - контрольный мат ch запроса: '/ students/1'; против '/ css/' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG o.s.s.web.util.matcher.AntPathRequestMatcher - проверка соответствия запроса: '/ students/1'; против '/ js/' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG o.s.s.web.util.matcher.AntPathRequestMatcher - проверка соответствия запроса: '/ students/1'; против '/ images/' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG o.s.s.web.util.matcher.AntPathRequestMatcher - проверка соответствия запроса: '/ students/1'; против '/ /favicon.ico' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG o.s.s.web.util.matcher.AntPathRequestMatcher - проверка соответствия запроса: '/ students/1'; против '/ error' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG ossecurity.web.util.matcher.OrRequestMatcher - попытка сопоставления с использованием Ant [pattern = '/ '] 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG ossweb.util.matcher.AntPathRequestMatcher - запрос '/ students/1', соответствующий универсальному шаблону '/' 22: 07: 02.728 [http-nio- 8280-exec-2] DEBUG ossecurity.web.util.matcher.OrRequestMatcher - соответствует 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG org.springframework.security.web.FilterChainProxy -/students/1 в позиции 1 из 11 в дополнительной цепи фильтра; firing Filter: 'WebAsyncManagerIntegrationFilter' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG org.springframework.security.web.FilterChainProxy -/students/1 в позиции 2 из 11 в дополнительной цепочке фильтров; firing Filter: 'SecurityContextPersistenceFilter' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG org.springframework.security.web.FilterChainProxy -/students/1 в позиции 3 из 11 в дополнительной цепочке фильтров; firing Filter: 'HeaderWriterFilter' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG ossecurity.web.header.writers.HstsHeaderWriter - Не вводить заголовок HSTS, так как он не соответствует запросу request.matcher org.springframework. se[email protected]37ca7e0d 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG org.springframework.security.web.FilterChainProxy -/students/1 в позиции 4 из 11 в дополнительной цепи фильтра; firing Filter: 'LogoutFilter' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG o.s.s.web.util.matcher.AntPathRequestMatcher - проверка соответствия запроса: '/ students/1'; против '/ logout' 22: 07: 02.728 [http-nio-8280-exec-2] DEBUG org.springframework.security.web.FilterChainProxy -/students/1 в позиции 5 из 11 в дополнительной цепочке фильтров; firing Filter: 'BasicAuthenticationFilter' 22: 07: 02.730 [http-nio-8280-exec-2] DEBUG osswawww.BasicAuthenticationFilter - базовый заголовок авторизации аутентификации, найденный для пользователя 'student1' 22: 07: 02.730 [http-nio- 8280-exec-2] DEBUG ossecurity.authentication.ProviderManager - попытка аутентификации с использованием org.springframework.security.authentication.dao.DaoAuthenticationProvider 22: 07: 02.731 [http-nio-8280-exec-2] DEBUG ossauthentication.dao .DaoAuthenticationProvider - Пользователь «student1» не найден
самого конца, кажется, самым интересным, хотя остальные довольно некрасиво тоже:
ossauthentication.dao.DaoAuthenticationProvider - «student1» Пользователь не найден
Вот где я назвал инициализацию на студента (это обман, потому что он должен быть вызван на POST, но опять же, я изменяла только поместить ученика в базу данных и использовать его для аутентификации. Впоследствии это было бы очевидно иначе. Конечно, я мог только сделать это GET, когда я temporarely деактивируется безопасности на приложение):
@RequestMapping(value="/students", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<Iterable<Student>> listStudents() {
LOGGER.info("/students controller method call"+new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date()));
Iterable<Student> studentsFound = studentRepository.findAll();
Student newStudent = new Student();
newStudent.initialize("student1");
studentRepository.save(newStudent);
return new ResponseEntity<Iterable<Student>>(studentsFound, HttpStatus.OK);
}
Как вы думаете, сам экземпляр Student как-то не правильно?
Где вы называете 'initialize' метод' Student'? –
добавлена часть инициализации. расширенное с некоторым объяснением (я знаю, что это не имеет смысла там, но просто хотел сохранить Student в БД, где бы то ни было. Эта часть уже работала без auth, поэтому я ее там поместил. БД находится в режиме обновления , запись, безусловно, все еще находится в БД, но я тоже дважды проверял ее) – Andrel