欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解

 更新時(shí)間:2022年08月26日 14:21:58   作者:青衣畫(huà)白扇  
這篇文章主要為大家介紹了SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

在項(xiàng)目中安全框架是必不可少的,在微服務(wù)架構(gòu)中更是尤為重要,我們項(xiàng)目中將安全模塊單獨(dú)抽離了一個(gè)公共模塊出來(lái),因?yàn)樵谖业捻?xiàng)目架構(gòu)中 需要用到的SpringSecurity 至少有三個(gè)地方 boss服務(wù) admin服務(wù) user服務(wù)(saas)模式的一個(gè)微服務(wù)架構(gòu)

模塊結(jié)構(gòu)

主要分為 base服務(wù)(提供數(shù)據(jù),可以部署多份進(jìn)行負(fù)載均衡) boss模塊 admin模塊 gateway模塊 以及公共模塊其中就包含我們今天的主角 安全模塊。

我們?cè)?code>TokenLoginFilter中繼承 AbstractAuthenticationProcessingFilter抽象類(lèi) 重寫(xiě) attemptAuthentication方法 在里面分別指定驗(yàn)證器

@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);
    //處理驗(yàn)證碼
    AbstractAuthenticationToken authRequest = null;
    switch(user.getType()) {
        //租戶登錄
        case "1":
            authRequest = new TenantAuthenticationToken(user.getUsername(), user.getPassword());
            break;
        //平臺(tái)登錄
        case "2":
            authRequest = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword());
            break;
    }
    setDetails(httpServletRequest, authRequest);
    return this.getAuthenticationManager().authenticate(authRequest);
}

其中TenantDetailsAuthenticationProvider租戶驗(yàn)證器(admin) 和UsernamePasswordAuthenticationProvider 平臺(tái)驗(yàn)證器(boss)

這里當(dāng)然還可以再加其他的驗(yàn)證器,比如后面如果還有app的話就可以在配置一個(gè)專(zhuān)門(mén)來(lái)做app端權(quán)限驗(yàn)證的驗(yàn)證器。

下面我們看看令牌的續(xù)期是怎么實(shí)現(xiàn)的: 令牌是由jwt生成 和 redis 配合使用,每一次親求進(jìn)來(lái)檢查token是否合法的同時(shí)校驗(yàn)一下token的剩余時(shí)間是否大于一個(gè)閾值,如果小于閾值我們進(jìn)行reids 中的令牌刷新時(shí)間讓用戶無(wú)感知續(xù)約。

/**
 * 驗(yàn)證令牌有效期,相差不足20分鐘,自動(dòng)刷新緩存
 * @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);
    }
}

在訪問(wèn)過(guò)濾器中進(jìn)行校驗(yàn)就可以了,這樣就可以做到用戶無(wú)感知令牌續(xù)約。

安全驗(yàn)證模塊目前是再每個(gè)服務(wù)上面引入使用,后面會(huì)考慮在網(wǎng)關(guān)層做鑒權(quán)處理。

最后貼一下 WebSecurityConfigBugVip 這個(gè)配置類(lèi)

@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)來(lái)
        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()//配置需要放行的請(qǐng)求
                .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è)置訪問(wèn)過(guò)濾器
    }
    /**
    *token過(guò)濾器
    */
    @Bean
    public TokenLoginFilter tokenLoginFilter() {
        TokenLoginFilter filter = new TokenLoginFilter();
        filter.setAuthenticationManager(authenticationManager);
        return filter;
    }
    /**
     * 處理注入 AuthenticationManager失敗問(wèn)題
     * @return
     * @throws Exception
     */
    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

以上就是SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringSecurity微服務(wù)公共模塊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringCloud?Gateway之請(qǐng)求應(yīng)答日志打印方式

    SpringCloud?Gateway之請(qǐng)求應(yīng)答日志打印方式

    這篇文章主要介紹了SpringCloud?Gateway之請(qǐng)求應(yīng)答日志打印方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java之對(duì)象銷(xiāo)毀和finalize方法的使用

    Java之對(duì)象銷(xiāo)毀和finalize方法的使用

    這篇文章主要介紹了Java之對(duì)象銷(xiāo)毀和finalize方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java定時(shí)任務(wù)的三種實(shí)現(xiàn)方式

    Java定時(shí)任務(wù)的三種實(shí)現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于Java定時(shí)任務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Intellij IDEA十大快捷鍵

    Intellij IDEA十大快捷鍵

    Intellij IDEA中有很多快捷鍵讓人愛(ài)不釋手,stackoverflow上也有一些有趣的討論.這篇文章主要介紹了Intellij IDEA十大快捷鍵,需要的朋友可以參考下
    2018-03-03
  • java實(shí)現(xiàn)文件夾上傳功能實(shí)例代碼(SpringBoot框架)

    java實(shí)現(xiàn)文件夾上傳功能實(shí)例代碼(SpringBoot框架)

    在web項(xiàng)目中上傳文件夾現(xiàn)在已經(jīng)成為了一個(gè)主流的需求,下面這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)文件夾上傳功能(springBoot框架)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Java Elastic Job動(dòng)態(tài)添加任務(wù)實(shí)現(xiàn)過(guò)程解析

    Java Elastic Job動(dòng)態(tài)添加任務(wù)實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Java Elastic Job動(dòng)態(tài)添加任務(wù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringCloud如何實(shí)現(xiàn)Zuul集群(負(fù)載均衡)

    SpringCloud如何實(shí)現(xiàn)Zuul集群(負(fù)載均衡)

    這篇文章主要介紹了SpringCloud如何實(shí)現(xiàn)Zuul集群(負(fù)載均衡)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中獲取文件大小的詳解及實(shí)例代碼

    Java中獲取文件大小的詳解及實(shí)例代碼

    這篇文章主要介紹了Java中獲取文件大小的詳解及實(shí)例代碼的相關(guān)資料,一種是使用File的length()方法,另外一種是使用FileInputStream的available()方法,這里就說(shuō)下如何使用需要的朋友可以參考下
    2016-12-12
  • 基于Java實(shí)現(xiàn)的Base64加密、解密原理代碼

    基于Java實(shí)現(xiàn)的Base64加密、解密原理代碼

    這篇文章主要介紹了基于Java實(shí)現(xiàn)的Base64加密、解密原理代碼,需要的朋友可以參考下
    2014-07-07
  • Spring事務(wù)失效問(wèn)題分析及解決方案

    Spring事務(wù)失效問(wèn)題分析及解決方案

    這篇文章主要介紹了Spring事務(wù)失效問(wèn)題分析及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論