package com.jcdm.framework.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; 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.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.logout.LogoutFilter; import org.springframework.web.filter.CorsFilter; import com.jcdm.framework.config.properties.PermitAllUrlProperties; import com.jcdm.framework.security.filter.JwtAuthenticationTokenFilter; import com.jcdm.framework.security.handle.AuthenticationEntryPointImpl; import com.jcdm.framework.security.handle.LogoutSuccessHandlerImpl; /** * spring securityé…ç½® * * @author jc */ @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { /** * 自定义用户认è¯é€»è¾‘ */ @Autowired private UserDetailsService userDetailsService; /** * 认è¯å¤±è´¥å¤„ç†ç±» */ @Autowired private AuthenticationEntryPointImpl unauthorizedHandler; /** * 退出处ç†ç±» */ @Autowired private LogoutSuccessHandlerImpl logoutSuccessHandler; /** * token认è¯è¿‡æ»¤å™¨ */ @Autowired private JwtAuthenticationTokenFilter authenticationTokenFilter; /** * 跨域过滤器 */ @Autowired private CorsFilter corsFilter; /** * å…许匿åè®¿é—®çš„åœ°å€ */ @Autowired private PermitAllUrlProperties permitAllUrl; /** * 解决 æ— æ³•ç›´æŽ¥æ³¨å…¥ AuthenticationManager * * @return * @throws Exception */ @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } /** * anyRequest | 匹é…所有请求路径 * access | SpringEl表达å¼ç»“果为trueæ—¶å¯ä»¥è®¿é—® * anonymous | 匿åå¯ä»¥è®¿é—® * denyAll | 用户ä¸èƒ½è®¿é—® * fullyAuthenticated | 用户完全认è¯å¯ä»¥è®¿é—®ï¼ˆéžremember-me下自动登录) * hasAnyAuthority | 如果有å‚数,å‚数表示æƒé™ï¼Œåˆ™å…¶ä¸ä»»ä½•ä¸€ä¸ªæƒé™å¯ä»¥è®¿é—® * hasAnyRole | 如果有å‚数,å‚数表示角色,则其ä¸ä»»ä½•ä¸€ä¸ªè§’色å¯ä»¥è®¿é—® * hasAuthority | 如果有å‚数,å‚数表示æƒé™ï¼Œåˆ™å…¶æƒé™å¯ä»¥è®¿é—® * hasIpAddress | 如果有å‚数,å‚数表示IP地å€ï¼Œå¦‚果用户IPå’Œå‚数匹é…,则å¯ä»¥è®¿é—® * hasRole | 如果有å‚数,å‚数表示角色,则其角色å¯ä»¥è®¿é—® * permitAll | 用户å¯ä»¥ä»»æ„访问 * rememberMe | å…许通过remember-me登录的用户访问 * authenticated | 用户登录åŽå¯è®¿é—® */ @Override protected void configure(HttpSecurity httpSecurity) throws Exception { // æ³¨è§£æ ‡è®°å…许匿å访问的url ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests(); permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll()); httpSecurity // CSRFç¦ç”¨ï¼Œå› 为ä¸ä½¿ç”¨session .csrf().disable() // ç¦ç”¨HTTPå“åº”æ ‡å¤´ .headers().cacheControl().disable().and() // 认è¯å¤±è´¥å¤„ç†ç±» .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() // 基于token,所以ä¸éœ€è¦session .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() // 过滤请求 .authorizeRequests() // 对于登录login 注册register 验è¯ç captchaImage å…许匿å访问 .antMatchers("/login", "/register", "/captchaImage","/websocket/**","/postWebsocket/**","/em/inspectionPlanTask/**","/em/inspectionPlanItemsProject/**").permitAll() // é™æ€èµ„æºï¼Œå¯åŒ¿å访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() .antMatchers("/sendDemo/push").permitAll() .antMatchers("/jcdmMes/**").permitAll() .antMatchers("/da/testDeviceInterface/**").permitAll() .antMatchers("/main/paramCollection/**").permitAll() .antMatchers("/bs/formulaChild/**").permitAll() // 除上é¢å¤–的所有请求全部需è¦é‰´æƒè®¤è¯ .anyRequest().authenticated() .and() .headers().frameOptions().disable(); // æ·»åŠ Logout filter httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); // æ·»åŠ JWT filter httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); // æ·»åŠ CORS filter httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); } /** * å¼ºæ•£åˆ—å“ˆå¸ŒåŠ å¯†å®žçŽ° */ @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } /** * 身份认è¯æŽ¥å£ */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); } }