成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Boot Security防重登錄及在線總數

開發 前端
本篇給大家介紹Spring Boot Security防重登錄及在線總數的相關知識,希望對你有所幫助!

[[395788]]

 環境:Spring Boot 2.2.11.RELEASE + JPA2

Security流程處理

Security的核心是Filter,下圖是Security的執行流程

詳細步驟:

1.1

UsernamePasswordAuthenticationFilter的父類是AbstractAuthenticationProcessingFilter首先執行父類中的doFilter方法。

1.2 執行

UsernamePasswordAuthenticationFilter中的attemptAuthentication方法

這里實例化

UsernamePasswordAuthenticationToken對象存入用戶名及密碼進行接下來的驗證

1.3 進入驗證

this.getAuthenticationManager().authenticate(authRequest) 這里使用的是系統提供的ProviderManager對象進行驗證

關鍵是下面的這個for循環

 

這里先判斷AuthenticationProvider是否被支持

  1. Class<? extends Authentication> toTest = authentication.getClass(); 

這里的toTest就是

UsernamePasswordAuthenticationFilter類中調用的如下對象

1.4 既然要驗證用戶名密碼,那我們肯定地提供一個AuthenticationProvider對象同時必須還得要支持

UsernamePasswordAuthenticationToken對象類型的。所以我們提供如下一個DaoAuthenticationProvider子類,查看該類


關鍵在這個父類中,該父類中如下方法:

  1. public boolean supports(Class<?> authentication) { 
  2.         return (UsernamePasswordAuthenticationToken.class 
  3.                 .isAssignableFrom(authentication)); 
  4.     } 

 也就說明我們只需要提供DaoAuthenticationProvider一個子類就能對用戶進行驗證了。

1.5 自定義DaoAuthenticationProvider子類

  1. @Bean 
  2.     public DaoAuthenticationProvider daoAuthenticationProvider() { 
  3.         DaoAuthenticationProvider daoAuthen = new DaoAuthenticationProvider() ; 
  4.         daoAuthen.setPasswordEncoder(passwordEncoder()); 
  5.         daoAuthen.setUserDetailsService(userDetailsService()); 
  6.         daoAuthen.setHideUserNotFoundExceptions(false) ; 
  7.         return daoAuthen ; 
  8.     } 

 1.6 執行前面for中的如下代碼

  1. result = provider.authenticate(authentication); 

這里進入了DaoAuthenticationProvider的父類

AbstractUserDetailsAuthenticationProvider中的authenticate方法

該方法的核心方法

retrieveUser方法在子類DaoAuthenticationProvider中實現

如果這里返回了UserDetails(查詢到用戶)將進入下一步

1.7 進入密碼的驗證

這里調用子類DaoAuthenticationProvider的方法

剩下的就是成功后的事件處理,如果有異常進行統一的異常處理

