色婷婷亚洲六月婷婷中文字幕_人人狠狠综合久久亚洲爱咲_国产精品乱子伦xxxx裸_东京熟影院_三级全黄的视频在线观看

實時

您的位置:首頁>資訊 >

Spring Boot的安全配置(三)

JWT

JWT(JSON Web Token)是一種用于在網(wǎng)絡(luò)中傳輸安全信息的開放標(biāo)準(zhǔn)(RFC 7519)。它可以在各個服務(wù)之間安全地傳遞用戶認證信息,因為它使用數(shù)字簽名來驗證信息的真實性和完整性。

JWT有三個部分,每個部分用點(.)分隔:


(資料圖)

Header:通常包含JWT使用的簽名算法和令牌類型。Payload:包含有關(guān)用戶或其他主題的聲明信息。聲明是有關(guān)實體(通常是用戶)和其他數(shù)據(jù)的JSON對象。聲明被編碼為JSON,然后使用Base64 URL編碼。Signature:用于驗證消息是否未被篡改并且來自預(yù)期的發(fā)送者。簽名由使用Header中指定的算法和秘鑰對Header和Payload進行加密產(chǎn)生。

在Spring Boot中,您可以使用Spring Security和jjwt庫來實現(xiàn)JWT的認證和授權(quán)。下面是一個使用JWT的示例:

@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {    @Value("${jwt.secret}")    private String jwtSecret;    @Override    protected void configure(HttpSecurity http) throws Exception {        http.csrf().disable()            .authorizeRequests()            .antMatchers(HttpMethod.POST, "/api/authenticate").permitAll()            .anyRequest().authenticated()            .and()            .addFilter(new JwtAuthenticationFilter(authenticationManager(), jwtSecret))            .addFilter(new JwtAuthorizationFilter(authenticationManager(), jwtSecret))            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);    }    @Override    public void configure(AuthenticationManagerBuilder auth) throws Exception {        auth.authenticationProvider(new JwtAuthenticationProvider(jwtSecret));    }}

在上面的示例中,SecurityConfig類繼承了WebSecurityConfigurerAdapter并使用了@EnableWebSecurity注解啟用Spring Security。configure()方法使用HttpSecurity對象來配置HTTP請求的安全性。.csrf().disable()禁用了CSRF保護。.authorizeRequests()表示進行授權(quán)請求。.antMatchers(HttpMethod.POST, "/api/authenticate").permitAll()表示允許POST請求到/api/authenticate路徑。.anyRequest().authenticated()表示要求所有其他請求都需要身份驗證。.addFilter(new JwtAuthenticationFilter(authenticationManager(), jwtSecret)).addFilter(new JwtAuthorizationFilter(authenticationManager(), jwtSecret))分別添加JWT認證和授權(quán)過濾器。.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)指定了會話管理策略。

configure()方法中還有一個configure(AuthenticationManagerBuilder auth)方法,它使用JwtAuthenticationProvider類配置身份驗證。在這里,jwtSecret被注入到JwtAuthenticationProvider構(gòu)造函數(shù)中,以便在認證過程中使用。

下面是JwtAuthenticationFilterJwtAuthorizationFilter的實現(xiàn):

public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {    private final AuthenticationManager authenticationManager;    private final String jwtSecret;    public JwtAuthenticationFilter(AuthenticationManager authenticationManager, String jwtSecret) {        this.authenticationManager = authenticationManager;        this.jwtSecret = jwtSecret;        setFilterProcessesUrl("/api/authenticate");    }    @Override    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {        try {            LoginRequest loginRequest = new ObjectMapper().readValue(request.getInputStream(), LoginRequest.class);            Authentication authentication = new UsernamePasswordAuthenticationToken(                    loginRequest.getUsername(),                    loginRequest.getPassword()            );            return authenticationManager.authenticate(authentication);        } catch (IOException e) {            throw new RuntimeException(e);        }    }    @Override    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) {        UserPrincipal userPrincipal = (UserPrincipal) authResult.getPrincipal();        String token = Jwts.builder()                .setSubject(userPrincipal.getUsername())                .setIssuedAt(new Date())                .setExpiration(new Date(System.currentTimeMillis() + 864000000))                .signWith(SignatureAlgorithm.HS512, jwtSecret)                .compact();        response.addHeader("Authorization", "Bearer " + token);    }}

