|  | @@ -0,0 +1,144 @@
 | 
	
		
			
				|  |  | +package com.genersoft.iot.vmp.conf.security;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +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.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.builders.WebSecurity;
 | 
	
		
			
				|  |  | +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 | 
	
		
			
				|  |  | +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 | 
	
		
			
				|  |  | +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * 配置Spring Security
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +@Configuration
 | 
	
		
			
				|  |  | +@EnableWebSecurity
 | 
	
		
			
				|  |  | +@EnableGlobalMethodSecurity(prePostEnabled = true)
 | 
	
		
			
				|  |  | +public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private DefaultUserDetailsServiceImpl userDetailsService;
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 登出成功的处理
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private LoginFailureHandler loginFailureHandler;
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 登录成功的处理
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private LoginSuccessHandler loginSuccessHandler;
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 登出成功的处理
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private LogoutHandler logoutHandler;
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 未登录的处理
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private AnonymousAuthenticationEntryPoint anonymousAuthenticationEntryPoint;
 | 
	
		
			
				|  |  | +//    /**
 | 
	
		
			
				|  |  | +//     * 超时处理
 | 
	
		
			
				|  |  | +//     */
 | 
	
		
			
				|  |  | +//    @Autowired
 | 
	
		
			
				|  |  | +//    private InvalidSessionHandler invalidSessionHandler;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//    /**
 | 
	
		
			
				|  |  | +//     * 顶号处理
 | 
	
		
			
				|  |  | +//     */
 | 
	
		
			
				|  |  | +//    @Autowired
 | 
	
		
			
				|  |  | +//    private SessionInformationExpiredHandler sessionInformationExpiredHandler;
 | 
	
		
			
				|  |  | +//    /**
 | 
	
		
			
				|  |  | +//     * 登录用户没有权限访问资源
 | 
	
		
			
				|  |  | +//     */
 | 
	
		
			
				|  |  | +//    @Autowired
 | 
	
		
			
				|  |  | +//    private LoginUserAccessDeniedHandler accessDeniedHandler;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 描述: 静态资源放行,这里的放行,是不走 Spring Security 过滤器链
 | 
	
		
			
				|  |  | +     **/
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void configure(WebSecurity web) {
 | 
	
		
			
				|  |  | +        // 可以直接访问的静态数据
 | 
	
		
			
				|  |  | +        web.ignoring()
 | 
	
		
			
				|  |  | +                .antMatchers("/")
 | 
	
		
			
				|  |  | +                .antMatchers("/css/**")
 | 
	
		
			
				|  |  | +                .antMatchers("/img/**")
 | 
	
		
			
				|  |  | +                .antMatchers("/fonts/**")
 | 
	
		
			
				|  |  | +                .antMatchers("/index.html")
 | 
	
		
			
				|  |  | +                .antMatchers("/doc.html") // "/webjars/**", "/swagger-resources/**", "/v3/api-docs/**"
 | 
	
		
			
				|  |  | +                .antMatchers("/webjars/**")
 | 
	
		
			
				|  |  | +                .antMatchers("/swagger-resources/**")
 | 
	
		
			
				|  |  | +                .antMatchers("/v3/api-docs/**")
 | 
	
		
			
				|  |  | +                .antMatchers("/js/**");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 配置认证方式
 | 
	
		
			
				|  |  | +     * @param auth
 | 
	
		
			
				|  |  | +     * @throws Exception
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
 | 
	
		
			
				|  |  | +        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
 | 
	
		
			
				|  |  | +        // 设置不隐藏 未找到用户异常
 | 
	
		
			
				|  |  | +        provider.setHideUserNotFoundExceptions(true);
 | 
	
		
			
				|  |  | +        // 用户认证service - 查询数据库的逻辑
 | 
	
		
			
				|  |  | +        provider.setUserDetailsService(userDetailsService);
 | 
	
		
			
				|  |  | +        // 设置密码加密算法
 | 
	
		
			
				|  |  | +        provider.setPasswordEncoder(passwordEncoder());
 | 
	
		
			
				|  |  | +        auth.authenticationProvider(provider);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    protected void configure(HttpSecurity http) throws Exception {
 | 
	
		
			
				|  |  | +        http.cors().and().csrf().disable();
 | 
	
		
			
				|  |  | +        http.authorizeRequests()
 | 
	
		
			
				|  |  | +                // 放行接口
 | 
	
		
			
				|  |  | +                .antMatchers("/api/user/login","/index/hook/**").permitAll()
 | 
	
		
			
				|  |  | +                // 除上面外的所有请求全部需要鉴权认证
 | 
	
		
			
				|  |  | +                .anyRequest().authenticated()
 | 
	
		
			
				|  |  | +                // 异常处理(权限拒绝、登录失效等)
 | 
	
		
			
				|  |  | +                .and().exceptionHandling()
 | 
	
		
			
				|  |  | +                .authenticationEntryPoint(anonymousAuthenticationEntryPoint)//匿名用户访问无权限资源时的异常处理
 | 
	
		
			
				|  |  | +//                .accessDeniedHandler(accessDeniedHandler)//登录用户没有权限访问资源
 | 
	
		
			
				|  |  | +                // 登入
 | 
	
		
			
				|  |  | +                .and().formLogin().permitAll()//允许所有用户
 | 
	
		
			
				|  |  | +                .successHandler(loginSuccessHandler)//登录成功处理逻辑
 | 
	
		
			
				|  |  | +                .failureHandler(loginFailureHandler)//登录失败处理逻辑
 | 
	
		
			
				|  |  | +                // 登出
 | 
	
		
			
				|  |  | +                .and().logout().logoutUrl("/api/user/logout").permitAll()//允许所有用户
 | 
	
		
			
				|  |  | +                .logoutSuccessHandler(logoutHandler)//登出成功处理逻辑
 | 
	
		
			
				|  |  | +                .deleteCookies("JSESSIONID")
 | 
	
		
			
				|  |  | +                // 会话管理
 | 
	
		
			
				|  |  | +//                .and().sessionManagement().invalidSessionStrategy(invalidSessionHandler) // 超时处理
 | 
	
		
			
				|  |  | +//                .maximumSessions(1)//同一账号同时登录最大用户数
 | 
	
		
			
				|  |  | +//                .expiredSessionStrategy(sessionInformationExpiredHandler) // 顶号处理
 | 
	
		
			
				|  |  | +        ;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 描述: 密码加密算法 BCrypt 推荐使用
 | 
	
		
			
				|  |  | +     **/
 | 
	
		
			
				|  |  | +    @Bean
 | 
	
		
			
				|  |  | +    public BCryptPasswordEncoder passwordEncoder() {
 | 
	
		
			
				|  |  | +        return new BCryptPasswordEncoder();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 描述: 注入AuthenticationManager管理器
 | 
	
		
			
				|  |  | +     **/
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Bean
 | 
	
		
			
				|  |  | +    public AuthenticationManager authenticationManager() throws Exception {
 | 
	
		
			
				|  |  | +        return super.authenticationManager();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |