package com.cnbm.admin.config; import com.cnbm.admin.filter.JwtAuthenticationTokenFilter; import com.cnbm.admin.handler.LogoutHandlerImpl; import com.cnbm.admin.handler.LogoutSuccessHandlerImpl; import com.cnbm.admin.service.impl.UserDetailsServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; 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.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.logout.LogoutFilter; /** * @Author weihongyang * @Date 2022/6/8 1:51 PM * @Version 1.0 */ @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { //创建BCryptPasswordEncoder注入容器 @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } @Autowired private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; @Autowired private AuthenticationEntryPoint authenticationEntryPoint; @Autowired private AccessDeniedHandler accessDeniedHandler; @Autowired private UserDetailsServiceImpl userDetailsService; @Autowired private LogoutSuccessHandlerImpl logoutSuccessHandler; @Autowired private LogoutHandlerImpl logoutHandler; @Override protected void configure(HttpSecurity http) throws Exception { http //关闭csrf .csrf().disable() //不通过Session获取SecurityContext .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() // 对于登录接口 允许匿名访问 .antMatchers("/login","/doLogout","/swagger/**","/v2/**", "/doc.html", "/swagger-resources/**", "/swagger-ui/**", "/webjars/**", "/captcha").anonymous() // .antMatchers("/testCors").hasAuthority("system:dept:list222") // 除上面外的所有请求全部需要鉴权认证 .anyRequest() .authenticated() // 退出登录,默认为/logout,这里修改接口地址为 /doLogout .and().logout().logoutUrl("/doLogout") .addLogoutHandler(logoutHandler) // 设置退出登录成功处理程序,退出成功后返回JSON字符串 .logoutSuccessHandler(logoutSuccessHandler); //添加过滤器 http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); http.addFilterBefore(jwtAuthenticationTokenFilter, LogoutFilter.class); //配置异常处理器 http.exceptionHandling() //配置认证失败处理器 .authenticationEntryPoint(authenticationEntryPoint) .accessDeniedHandler(accessDeniedHandler); //允许跨域 http.cors(); } @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @Bean public AuthenticationProvider daoAuthenticationProvider() { DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider(); daoAuthenticationProvider.setUserDetailsService(userDetailsService); daoAuthenticationProvider.setPasswordEncoder(passwordEncoder()); daoAuthenticationProvider.setHideUserNotFoundExceptions(false); return daoAuthenticationProvider; } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 加入自定义认证, 无需配置userDetailsService,否则会执行默认的provider // auth.authenticationProvider(myAuthenticationProvider()); /* auth.userDetailsService(userService) .passwordEncoder(passwordEncoder());*/ auth.authenticationProvider(daoAuthenticationProvider()); } }