<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在專案中安全框架是必不可少的,在微服務架構中更是尤為重要,我們專案中將安全模組單獨抽離了一個公共模組出來,因為在我的專案架構中 需要用到的SpringSecurity 至少有三個地方 boss服務 admin服務 user服務(saas)模式的一個微服務架構
主要分為 base服務(提供資料,可以部署多份進行負載均衡) 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)
這裡當然還可以再加其他的驗證器,比如後面如果還有app的話就可以在設定一個專門來做app端許可權驗證的驗證器。
下面我們看看令牌的續期是怎麼實現的: 令牌是由jwt生成 和 redis 配合使用,每一次親求進來檢查token是否合法的同時校驗一下token的剩餘時間是否大於一個閾值,如果小於閾值我們進行reids 中的令牌重新整理時間讓使用者無感知續約。
/** * 驗證令牌有效期,相差不足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); } }
在存取過濾器中進行校驗就可以了,這樣就可以做到使用者無感知令牌續約。
安全驗證模組目前是再每個服務上面引入使用,後面會考慮在閘道器層做鑑權處理。
最後貼一下 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);//將我們自定義的認證器設定進來 auth.authenticationProvider(usernamePasswordAuthenticationProvider);//預設的認證器 } @Autowired public WebSecurityConfigBugVip(TokenManager tokenManager, RedisTemplate redisTemplate) { this.tokenManager = tokenManager; this.redisTemplate = redisTemplate; } /** * 設定設定 * * @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();//設定存取過濾器 } /** *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微服務實戰之公共模組詳解的詳細內容,更多關於SpringSecurity微服務公共模組的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45