国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot 整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot 整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

??前言

本文主要講了Spring Security文章,如果有什么需要改進(jìn)的地方還請(qǐng)大佬指出??

??作者簡(jiǎn)介:大家好,我是青衿??
??博客首頁(yè):CSDN主頁(yè)放風(fēng)講故事
??每日一句:努力一點(diǎn),優(yōu)秀一點(diǎn)

Spring Boot 整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證,spring boot,redis,后端

目錄


Spring Security

一、介紹

Spring Security是一個(gè)強(qiáng)大且高度可定制的身份驗(yàn)證和訪問(wèn)控制框架。它是保護(hù)基于Spring的應(yīng)用程序的實(shí)際標(biāo)準(zhǔn)。Spring Security是一個(gè)可以為Java應(yīng)用程序提供全面安全服務(wù)的框架。同時(shí),它也可以輕松擴(kuò)展以滿足自定義需求。

二、主要功能

Authentication (認(rèn)證),就是用戶登錄
Authorization (授權(quán)):一旦身份驗(yàn)證成功,判斷用戶擁有什么權(quán)限,可以訪問(wèn)什么資源
防止跨站請(qǐng)求偽造(CSRF):Spring Security提供了內(nèi)置的防護(hù)機(jī)制,可以防止跨站請(qǐng)求偽造攻擊。
密碼存儲(chǔ):Spring Security提供了多種密碼存儲(chǔ)格式,包括明文、加密和哈希。
集成其他安全框架:Spring Security可以與其他安全框架如OAuth2、JWT等進(jìn)行集成,以提供更全面的安全解決方案。

三、原理

? SpringSecurity的原理其實(shí)就是一個(gè)過(guò)濾器鏈,內(nèi)部包含了提供各種功能的過(guò)濾器。

1. SpringSecurity 過(guò)濾器鏈

Spring Boot 整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證,spring boot,redis,后端

SpringSecurity 采用的是責(zé)任鏈的設(shè)計(jì)模式,它有一條很長(zhǎng)的過(guò)濾器鏈。

  • SecurityContextPersistenceFilter:每次請(qǐng)求處理之前將該請(qǐng)求相關(guān)的安全上下文信息加載到 SecurityContextHolder 中。
  • LogoutFilter:用于處理退出登錄。
  • UsernamePasswordAuthenticationFilter:用于處理基于表單的登錄請(qǐng)求,從表單中獲取用戶名和密碼。
  • BasicAuthenticationFilter:檢測(cè)和處理 http basic 認(rèn)證。
  • ExceptionTranslationFilter:處理過(guò)濾器鏈中拋出的任何AccessDeniedException和AuthenticationException 。
  • FilterSecurityInterceptor:負(fù)責(zé)權(quán)限校驗(yàn)的過(guò)濾器,可以看做過(guò)濾器鏈的出口。

流程說(shuō)明:客戶端發(fā)起一個(gè)請(qǐng)求,進(jìn)入 Security 過(guò)濾器鏈。
1.當(dāng)?shù)?LogoutFilter 的時(shí)候判斷是否是登出路徑,如果是登出路徑則到 logoutHandler ,如果登出成功則到logoutSuccessHandler 登出成功處理,如果登出失敗則由 ExceptionTranslationFilter ;如果不是登出路徑則直接進(jìn)入下一個(gè)過(guò)濾器。

2.當(dāng)?shù)?UsernamePasswordAuthenticationFilter 的時(shí)候判斷是否為登錄路徑,如果是,則進(jìn)入該過(guò)濾器進(jìn)行登錄操作,如果登錄失敗則到 AuthenticationFailureHandler 登錄失敗處理器處理,如果登錄成功則到 AuthenticationSuccessHandler 登錄成功處理器處理,如果不是登錄請(qǐng)求則不進(jìn)入該過(guò)濾器。

3.當(dāng)?shù)?FilterSecurityInterceptor 的時(shí)候會(huì)拿到 uri ,根據(jù) uri 去找對(duì)應(yīng)的鑒權(quán)管理器,鑒權(quán)管理器做鑒權(quán)工作,鑒權(quán)成功則到 Controller 層否則到 AccessDeniedHandler 鑒權(quán)失敗處理器處理。