JwtAuthenticationFilter類繼承了UsernamePasswordAuthenticationFilter類,它用于處理基于用戶名和密碼的身份驗證。它還使用AuthenticationManager來驗證用戶名和密碼是否正確。jwtSecret在構(gòu)造函數(shù)中被注入,用于生成JWT令牌。

attemptAuthentication()方法中,LoginRequest對象被反序列化為從請求中獲取的用戶名和密碼。這些值被封裝到UsernamePasswordAuthenticationToken中,并傳遞給AuthenticationManager以驗證用戶身份。

在身份驗證成功后,successfulAuthentication()方法被調(diào)用。在這里,UserPrincipal對象被從Authentication對象中獲取,然后使用Jwts類生成JWT令牌。setSubject()方法將用戶名設(shè)置為JWT主題。setIssuedAt()方法設(shè)置JWT令牌的發(fā)行時間。setExpiration()方法設(shè)置JWT令牌的到期時間。signWith()方法使用HS512算法和jwtSecret密鑰對JWT令牌進行簽名。最后,JWT令牌被添加到響應(yīng)標(biāo)頭中。

下面是JwtAuthorizationFilter的實現(xiàn):

public class JwtAuthorizationFilter extends BasicAuthenticationFilter {    private final String jwtSecret;    public JwtAuthorizationFilter(AuthenticationManager authenticationManager, String jwtSecret) {        super(authenticationManager);        this.jwtSecret = jwtSecret;    }    @Override    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {        String authorizationHeader = request.getHeader("Authorization");        if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {            chain.doFilter(request, response);            return;        }        String token = authorizationHeader.replace("Bearer ", "");        try {            Jws claimsJws = Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token);            String username = claimsJws.getBody().getSubject();            List authorities = (List) claimsJws.getBody().get("authorities");            List grantedAuthorities = authorities.stream()                    .map(SimpleGrantedAuthority::new)                    .collect(Collectors.toList());            Authentication authentication = new UsernamePasswordAuthenticationToken(username, null, grantedAuthorities);            SecurityContextHolder.getContext().setAuthentication(authentication);            chain.doFilter(request, response);        } catch (JwtException e) {            response.setStatus(HttpStatus.UNAUTHORIZED.value());        }    }}

JwtAuthorizationFilter類繼承了BasicAuthenticationFilter類,并覆蓋了doFilterInternal()方法。在這個方法中,請求頭中的Authorization標(biāo)頭被解析,如果它不是以Bearer開頭,則直接傳遞給過濾器鏈。否則,從令牌中解析出主題(用戶名)和授權(quán)信息,然后創(chuàng)建一個包含用戶身份驗證和授權(quán)信息的Authentication對象,并將其設(shè)置到SecurityContextHolder中。

如果JWT令牌無效,JwtException將被拋出,并返回HTTP 401未經(jīng)授權(quán)的錯誤。

關(guān)鍵詞:

推薦閱讀
JWT(JSONWebToken)是一種用于在網(wǎng)絡(luò)中傳輸安全信息的開放標(biāo)準(zhǔn)(RFC7519)。它可以在各個服務(wù)之間安全地傳遞用戶認證信息,因為它使用數(shù)字簽

2023-04-07 01:23:20

01:39山東全力加快數(shù)字強省建設(shè),算力應(yīng)用的新模式、新業(yè)態(tài)加速涌現(xiàn),為經(jīng)濟高質(zhì)量發(fā)展提供重要支撐。奧德精密是一家從事氣

2023-04-06 21:55:36

紐甜也叫尼爾甜,化學(xué)名稱N-[N-(3,3一二甲基丁基)-L-α-天冬氨酰]-L-苯丙氨酸-1-甲酯,是一種功能性甜味劑,甜度達到我們熟知蔗糖的2000倍,產(chǎn)品

2023-04-06 20:49:17

