SpringSecurity微服務(wù)實戰(zhàn)之公共模塊詳解
前言
在項目中安全框架是必不可少的,在微服務(wù)架構(gòu)中更是尤為重要,我們項目中將安全模塊單獨抽離了一個公共模塊出來,因為在我的項目架構(gòu)中 需要用到的SpringSecurity 至少有三個地方 boss服務(wù) admin服務(wù) user服務(wù)(saas)模式的一個微服務(wù)架構(gòu)
模塊結(jié)構(gòu)
主要分為 base服務(wù)(提供數(shù)據(jù),可以部署多份進(jìn)行負(fù)載均衡) boss模塊 admin模塊 gateway模塊 以及公共模塊其中就包含我們今天的主角 安全模塊。
我們在TokenLoginFilter
中繼承 AbstractAuthenticationProcessingFilter
抽象類 重寫 attemptAuthentication方法 在里面分別指定驗證器
@Override public Authentication attemptAuthentication(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws AuthenticationException, IOException, ServletException { if (!httpServletRequest.getMethod().equals("POST")) { throw new AuthenticationServiceException( "Authentication method not supported: " + httpServletRequest.getMethod()); } User user = new ObjectMapper().readValue( httpServletRequest.getInputStream(), User.class); //處理驗證碼 AbstractAuthenticationToken authRequest = null; switch(user.getType()) { //租戶登錄 case "1": authRequest = new TenantAuthenticationToken(user.getUsername(), user.getPassword()); break; //平臺登錄 case "2": authRequest = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()); break; } setDetails(httpServletRequest, authRequest); return this.getAuthenticationManager().authenticate(authRequest); }
其中TenantDetailsAuthenticationProvider
租戶驗證器(admin) 和UsernamePasswordAuthenticationProvider
平臺驗證器(boss)
這里當(dāng)然還可以再加其他的驗證器,比如后面如果還有app的話就可以在配置一個專門來做app端權(quán)限驗證的驗證器。
下面我們看看令牌的續(xù)期是怎么實現(xiàn)的: 令牌是由jwt生成 和 redis 配合使用,每一次親求進(jìn)來檢查token是否合法的同時校驗一下token的剩余時間是否大于一個閾值,如果小于閾值我們進(jìn)行reids 中的令牌刷新時間讓用戶無感知續(xù)約。
/** * 驗證令牌有效期,相差不足20分鐘,自動刷新緩存 * @param loginUser * @return 令牌 */ public void verifyToken(OnlineUserInfo loginUser,Integer type) { long expireTime = loginUser.getExpireTime(); long currentTime = System.currentTimeMillis(); long chazhu= expireTime - currentTime; if (chazhu <= MILLIS_MINUTE_TEN) { refreshToken(loginUser,type); } }
在訪問過濾器中進(jìn)行校驗就可以了,這樣就可以做到用戶無感知令牌續(xù)約。
安全驗證模塊目前是再每個服務(wù)上面引入使用,后面會考慮在網(wǎng)關(guān)層做鑒權(quán)處理。
最后貼一下 WebSecurityConfigBugVip
這個配置類
@Configuration @EnableWebSecurity public class WebSecurityConfigBugVip extends WebSecurityConfigurerAdapter { private TokenManager tokenManager; @Autowired private TenantDetailsAuthenticationProvider userDetailsAuthenticationProvider; @Autowired private UsernamePasswordAuthenticationProvider usernamePasswordAuthenticationProvider; @Autowired @Qualifier("authenticationManagerBean") private AuthenticationManager authenticationManager; /** * 裝配自定義的Provider * @param auth */ @Override public void configure(AuthenticationManagerBuilder auth){ auth.authenticationProvider(userDetailsAuthenticationProvider);//將我們自定義的認(rèn)證器配置進(jìn)來 auth.authenticationProvider(usernamePasswordAuthenticationProvider);//默認(rèn)的認(rèn)證器 } @Autowired public WebSecurityConfigBugVip(TokenManager tokenManager, RedisTemplate redisTemplate) { this.tokenManager = tokenManager; this.redisTemplate = redisTemplate; } /** * 配置設(shè)置 * * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { http.exceptionHandling() .authenticationEntryPoint(new UnauthorizedEntryPoint()) .and().csrf().disable() .addFilterAt(tokenLoginFilter(), UsernamePasswordAuthenticationFilter.class) .authorizeRequests()//配置需要放行的請求 .antMatchers("/swagger-ui.html/**","/v2/**","/webjars/**","/swagger-resources/**","/boss/verifi/getCode","/boss/verifi/checkVrrifyCode","/boss/sysuser/write","/boss/sysuser/read").permitAll() .anyRequest().authenticated() .and().logout().logoutUrl("/boss/acl/logout") .and().logout().logoutUrl("/admin/acl/logout") .addLogoutHandler(new TokenLogoutHandler(tokenManager, redisTemplate)).and() .addFilter(new TokenAuthenticationFilter(authenticationManager(), tokenManager, redisTemplate)).httpBasic();//設(shè)置訪問過濾器 } /** *token過濾器 */ @Bean public TokenLoginFilter tokenLoginFilter() { TokenLoginFilter filter = new TokenLoginFilter(); filter.setAuthenticationManager(authenticationManager); return filter; } /** * 處理注入 AuthenticationManager失敗問題 * @return * @throws Exception */ @Override @Bean public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } }
以上就是SpringSecurity微服務(wù)實戰(zhàn)之公共模塊詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringSecurity微服務(wù)公共模塊的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringCloud?Gateway之請求應(yīng)答日志打印方式
這篇文章主要介紹了SpringCloud?Gateway之請求應(yīng)答日志打印方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03java實現(xiàn)文件夾上傳功能實例代碼(SpringBoot框架)
在web項目中上傳文件夾現(xiàn)在已經(jīng)成為了一個主流的需求,下面這篇文章主要給大家介紹了關(guān)于java實現(xiàn)文件夾上傳功能(springBoot框架)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04Java Elastic Job動態(tài)添加任務(wù)實現(xiàn)過程解析
這篇文章主要介紹了Java Elastic Job動態(tài)添加任務(wù)實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08SpringCloud如何實現(xiàn)Zuul集群(負(fù)載均衡)
這篇文章主要介紹了SpringCloud如何實現(xiàn)Zuul集群(負(fù)載均衡)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07基于Java實現(xiàn)的Base64加密、解密原理代碼
這篇文章主要介紹了基于Java實現(xiàn)的Base64加密、解密原理代碼,需要的朋友可以參考下2014-07-07