You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
2.9 KiB

3 years ago
package com.qs.serve.common.config;
import com.qs.serve.common.config.properties.PermitProperties;
import com.qs.serve.common.framework.security.filter.SecurityRequestFilter;
import com.qs.serve.common.framework.security.handler.SecurityAccessDeniedHandler;
import com.qs.serve.common.framework.security.handler.SecurityLogoutHandler;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
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.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author YenHex
* @since 2021/6/13
*/
@Configuration
@AllArgsConstructor
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final SecurityRequestFilter securityRequestFilter;
private final UserDetailsService userService;
private final PermitProperties permitProperties;
@Override
protected void configure(HttpSecurity http) throws Exception {
List<String> permitUrls = new ArrayList<>();
if(permitProperties.getPermits()!=null){ permitUrls.addAll(permitProperties.getPermits()); }
if(permitProperties.getTenants()!=null){ permitUrls.addAll(permitProperties.getTenants()); }
permitUrls = permitUrls.stream().distinct().collect(Collectors.toList());
String[] permit_urls = new String[permitUrls.size()];
permitUrls.toArray(permit_urls);
http.csrf().disable();
http.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS.toString()).permitAll()
.antMatchers(permit_urls).permitAll()
//.antMatchers().permitAll() //测试用
.anyRequest().authenticated();
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
http.logout()
.logoutUrl("/portal/logout")
.addLogoutHandler(new SecurityLogoutHandler())
.invalidateHttpSession(true);
http.headers().cacheControl();
http.addFilterBefore(securityRequestFilter, UsernamePasswordAuthenticationFilter.class);
http.exceptionHandling().accessDeniedHandler(new SecurityAccessDeniedHandler());
//http.formLogin().failureHandler(new SecurityAuthenticationFailureHandler());
}
@Override
public UserDetailsService userDetailsService() {
return userService;
}
}