2. JWT校驗(yàn)登錄的校驗(yàn)流程

Spring Boot 整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證,spring boot,redis,后端

首先前端一樣是把登錄信息發(fā)送給后端,后端查詢數(shù)據(jù)庫(kù)校驗(yàn)用戶的賬號(hào)和密碼是否正確,正確的話則使用jwt生成token,并且返回給前端。以后前端每次請(qǐng)求時(shí),都需要攜帶token,后端獲取token后,使用jwt進(jìn)行驗(yàn)證用戶的token是否無(wú)效或過(guò)期,驗(yàn)證成功后才去做相應(yīng)的邏輯。

四、Spring Boot整合Redis、SpringSecurity、JWT的示例demo

  1. 添加依賴(lài)項(xiàng)在 pom.xml 文件中添加以下依賴(lài)項(xiàng):
   <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
</dependencies>`
  1. 創(chuàng)建Redis配置類(lèi)
@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        return new JedisConnectionFactory(new RedisStandaloneConfiguration(host, port));
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(jedisConnectionFactory());
        return template;
    }
}
  1. 創(chuàng)建 JwtTokenUtil 類(lèi),用于生成和驗(yàn)證JWT令牌。
@Component
public class JwtTokenUtil implements Serializable {

    private static final long serialVersionUID = -2550185165626007488L;

    private static final String secret = "mySecret";

    public String getUsernameFromToken(String token) {
        return getClaimFromToken(token, Claims::getSubject);
    }

    public Date getExpirationDateFromToken(String token) {
        return getClaimFromToken(token, Claims::getExpiration);
    }

    public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = getAllClaimsFromToken(token);
        return claimsResolver.apply(claims);
    }

    private Claims getAllClaimsFromToken(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }

    private Boolean isTokenExpired(String token) {
        final Date expiration = getExpirationDateFromToken(token);
        return expiration.before(new Date());
    }

    public String generateToken(UserDetails userDetails) {
        Map<String, Object> claims = new HashMap<>();
        return doGenerateToken(claims, userDetails.getUsername());
    }

    private String doGenerateToken(Map<String, Object> claims, String subject) {
        return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + 5 * 60 * 60 * 1000))
                .signWith(SignatureAlgorithm.HS512, secret).compact();
    }

    public Boolean validateToken(String token, UserDetails userDetails) {
        final String username = getUsernameFromToken(token);
        return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
    }
}` 
  1. 創(chuàng)建 JwtAuthenticationEntryPoint 類(lèi),用于處理未經(jīng)授權(quán)的請(qǐng)求。
