package com.yiboshi.science.config.security; import com.yiboshi.arch.exception.BusinessException; import com.yiboshi.science.service.SystemSetService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.BeanIds; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; /** * @author qyh */ @Configuration @EnableWebSecurity @EnableAuthorizationServer @EnableGlobalMethodSecurity(prePostEnabled=true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsServiceImpl userDetailsService; @Autowired public RedisConnectionFactory redisConnectionFactory; @Autowired private SystemSetService systemSetService; @Bean public TokenStore tokenStore() { if (null == redisConnectionFactory) { throw new BusinessException("无法初始化RedisTokenStore,redisConnectionFactory为null"); } //使用redis存储token RedisTokenStore redisTokenStore = new RedisTokenStore(redisConnectionFactory); //设置redis token存储中的前缀 redisTokenStore.setPrefix("auth_token:"); //自定义token生成 redisTokenStore.setAuthenticationKeyGenerator(new AuthenticationKeyGenerator(systemSetService)); return redisTokenStore; // return new InMemoryTokenStore(); } @Bean(name = BeanIds.AUTHENTICATION_MANAGER) @Override protected AuthenticationManager authenticationManager() throws Exception { return super.authenticationManager(); } @Bean @Override protected UserDetailsService userDetailsService() { return userDetailsService; } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean(name = "userLogoutSuccessHandler") public UserLogoutSuccessHandler userLogoutSuccessHandler() { return new UserLogoutSuccessHandler("/login", tokenStore()); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); } }