package com.juick.api.configuration; import com.juick.server.security.JuickAuthenticationEntryPoint; import com.juick.server.security.JuickAuthenticationProvider; import com.juick.server.security.entities.JuickUser; import com.juick.service.UserService; import org.apache.commons.lang3.StringUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import javax.inject.Inject; /** * Created by aalexeev on 11/21/16. */ @Configuration @EnableWebSecurity(debug = true) @PropertySource("classpath:juick.conf") public class ApiSecurityConfig extends WebSecurityConfigurerAdapter { @Inject private Environment env; @Inject private UserService userService; ApiSecurityConfig() { super(true); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/home").hasRole("USER") .antMatchers(HttpMethod.OPTIONS).permitAll() .and().httpBasic().authenticationEntryPoint(getBasicAuthEntryPoint()) .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and().exceptionHandling().authenticationEntryPoint(getBasicAuthEntryPoint()) .and().authenticationProvider(new JuickAuthenticationProvider()); } @Bean public JuickAuthenticationEntryPoint getBasicAuthEntryPoint() { return new JuickAuthenticationEntryPoint(); } @Bean("userDetailsService") @Override public UserDetailsService userDetailsServiceBean() throws Exception { return username -> { if (StringUtils.isBlank(username)) throw new UsernameNotFoundException("Invalid user name " + username); com.juick.User user = userService.getUserByName(username); if (user != null) return new JuickUser(user); throw new UsernameNotFoundException("The username " + username + " is not found"); }; } }