WebSecurityConfig.java 5.3 KB

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