@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint, Serializable {

    private static final long serialVersionUID = -7858869558953243875L;

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
                         AuthenticationException authException) throws IOException {

        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
    }
}` 
  1. 創(chuàng)建 JwtRequestFilter 類(lèi),用于解析和驗(yàn)證JWT令牌。
@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    private MyUserDetailsService myUserDetailsService;

    @Autowired
    private JwtTokenUtil jwtTokenUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {

        final String requestTokenHeader = request.getHeader("Authorization");

        String username = null;
        String jwtToken = null;

        if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) {
            jwtToken = requestTokenHeader.substring(7);
            try {
                username = jwtTokenUtil.getUsernameFromToken(jwtToken);
            } catch (IllegalArgumentException e) {
                System.out.println("Unable to get JWT Token");
            } catch (ExpiredJwtException e) {
                System.out.println("JWT Token has expired");
            }
        } else {
            logger.warn("JWT Token does not begin with Bearer String");
        }

        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {

            UserDetails userDetails = this.myUserDetailsService.loadUserByUsername(username);

            if (jwtTokenUtil.validateToken(jwtToken, userDetails)) {

                UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
                        userDetails, null, userDetails.getAuthorities());
                usernamePasswordAuthenticationToken
                        .setDetails(new WebAuthenticationDetailsSource().buildDetails(request));

                SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
            }
        }
        chain.doFilter(request, response);
    }
}` 
  1. 配置Spring Security
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;

    @Autowired
    private UserDetailsService jwtUserDetailsService;

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(jwtUserDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
                .authorizeRequests().antMatchers("/authenticate").permitAll().
                        anyRequest().authenticated().and().
                        exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }
}`

以上是簡(jiǎn)單的Spring Boot整合Redis、Security、JWT和Redis的示例,可以根據(jù)自己的實(shí)際需求進(jìn)行調(diào)整。

??文章末尾

Spring Boot 整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證,spring boot,redis,后端文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-744802.html

到了這里,關(guān)于Spring Boot 整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringCloud微服務(wù)整合Spring Security進(jìn)行統(tǒng)一鑒權(quán)

    SpringCloud微服務(wù)整合Spring Security進(jìn)行統(tǒng)一鑒權(quán)

    網(wǎng)關(guān)gateway 普通資源微服務(wù)member 鑒權(quán)微服務(wù)auth 為了做到更靈活的方法級(jí)別的鑒權(quán)操作,決定將權(quán)限控制下放到具體的普通微服務(wù),其實(shí)并不需要多配置很多東西。網(wǎng)關(guān)只負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求,鑒權(quán)則是由auth認(rèn)證微服務(wù)來(lái)完成的。 網(wǎng)上很多都是在網(wǎng)關(guān)層面進(jìn)行鑒權(quán),但是這么做不靈

    2024年02月04日
    瀏覽(18)
  • SpringCloud搭建微服務(wù)之Gateway+Jwt實(shí)現(xiàn)統(tǒng)一鑒權(quán)

    SpringCloud搭建微服務(wù)之Gateway+Jwt實(shí)現(xiàn)統(tǒng)一鑒權(quán)

    在微服務(wù)項(xiàng)目中,需要對(duì)整個(gè)微服務(wù)系統(tǒng)進(jìn)行權(quán)限校驗(yàn),通常有兩種方案,其一是每個(gè)微服務(wù)各自鑒權(quán),其二是在網(wǎng)關(guān)統(tǒng)一鑒權(quán),第二種方案只需要一次鑒權(quán)就行,避免了每個(gè)微服務(wù)重復(fù)鑒權(quán)的麻煩,本文以網(wǎng)關(guān)統(tǒng)一鑒權(quán)為例介紹如何搭建微服務(wù)鑒權(quán)項(xiàng)目。 本文案例中共有四

    2024年02月13日
    瀏覽(22)
  • Gateway+Springsecurity+OAuth2.0+JWT 實(shí)現(xiàn)分布式統(tǒng)一認(rèn)證授權(quán)!

    Gateway+Springsecurity+OAuth2.0+JWT 實(shí)現(xiàn)分布式統(tǒng)一認(rèn)證授權(quán)!

    目錄 1. OAuth2.0授權(quán)服務(wù) 2. 資源服務(wù) 3. Gateway網(wǎng)關(guān) 4. 測(cè)試 ? 在SpringSecurity+OAuth2.0 搭建認(rèn)證中心和資源服務(wù)中心-CSDN博客??????? 基礎(chǔ)上整合網(wǎng)關(guān)和JWT實(shí)現(xiàn)分布式統(tǒng)一認(rèn)證授權(quán)。 ? 大致流程如下: 1、客戶端發(fā)出請(qǐng)求給網(wǎng)關(guān)獲取令牌 2、網(wǎng)關(guān)收到請(qǐng)求,直接轉(zhuǎn)發(fā)給授權(quán)服務(wù)

    2024年01月24日
    瀏覽(19)
  • Spring boot 整合 JWT

    Spring boot 整合 JWT

    第一章 Java線程池技術(shù)應(yīng)用 第二章 CountDownLatch和Semaphone的應(yīng)用 第三章 Spring Cloud 簡(jiǎn)介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Spring Cloud Netflix 之 Hystrix 第九章 代碼管理gitlab 使用 第十章 Spr

    2024年02月05日
    瀏覽(19)
  • Spring Boot 整合Redis實(shí)現(xiàn)消息隊(duì)列

    ??本篇文章主要來(lái)講Spring Boot 整合Redis實(shí)現(xiàn)消息隊(duì)列,實(shí)現(xiàn)redis用作消息隊(duì)列有多種方式,比如: 基于 List 的 rpush+lpop 或 lpush+rpop 基于 List 的 rpush+blpop 或 lpush+brpop (阻塞式獲取消息) 基于 Sorted Set 的優(yōu)先級(jí)隊(duì)列 Redis Stream (Redis5.0版本開(kāi)始) Pub/Sub 機(jī)制 ??不過(guò)這里講的是

    2024年02月13日
    瀏覽(34)
  • 【Spring Boot Admin】使用(整合Spring Security服務(wù),添加鑒權(quán))

    【Spring Boot Admin】使用(整合Spring Security服務(wù),添加鑒權(quán))

    Spring Boot Admin 監(jiān)控平臺(tái) 背景:Spring Boot Admin 監(jiān)控平臺(tái)不添加鑒權(quán)就直接訪問(wèn)的話,是非常不安全的。所以在生產(chǎn)環(huán)境中使用時(shí),需要添加鑒權(quán),只有通過(guò)鑒權(quán)后才能監(jiān)控客戶端服務(wù)。本文整合Spring Security進(jìn)行實(shí)現(xiàn)。 pom依賴(lài) yml配置 啟動(dòng)類(lèi)@EnableAdminServer 安全配置類(lèi):SecuritySe

    2024年02月16日
    瀏覽(45)
  • Spring Boot整合Redis實(shí)現(xiàn)訂單超時(shí)處理

    Spring Boot整合Redis實(shí)現(xiàn)訂單超時(shí)處理

    ??歡迎來(lái)到架構(gòu)設(shè)計(jì)專(zhuān)欄~Spring Boot整合Redis實(shí)現(xiàn)訂單超時(shí)處理 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁(yè):IT·陳寒的博客 ??該系列文章專(zhuān)欄:架構(gòu)設(shè)計(jì) ??其他專(zhuān)欄:Java學(xué)習(xí)路線 Java面試技巧 Java實(shí)戰(zhàn)項(xiàng)目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí) ??文章作者技術(shù)和水平有限,如果文

    2024年02月03日
    瀏覽(29)
  • 前后端分離,使用vue3整合SpringSecurity加JWT實(shí)現(xiàn)登錄校驗(yàn)

    前后端分離,使用vue3整合SpringSecurity加JWT實(shí)現(xiàn)登錄校驗(yàn)

    前段時(shí)間寫(xiě)了一篇spring security的詳細(xì)入門(mén),但是沒(méi)有聯(lián)系實(shí)際。 所以這次在真實(shí)的項(xiàng)目中來(lái)演示一下怎樣使用springsecurity來(lái)實(shí)現(xiàn)我們最常用的登錄校驗(yàn)。本次演示使用現(xiàn)在市面上最常見(jiàn)的開(kāi)發(fā)方式,前后端分離開(kāi)發(fā)。前端使用vue3進(jìn)行構(gòu)建,用到了element-plus組件庫(kù)、axios封裝、

    2024年01月23日
    瀏覽(24)
  • 微服務(wù) Spring Boot 整合Redis 實(shí)現(xiàn)優(yōu)惠卷秒殺 一人一單

    微服務(wù) Spring Boot 整合Redis 實(shí)現(xiàn)優(yōu)惠卷秒殺 一人一單

    CSDN話題挑戰(zhàn)賽第2期 參賽話題:Java技術(shù)分享 在分布式系統(tǒng)中,經(jīng)常需要使用 全局唯一ID 查找對(duì)應(yīng)的數(shù)據(jù)。產(chǎn)生這種ID需要保證系統(tǒng)全局唯一,而且要高性能以及占用相對(duì)較少的空間。 全局唯一ID在數(shù)據(jù)庫(kù)中一般會(huì)被設(shè)成 主鍵 ,這樣為了保證數(shù)據(jù)插入時(shí)索引的快速建立,還需

    2024年02月03日
    瀏覽(25)
  • SpringSecurity(07)——JWT整合

    OncePerRequestFilter:在每次請(qǐng)求時(shí)只執(zhí)行一次過(guò)濾,保證一次請(qǐng)求只通過(guò)一次filter,而不需要重復(fù)執(zhí)行 login.html BasicAuthenticationFilter:OncePerRequestFilter執(zhí)行完后,由BasicAuthenticationFilter檢測(cè)和處理 http basic認(rèn)證 ,取出請(qǐng)求頭中的jwt,校驗(yàn)jwt 當(dāng)BasicAuthenticationFilter認(rèn)證失敗的時(shí)候會(huì)進(jìn)

    2024年01月21日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包