2016-07-26 5 views
0

Привет Я использую весеннюю загрузку 1.4.0 + spring-security-saml2-core 1.0.2 с помощью следующей ссылки Spring-Boot-Saml-example работает отлично. Теперь я хотел бы создать пользователя в памяти с теми же предоставленными полномочиями, что и пользователь SAML.Накопите найти приведенный ниже код SAMLUserDetailsServiceImpl для справки. Ваша помощь должна быть заметной.Как создать пользователя в памяти в SAML

@Service 
public class SAMLUserDetailsServiceImpl implements SAMLUserDetailsService { 

// Logger 
private static final Logger LOG = LoggerFactory.getLogger(SAMLUserDetailsServiceImpl.class); 

@Value("${emailSamlAttrName}") 
private String emailSamlAttrName; 

public Object loadUserBySAML(SAMLCredential credential) 
     throws UsernameNotFoundException { 

    // The method is supposed to identify local account of user referenced by 
    // data in the SAML assertion and return UserDetails object describing the user. 

    String userID = credential.getNameID().getValue(); 
    Attribute emailAttribute = credential.getAttribute(emailSamlAttrName); 
    String userEmail = getAttributeValue(credential.getAttribute(emailSamlAttrName).getAttributeValues().get(0)); 
    LOG.info(userID + " is logged in"); 
    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
    GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_USER"); 
    authorities.add(authority); 

    // In a real scenario, this implementation has to locate user in a arbitrary 
    // dataStore based on information present in the SAMLCredential and 
    // returns such a date in a form of application specific UserDetails object. 
    return new User(userID, "<abc123>", true, true, true, true, authorities); 
} 

В соответствии с @ blur0224 комментарий я поставил следующий код:

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("sample").password("sample123").roles("NONE"); 
     auth.inMemoryAuthentication().withUser("dummy").password("dummy123").roles("USER"); 
     auth.inMemoryAuthentication().withUser("proxy").password("proxy123").roles("USER"); 
} 

Но выдает следующее сообщение об ошибке ....

11:09:41.345 [http-nio-8040-exec-1] DEBUG o.s.s.w.a.i.FilterSecurityInterceptor [transactionId: ]- Secure object: FilterInvocation: URL: /api/v1/users/authenticated; Attributes: [hasRole('ROLE_NONE') or hasRole('ROLE_USER')] 
11:09:41.345 [http-nio-8040-exec-1] DEBUG o.s.s.w.a.i.FilterSecurityInterceptor [transactionId: ]- Previously Authenticated: org.sprin[email protected]9055c2b c: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS 
11:09:41.351 [http-nio-8040-exec-1] DEBUG o.s.s.access.vote.AffirmativeBased [transactionId: ]- Voter: org.sp[email protected]2809e0b9, returned: -1 
11:09:41.352 [http-nio-8040-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory [transactionId: ]- Returning cached instance of singleton bean 'delegatingApplicationListener' 
11:09:41.352 [http-nio-8040-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory [transactionId: ]- Returning cached instance of singleton bean 'authorizationAuditListener' 
11:09:41.354 [http-nio-8040-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory [transactionId: ]- Returning cached instance of singleton bean 'delegatingApplicationListener' 
11:09:41.354 [http-nio-8040-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory [transactionId: ]- Returning cached instance of singleton bean 'auditListener' 
11:09:41.354 [http-nio-8040-exec-1] DEBUG o.s.b.a.audit.listener.AuditListener [transactionId: ]- AuditEvent [timestamp=Wed Jul 27 11:09:41 CEST 2016, principal=anonymousUser, type=AUTHORIZATION_FAILURE, data={type=org.springframework.security.access.AccessDeniedException, message=Access is denied}] 
11:09:41.359 [http-nio-8040-exec-1] DEBUG o.s.s.w.a.ExceptionTranslationFilter [transactionId: ]- Access is denied (user is anonymous); redirecting to authentication entry point 
org.springframework.security.access.AccessDeniedException: Access is denied 
at 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) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:207) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:184) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) 
at 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.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 
at 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.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.saml.metadata.MetadataGeneratorFilter.doFilter(MetadataGeneratorFilter.java:87) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 
at 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) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:103) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
at 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) 
at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:676) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.core.StandardEngineValve.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(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 

WebSecurityConfig.java

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .httpBasic() 
      .authenticationEntryPoint(samlEntryPoint()); 
    http 
     .csrf() 
      .disable(); 
    http 
     .addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class) 
     .addFilterAfter(samlFilter(), BasicAuthenticationFilter.class); 
    http 
     .authorizeRequests() 
     .antMatchers("/error").permitAll() 
     .antMatchers("/saml/**").permitAll() 
     .antMatchers("/api/*/users/authenticated").access(String.format("hasRole('%s') or hasRole('%s')", ROLE_NONE, ROLE_USER)) 
     .antMatchers("/api/**").access(String.format("hasRole('%s')", ROLE_USER)) 
     .anyRequest().access(String.format("hasRole('%s')", ROLE_USER)); 
    http 
     .logout() 
      .logoutSuccessUrl("/"); 
} 
+0