有朋友咨詢?nèi)绾螔呔礃I(yè)福,今天就聊聊這個話題,希望可以幫到大家。首先打開手機,打開支付寶,在主頁面上方有五福到活動,點擊“點擊進入”按

2023-04-06 19:32:16

廣西2023年注冊會計師全國統(tǒng)一考試報名時間及繳費時間地區(qū)報名時間繳費時間收費標(biāo)準(zhǔn)查看報名公告廣西自治區(qū)4月6日至4月28日6月15日-6月30日廣

2023-04-06 17:38:25

據(jù)市場監(jiān)管總局消息,2022年,市場監(jiān)管總局組織建筑材料產(chǎn)品質(zhì)量國家監(jiān)督抽查。本次抽查1704家企業(yè)生產(chǎn)的1920批次建筑材料產(chǎn)品,涉及熱軋帶肋

2023-04-06 16:49:11

1、中國人民解放軍專業(yè)性、綜合性的藝術(shù)團體。2、主要職能是:通過戲劇、音樂、舞蹈、曲藝、雜技等創(chuàng)作和演出,宣傳愛國主

2023-04-06 15:58:29

重慶集中簽約超2000億元重大招商項目

2023-04-06 14:53:57

今天片仔癀股票行情觀念:成績平穩(wěn),走勢較弱,短期需持幣張望6月10日:短線大盤技能上還有回調(diào)壓力耐今天可申購新股:無。

2023-04-06 13:56:30

河南省2023年上半年自考成績什么時候公布考試成績公布時間:2023年5月22日;成績復(fù)核申請時間:2023年5月22日—5月28日,過期不再受理;5、畢業(yè)申請

2023-04-06 12:46:17

微軟已將OpenAI的GPT-4集成到Microsoft365生產(chǎn)力應(yīng)用套件中,這是一項非常艱巨的任務(wù),但公司一直希望能夠盡快完成。因此,微軟動員了數(shù)百名員

2023-04-06 11:55:15

圖為變體神人紋罐,馬家窯文化馬廠類型(約公元前2300年至公元前2000年),1975年于甘肅省蘭州市土古臺出土,甘肅省博物館收藏。視覺中國供圖

2023-04-06 11:05:25

消費需求是最終需求,消費也是暢通國內(nèi)大循環(huán)的關(guān)鍵環(huán)節(jié)。今年《政府工作報告》提出,把恢復(fù)和擴大消費擺在優(yōu)先位置。當(dāng)前,為增強國內(nèi)大循環(huán)

2023-04-06 10:07:51

股票估值低是什么意思?股票估值低通常就是指股票當(dāng)前的價格低于內(nèi)在價值的情況,一般是指股票價值被低估了。在股票投資中,往往股票估值月

2023-04-06 09:24:07

中國銀河證券表示,目前美聯(lián)儲結(jié)束本輪加息周期時點臨近,市場對降息預(yù)期升溫,或?qū)㈤_啟金價的新一輪上漲周期。上一輪黃金牛市(

2023-04-06 08:32:46

1、《濰坊高等職業(yè)教育》雜志是由濰坊職業(yè)學(xué)院主辦,反映我院乃至全市高等職業(yè)教育的教學(xué)、科研成果的綜合性學(xué)術(shù)刊物。2、

2023-04-06 04:56:19

這里為大家?guī)韘team2023春季促銷結(jié)束時間一覽的詳細攻略,是很多玩家都遇到的一個難題,下面一起來看看具體的完成步驟。這款游戲中最近新出的

2023-04-05 23:45:48

這個品牌想要編寫終極自動駕駛算法。本田已經(jīng)為一種系統(tǒng)申請了專利,該系統(tǒng)將幫助未來的自動駕駛汽車更準(zhǔn)確地預(yù)測其他道路使用者的行為。Ca

2023-04-05 19:37:56

張繼科的瓜持續(xù)發(fā)酵,上面已經(jīng)在調(diào)查,如果屬實將會發(fā)公告,大家耐心等待,離真相不遠了。那些索要資源的人也是看熱鬧不嫌事大,無論從道德還

2023-04-05 18:01:11