|
|
@ -1,10 +1,12 @@ |
|
|
|
package com.aiprose.scauth.conf; |
|
|
|
|
|
|
|
import com.aiprose.scauth.entity.User; |
|
|
|
import com.aiprose.scauth.filter.JWTAuthenticationFilter; |
|
|
|
import com.aiprose.scauth.handler.*; |
|
|
|
import com.aiprose.scauth.service.IUserService; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.context.annotation.Bean; |
|
|
|
import org.springframework.context.annotation.Configuration; |
|
|
|
import org.springframework.security.access.AccessDecisionManager; |
|
|
|
import org.springframework.security.access.AccessDecisionVoter; |
|
|
@ -17,11 +19,15 @@ import org.springframework.security.config.annotation.method.configuration.Enabl |
|
|
|
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.WebSecurityConfigurerAdapter; |
|
|
|
import org.springframework.security.config.http.SessionCreationPolicy; |
|
|
|
import org.springframework.security.core.userdetails.UserDetailsService; |
|
|
|
import org.springframework.security.core.userdetails.UsernameNotFoundException; |
|
|
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; |
|
|
|
import org.springframework.security.web.access.expression.WebExpressionVoter; |
|
|
|
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor; |
|
|
|
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; |
|
|
|
import org.springframework.web.servlet.config.annotation.CorsRegistry; |
|
|
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
@ -34,32 +40,34 @@ import java.util.List; |
|
|
|
* @since 1.0 |
|
|
|
*/ |
|
|
|
@Configuration |
|
|
|
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, jsr250Enabled = true) |
|
|
|
//@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, jsr250Enabled = true)
|
|
|
|
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { |
|
|
|
@Autowired |
|
|
|
private IUserService userService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private RemeberMeHandler remeberMeHandler; |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public void configure(WebSecurity web) throws Exception { |
|
|
|
// super.configure(web);
|
|
|
|
web.ignoring().antMatchers("login", "/v2/api-docs/**", "/swagger-resources/**", "/swagger-ui.html"); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
protected void configure(HttpSecurity http) throws Exception { |
|
|
|
http.csrf().disable(); |
|
|
|
http.cors().and().csrf().disable(); |
|
|
|
|
|
|
|
// 配置记住我的参数和记住我处理类
|
|
|
|
http.rememberMe() |
|
|
|
.tokenRepository(remeberMeHandler) |
|
|
|
.tokenValiditySeconds(60*60*24) |
|
|
|
.userDetailsService(userDetailsService()); |
|
|
|
// 授权配置
|
|
|
|
http.authorizeRequests().anyRequest().authenticated(); |
|
|
|
|
|
|
|
// 配置登录页面
|
|
|
|
http.formLogin().loginPage("/login").permitAll(); |
|
|
|
// 配置登录
|
|
|
|
http.formLogin().usernameParameter("username").passwordParameter("password").loginProcessingUrl("/login"); |
|
|
|
|
|
|
|
//登录过期、 未登录
|
|
|
|
http.exceptionHandling().authenticationEntryPoint(new LoginExpireHandler()); |
|
|
|
// 配置登录失败后的操作
|
|
|
|
http.formLogin().failureHandler(new LoginFailureHandler()); |
|
|
|
// 配置登录成功后的操作
|
|
|
|
http.formLogin().successHandler(new LoginSuccessHandler()); |
|
|
|
|
|
|
@ -67,43 +75,37 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { |
|
|
|
http.exceptionHandling().accessDeniedHandler(new AuthLimitHandler()); |
|
|
|
|
|
|
|
// 登出授权
|
|
|
|
http.logout().permitAll(); |
|
|
|
// http.logout().permitAll();
|
|
|
|
|
|
|
|
// 授权配置
|
|
|
|
http.authorizeRequests() |
|
|
|
/* 所有静态文件可以访问 */ |
|
|
|
.antMatchers("/js/**","/css/**","/images/**").permitAll() |
|
|
|
/* 所有 以/ad 开头的 广告页面可以访问 */ |
|
|
|
.antMatchers("/ad/**").permitAll() |
|
|
|
.antMatchers("/user/**","/role/**").permitAll() |
|
|
|
/* 动态url权限 */ |
|
|
|
.withObjectPostProcessor(new DefinedObjectPostProcessor()) |
|
|
|
/* url决策 */ |
|
|
|
.accessDecisionManager(accessDecisionManager()) |
|
|
|
.anyRequest().authenticated(); |
|
|
|
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); |
|
|
|
|
|
|
|
/* 配置token验证过滤器 */ |
|
|
|
http.addFilterBefore(new JWTAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
protected void configure(AuthenticationManagerBuilder auth) throws Exception { |
|
|
|
auth.userDetailsService(userDetailsService()).passwordEncoder(new BCryptPasswordEncoder()); |
|
|
|
// auth.passwordEncoder(new BCryptPasswordEncoder());
|
|
|
|
// .withUser("nelson").password(new BCryptPasswordEncoder().encode("123456")).roles("admin")
|
|
|
|
// .and()
|
|
|
|
// .withUser("yasaka").password(new BCryptPasswordEncoder().encode("123456")).roles("user")
|
|
|
|
// .and()
|
|
|
|
// .withUser("one").password(new BCryptPasswordEncoder().encode("123456")).roles("gest")
|
|
|
|
// .and()
|
|
|
|
// .withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("root");
|
|
|
|
} |
|
|
|
|
|
|
|
@Bean |
|
|
|
public WebMvcConfigurer corsConfigurer() { |
|
|
|
return new WebMvcConfigurer() { |
|
|
|
@Override |
|
|
|
public void addCorsMappings(CorsRegistry registry) { |
|
|
|
registry.addMapping("/**"); |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
protected UserDetailsService userDetailsService() { |
|
|
|
return username -> { |
|
|
|
if(StringUtils.isBlank(username)){ |
|
|
|
if (StringUtils.isBlank(username)) { |
|
|
|
throw new UsernameNotFoundException("用户名为空"); |
|
|
|
} |
|
|
|
User user = userService.findByUsernameAndRole(username); |
|
|
|
if(user == null){ |
|
|
|
if (user == null) { |
|
|
|
throw new UsernameNotFoundException("用户不存在"); |
|
|
|
} |
|
|
|
return user; |
|
|
@ -117,25 +119,25 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { |
|
|
|
* |
|
|
|
* 决策管理 |
|
|
|
*/ |
|
|
|
private AccessDecisionManager accessDecisionManager() { |
|
|
|
List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList<>(); |
|
|
|
decisionVoters.add(new WebExpressionVoter()); |
|
|
|
decisionVoters.add(new AuthenticatedVoter()); |
|
|
|
decisionVoters.add(new RoleVoter()); |
|
|
|
/* 路由权限管理 */ |
|
|
|
decisionVoters.add(new UrlRoleAuthHandler()); |
|
|
|
return new UnanimousBased(decisionVoters); |
|
|
|
} |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private UrlRolesFilterHandler urlRolesFilterHandler; |
|
|
|
|
|
|
|
|
|
|
|
class DefinedObjectPostProcessor implements ObjectPostProcessor<FilterSecurityInterceptor> { |
|
|
|
@Override |
|
|
|
public <O extends FilterSecurityInterceptor> O postProcess(O object) { |
|
|
|
object.setSecurityMetadataSource(urlRolesFilterHandler); |
|
|
|
return object; |
|
|
|
} |
|
|
|
} |
|
|
|
// private AccessDecisionManager accessDecisionManager() {
|
|
|
|
// List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList<>();
|
|
|
|
// decisionVoters.add(new WebExpressionVoter());
|
|
|
|
// decisionVoters.add(new AuthenticatedVoter());
|
|
|
|
// decisionVoters.add(new RoleVoter());
|
|
|
|
// /* 路由权限管理 */
|
|
|
|
// decisionVoters.add(new UrlRoleAuthHandler());
|
|
|
|
// return new UnanimousBased(decisionVoters);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// @Autowired
|
|
|
|
// private UrlRolesFilterHandler urlRolesFilterHandler;
|
|
|
|
|
|
|
|
|
|
|
|
// class DefinedObjectPostProcessor implements ObjectPostProcessor<FilterSecurityInterceptor> {
|
|
|
|
// @Override
|
|
|
|
// public <O extends FilterSecurityInterceptor> O postProcess(O object) {
|
|
|
|
// object.setSecurityMetadataSource(urlRolesFilterHandler);
|
|
|
|
// return object;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
} |
|
|
|