Кажется нормально. Но почему нельзя просто сопоставить пользователя в локальном хранилище данных и создать пользовательский объект, используя данные, полученные из хранилища данных и утверждения? Кроме того, что происходит, когда пользователь недоступен в локальном хранилище данных? – Zeigeist

+0

@Zeigeist Этот вопрос является продолжением следующего вопроса: http://stackoverflow.com/questions/38528502/spring-boot-disable-saml-security-in-local-enviroment/38532157?noredirect=1#comment64568477_38532157, чтобы вы получить представление о моем требовании – VelNaga

+0

@ Zeigeist Я не хочу создавать локальные хранилища данных. Мне нужно простое решение или минимальные изменения для запуска приложения в моем локальном.Он отлично работает во всех более высоких средах, но в нашем локальном хранилище нет xeystore или метаданных xml, поэтому мы не можем войти в приложение в нашем локальном. – VelNaga

ответ

1

В вашем SAMLUserDetailsServiceImpl вы в настоящее время не ищете пользователя в БД, чтобы получить конкретную информацию о них. В этом случае вы можете настроить локальную конфигурацию безопасности для создания в памяти пользователей с тем же предоставленным им полномочием, когда они проходят через SAML. ROLE_USER Вы можете использовать приведенный ниже пример в качестве руководства по настройке пользователя, который вы можете войти в систему, как для своей локальной разработки.

Example of In Memory Users

Вы не нашли это?

@Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/info/**").hasAnyRole("ADMIN","USER"). 
     and().formLogin(); 
    } 

Вам нужны две отдельные конфигурации безопасности: WebSecurityConfig и LocalSecurityConfig При работе на местном уровне, которые вы хотите быстрый, простой способ повторить то, что ваша реализация SAML предоставляет вам, что пользователь с предоставленными органами. Обратите внимание, что вам нужно будет иметь @Profile("dev","test","prod") на вашей конфигурации SAML файлы WebSecurityConfig

@Configuration 
@ComponentScan("com.whatever.etc") 
@EnableWebSecurity 
@Profile("local") 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/**").hasAnyRole("ADMIN","USER"). 
     and().httpBasic(); 
    } 
    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
      auth.inMemoryAuthentication().withUser("ram").password("ram123").roles("ADMIN"); 
      auth.inMemoryAuthentication().withUser("ravan").password("ravan123").roles("USER"); 
      auth.inMemoryAuthentication().withUser("kans").password("kans123").roles("USER"); 
    } 
} 

Вы не можете просто добавить пользователей в конфигурации SAML, поскольку она имеет другую точку входа. Создавая отдельную конфигурацию, у вас есть подробный контроль того, как вы хотите, чтобы приложение выполняло только локальную работу. Кроме того, возможно, но не обязательно объединять две конфигурации в один файл. Я бы порекомендовал, чтобы они работали отдельно.

+0

Я обновил свой вопрос. Я следил за ссылкой, которую вы поделили. Но получаю исключение, ударяя URL. Я сделал что-то не так? – VelNaga

+0

Не могли бы вы разместить весь файл конфигурации безопасности для вашей локальной конфигурации? – blur0224

+0

Это конфиденциально, я не могу поделиться этими файлами. У меня есть samlKeystore.jks и idp-metadata.xml. Для получения дополнительной информации вы можете найти следующую ссылку [link] (https://github.com/vdenotaris/spring-boot-security -saml-sample) – VelNaga

0

Вы можете использовать эту библиотеку: spring-boot-security-saml

Это к тому же сильно упрощает использование весенне-безопасность-SAML и весенне-ботинок она уже есть в памяти SAMLUserDetails из коробки.

Вы можете расширить этот класс, чтобы вернуть предоставленные полномочия из любого атрибута SAML возвращается ваш IDP

+0

Извините, что не могу получить вас. Я новичок в SAML. Надеюсь, вы видели ссылку, которую я поделил. Я точно следил за ссылкой, и она отлично работает. Для локальной настройки как мы можем хранить пользовательские данные в памяти с помощью ссылки, которую вы поделили? Не могли бы вы дать подсказку – VelNaga