Security登錄授權認證

  • 實體類
  1. @Entity 
  2. @Table(name = "T_USERS"
  3. public class Users implements UserDetails, Serializable { 
  4.   private static final long serialVersionUID = 1L; 
  5.     @Id 
  6.   @GeneratedValue(generator = "system-uuid"
  7.   @GenericGenerator(name = "system-uuid", strategy = "uuid"
  8.   private String id ; 
  9.   private String username ; 
  10.   private String password ; 
  •  DAO
  1. public interface UsersRepository extends JpaRepository<Users, String>, JpaSpecificationExecutor<Users> { 
  2.     Users findByUsernameAndPassword(String username, String password) ; 
  3.     Users findByUsername(String username) ; 
  •  Security 配置
  1. @Configuration 
  2. public class SecurityConfig extends WebSecurityConfigurerAdapter { 
  3.      
  4.     @Resource 
  5.     private UsersRepository ur ; 
  6.     @Resource 
  7.     private LogoutSuccessHandler logoutSuccessHandler ; 
  8.      
  9.     @Bean 
  10.     public UserDetailsService userDetailsService() { 
  11.         return username -> { 
  12.             Users user = ur.findByUsername(username) ; 
  13.             if (user == null) { 
  14.                 throw new UsernameNotFoundException("用戶名不存在") ; 
  15.             } 
  16.             return user ; 
  17.         }; 
  18.     } 
  19.      
  20.     @Bean 
  21.     public PasswordEncoder passwordEncoder() { 
  22.         return new PasswordEncoder() { 
  23.             @Override 
  24.             public boolean matches(CharSequence rawPassword, String encodedPassword) { 
  25.                 return rawPassword.equals(encodedPassword) ; 
  26.             } 
  27.             @Override 
  28.             public String encode(CharSequence rawPassword) { 
  29.                 return rawPassword.toString() ; 
  30.             } 
  31.         }; 
  32.     } 
  33.      
  34.     @Bean 
  35.     public DaoAuthenticationProvider daoAuthenticationProvider() { 
  36.         DaoAuthenticationProvider daoAuthen = new DaoAuthenticationProvider() ; 
  37.         daoAuthen.setPasswordEncoder(passwordEncoder()); 
  38.         daoAuthen.setUserDetailsService(userDetailsService()); 
  39.         daoAuthen.setHideUserNotFoundExceptions(false) ; 
  40.         return daoAuthen ; 
  41.     } 
  42.      
  43.     @Bean 
  44.     public SessionRegistry sessionRegistry() { 
  45.         return new SessionRegistryImpl() ; 
  46.     } 
  47.      
  48.     // 這個不配置sessionRegistry中的session不失效 
  49.     @Bean 
  50.     public HttpSessionEventPublisher httpSessionEventPublisher() { 
  51.         return new HttpSessionEventPublisher(); 
  52.     } 
  53.      
  54.     @Override 
  55.     protected void configure(HttpSecurity http) throws Exception { 
  56.         http 
  57.             .csrf().disable() 
  58.             .authorizeRequests() 
  59.             .antMatchers("/pos/**"
  60.             .authenticated() 
  61.         .and() 
  62.             .formLogin() 
  63.             .loginPage("/sign/login"
  64.         .and() 
  65.             .logout() 
  66.             .logoutSuccessHandler(logoutSuccessHandler) 
  67.             .logoutUrl("/sign/logout"); 
  68.     // 這里配置最大同用戶登錄個數 
  69.         http.sessionManagement().maximumSessions(1).expiredUrl("/sign/login?expired").sessionRegistry(sessionRegistry()) ; 
  70.     } 
  71.      
  •  Controller相關接口
  1. @Controller 
  2. public class LoginController { 
  3.      
  4.     @RequestMapping("/sign/login"
  5.     public String login() { 
  6.         return "login" ; 
  7.     } 
  8.      
  9. @RestController 
  10. @RequestMapping("/sign"
  11. public class LogoutController { 
  12.      
  13.     @GetMapping("/logout"
  14.     public Object logout(HttpServletRequest request) { 
  15.         HttpSession session = request.getSession(false); 
  16.         if (session != null) { 
  17.             session.invalidate(); 
  18.         } 
  19.         SecurityContext context = SecurityContextHolder.getContext(); 
  20.         context.setAuthentication(null); 
  21.         SecurityContextHolder.clearContext(); 
  22.         return "success" ; 
  23.     } 
  24.      
  25. @RestController 
  26. @RequestMapping("/pos"
  27. public class PosController { 
  28.      
  29.     @GetMapping(""
  30.     public Object get() { 
  31.         return "pos success" ; 
  32.     } 
  33.      
  34. // 通過下面接口獲取在線人數 
  35. @RestController 
  36. @RequestMapping("/sessions"
  37. public class SessionController { 
  38.      
  39.     @Resource 
  40.     private SessionRegistry sessionRegistry ; 
  41.      
  42.     @GetMapping(""
  43.     public Object list() { 
  44.         return sessionRegistry.getAllPrincipals() ; 
  45.     } 
  46.      

 測試:

在chrome瀏覽器用zs用戶登錄

用360瀏覽器也用zs登錄

360登錄后刷新chrome瀏覽器

登錄已經失效了,配置的最大登錄個數也生效了。

完畢!!!

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2025-02-28 13:00:00

SpringBoot接口接口安全

2024-07-26 07:59:25

2022-11-26 00:00:02

2023-12-08 12:12:21

2022-09-06 08:40:33

應用系統登錄方式Spring

2021-12-28 11:13:05

安全認證 Spring Boot

2021-04-28 06:26:11

Spring Secu功能實現源碼分析

2025-02-04 11:18:49

Spring安全應用

2021-03-04 11:50:48

微信Spring Secu登錄

2021-05-12 08:32:53

Spring Secu 自定義session

2021-07-13 14:05:37

單點登錄頁面

2021-04-23 07:33:10

SpringSecurity單元

2021-08-29 18:36:57

項目

2021-01-06 10:09:05

Spring Boothttps sslhttps

2025-06-06 02:11:00

防刷限量防重

2022-06-12 06:45:26

高并發防重

2025-02-21 12:00:00

SpringBoot防重復提交緩存機制

2022-02-15 07:35:12

服務器KeycloakOAuth2

2024-06-14 09:30:58

2022-01-26 07:01:00

開源社區項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本一二三区在线观看 | 国产成人黄色 | 国产精品一区二区三区四区 | 亚洲福利视频一区二区 | 综合色影院 | 蜜桃视频在线观看免费视频网站www | 午夜久久久| 日本手机在线 | 国产中文字幕在线观看 | 黄色免费三级 | 亚洲精品一区二区另类图片 | 精品国产欧美日韩不卡在线观看 | 精品久久久久久久久久久久久久久久久 | 高清18麻豆| www.久久99 | 精品久久久久久一区二区 | 成人免费视频在线观看 | 亚洲在线日韩 | 懂色av色香蕉一区二区蜜桃 | 欧美一级在线观看 | 日韩av在线一区 | 国产一区二区三区久久久久久久久 | 国产精品一区2区 | 免费高清av | 亚洲精品日本 | 一区二区三区回区在观看免费视频 | 日韩专区中文字幕 | 国产精品a免费一区久久电影 | 99精品久久久久久中文字幕 | 色婷婷av777 av免费网站在线 | 欧美一区中文字幕 | 日韩区| 日本一区二区影视 | 色噜噜亚洲男人的天堂 | 国产69久久精品成人看动漫 | 欧美精品一区在线 | 天天草天天干天天 | 超碰欧美 | 国产一区二区中文字幕 | 国产一区二区免费电影 | 亚洲一区二区三区桃乃木香奈 |