WebSecurityConfig.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package com.welampiot.security;
  2. import com.welampiot.service.impl.UserDetailsServiceImpl;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.security.config.annotation.ObjectPostProcessor;
  7. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  8. import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
  9. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  10. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  11. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  12. import org.springframework.security.core.userdetails.UserDetailsService;
  13. import org.springframework.security.crypto.password.PasswordEncoder;
  14. import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
  15. import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
  16. import javax.annotation.Resource;
  17. @Configuration
  18. @EnableWebSecurity//开启Spring Security的功能
  19. //prePostEnabled属性决定Spring Security在接口前注解是否可用@PreAuthorize,@PostAuthorize等注解,设置为true,会拦截加了这些注解的接口
  20. @EnableGlobalMethodSecurity(prePostEnabled=true)
  21. public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  22. @Autowired
  23. private UserDetailsService userDetailsService;
  24. @Resource
  25. private MD5PasswordEncoder md5PasswordEncoder;
  26. //登录成功处理逻辑
  27. @Autowired
  28. CustomizeAuthenticationSuccessHandler authenticationSuccessHandler;
  29. //登录失败处理逻辑
  30. @Autowired
  31. CustomizeAuthenticationFailureHandler authenticationFailureHandler;
  32. //权限拒绝处理逻辑
  33. @Autowired
  34. CustomizeAccessDeniedHandler accessDeniedHandler;
  35. //匿名用户访问无权限资源时的异常
  36. @Autowired
  37. CustomizeAuthenticationEntryPoint authenticationEntryPoint;
  38. //会话失效(账号被挤下线)处理逻辑
  39. @Autowired
  40. CustomizeSessionInformationExpiredStrategy sessionInformationExpiredStrategy;
  41. //登出成功处理逻辑
  42. @Autowired
  43. CustomizeLogoutSuccessHandler logoutSuccessHandler;
  44. //访问决策管理器
  45. @Autowired
  46. CustomizeAccessDecisionManager accessDecisionManager;
  47. //实现权限拦截
  48. @Autowired
  49. CustomizeFilterInvocationSecurityMetadataSource securityMetadataSource;
  50. //图片验证码过滤器
  51. @Autowired
  52. private ValidateImageCodeFilter validateImageCodeFilter;
  53. @Autowired
  54. private CustomizeAbstractSecurityInterceptor securityInterceptor;
  55. @Bean
  56. public UserDetailsService userDetailsService() {
  57. //获取用户账号密码及权限信息
  58. return new UserDetailsServiceImpl();
  59. }
  60. @Override
  61. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  62. auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
  63. }
  64. @Override
  65. protected void configure(HttpSecurity http) throws Exception {
  66. http.cors().and().csrf().disable();
  67. //注册自定义图片验证码过滤器
  68. http.addFilterBefore(validateImageCodeFilter, UsernamePasswordAuthenticationFilter.class);
  69. http.authorizeRequests().antMatchers("/login","/image/getImage").permitAll().anyRequest().authenticated().
  70. // antMatchers("/login").anonymous().
  71. // antMatchers("/**").fullyAuthenticated().
  72. withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
  73. @Override
  74. public <O extends FilterSecurityInterceptor> O postProcess(O o) {
  75. o.setAccessDecisionManager(accessDecisionManager);//决策管理器
  76. o.setSecurityMetadataSource(securityMetadataSource);//安全元数据源
  77. return o;
  78. }
  79. }).
  80. //登出
  81. and().logout().logoutSuccessUrl("/logout")
  82. // permitAll().//允许所有用户
  83. .logoutSuccessHandler(logoutSuccessHandler)//登出成功处理逻辑
  84. .deleteCookies("JSESSIONID")//登出之后删除cookie
  85. //登入
  86. .and().formLogin().loginProcessingUrl("/login")
  87. // permitAll().//允许所有用户
  88. .successHandler(authenticationSuccessHandler)//登录成功处理逻辑
  89. .failureHandler(authenticationFailureHandler)//登录失败处理逻辑
  90. //异常处理(权限拒绝、登录失效等)
  91. .and().exceptionHandling().accessDeniedHandler(accessDeniedHandler)//权限拒绝处理逻辑
  92. .authenticationEntryPoint(authenticationEntryPoint)//匿名用户访问无权限资源时的异常处理
  93. //会话管理
  94. .and().sessionManagement()
  95. .maximumSessions(1)//同一账号同时登录最大用户数
  96. .expiredSessionStrategy(sessionInformationExpiredStrategy)//会话失效(账号被挤下线)处理逻辑
  97. ;
  98. // http.addFilterBefore(securityInterceptor, FilterSecurityInterceptor.class);
  99. }
  100. /**
  101. * 指定加密方式
  102. */
  103. @Bean
  104. public PasswordEncoder passwordEncoder(){
  105. // 使用MD5加密密码
  106. return new MD5PasswordEncoder();
  107. }
  108. }