9、SpringSecurity+JWT+RSA分布式版实战

基于SpringBoot+SpringSecurity+JWT+RSA加密算法签名 Auth权限认证搭建教程 基于SpringBoot+SpringSecurity+JWT+RSA加密算法签名 Auth权限认证 搭建教程 一名本科在读软件工程大三学生 —— Liujian 微笑面对生活,生活也会微笑面对你。 目录(文章过长 使用 Ctrl+F 搜索): 1、导入jar包(maven构件项目导入其坐标) 2、创建数据库、数据表及数据库连接URL(JDBC - MySQL) 3、创建实体类User、JwtUser及Dao层 4、实现UserDetailsService接口 5、编写RSA工具类 6、Token工具 阅读详情

Spring Security+JWT+RSA分布式版实战

注意下面所有代码类中代码,导包缺失序列化工具类、用户缓存工具类、JWT、RSA、统一异常、统一响应格式等工具类,请到博主其他文章中获取。

1、导包

    implementation "org.springframework.boot:spring-boot-starter-security:2.6.5"
    implementation "io.jsonwebtoken:jjwt-api:0.10.7"
    implementation "io.jsonwebtoken:jjwt-impl:0.10.7"
    implementation "io.jsonwebtoken:jjwt-jackson:0.10.7"
    implementation "joda-time:joda-time:2.10.1"

注意:博主使用的不是Maven,是Gradle。

2、配置类

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;

/**
 * @author :
 * @date :Created in 14:38 2022/9/7
 * @description :
 * @version: 1.0
 */
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final RsaKeyProperties prop;
    private final SecurityUserDetailsService securityUserDetailsService;
    private final BCryptPasswordEncoder passwordEncoder;
    private final LogoutSuccessHandler logoutSuccessHandler;
    private final VerifyAuthenticationEntryPoint verifyAuthenticationEntryPoint;
    private final IUserCacheService iUserCacheService;
    private final LoginUserAccessDeniedHandler accessDeniedHandler;
    private final LoginFailureHandler loginFailureHandler;

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers(permitUrls);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        JwtLoginFilter jwtLoginFilter = new JwtLoginFilter(super.authenticationManager());
        jwtLoginFilter.setAuthenticationFailureHandler(loginFailureHandler);
        http.cors().and().csrf().disable();
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and().addFilter(jwtLoginFilter)
                .addFilter(new JwtVerifyFilter(super.authenticationManager(), prop, iUserCacheService, verifyAuthenticationEntryPoint))
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and().exceptionHandling()
                .authenticationEntryPoint(verifyAuthenticationEntryPoint)
                .accessDeniedHandler(accessDeniedHandler)
                .and().formLogin().permitAll()
                .and().logout().permitAll()
                .logoutSuccessHandler(logoutSuccessHandler)
        ;

    }

    /**
     * 认证授权控制器 (管理者 提供者 认证者 授权者)
     * @param auth
     * @return void
     * @Author 
     * @Date Created in 10:31 2022/9/6
     * @Description
     **/
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(securityUserDetailsService).passwordEncoder(passwordEncoder);
    }

    /**
     * 放过Url
     * @Author 
     * @Date Created in 11:34 2022/9/11
     * @Description
     * @param
     * @return
     **/
    String[] permitUrls = new String[]{
            "/" + VERSION_NO + "/test/**"
    };
}

3、UserDetailsService和SecurityUser

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

/**
 *
 * @Author 
 * @Date Created in 16:57 2022/9/31
 * @Description
 * @param
 * @return
 **/
@Component
@Slf4j
@RequiredArgsConstructor
public class SecurityUserDetailsService implements UserDetailsService {

   private final IUserService userService;
   private final IUserCacheService iUserCacheService;
   private final RsaKeyProperties prop;

   @Override
   public UserDetails loadUserByUsername(String username) {
      User user = userService.findByUsername(username);
      checkUserInfo(user);
      return new SecurityUser(user, getJti(user));
   }

   private void checkUserInfo(User user) {
      if(ObjectUtils.isEmpty(user)){
         log.info("登录失败,查询不到用户信息");
         throw new UsernameNotFoundException("账户不存在");
      }
      if(ObjectUtils.isEmpty(user.getRoles())){
         log.info("登录失败,未绑定角色,不允许登录!");
         throw new BadCredentialsException("用户未绑定角色,不允许登录,请联系管理员!");
      }
   }

   private String getJti(User user) {
      JwtClaim jwtClaim = JwtClaim.toJwtClaim(user);
      String jwt = JwtUtils.generateTokenExpireInMinutes(jwtClaim, prop.getPrivateKey(), 24 * 60 * 7);
      String jti = JwtUtils.getInfoFromToken(jwt, prop.getPublicKey(), JwtClaim.class).getId();
      iUserCacheService.cacheJwtAndUser(jti, jwt, user);
      return jti;
   }
}



/**
 * @author :
 * @date :Created in 9:46 2022/6/29
 * @description :
 * @version: 1.0
 */
public class SecurityUser implements UserDetails, Serializable {

    private User user;

    private String jti;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Collection<GrantedAuthority> authList = new ArrayList<>();
        for(Role role:this.user.getRoles()){
            //1.1角色关键词
            authList.add(new SimpleGrantedAuthority(role.getKeyword()));
            for (Permission permission:role.getPermissions()){
                //1.2权限关键词
                authList.add(new SimpleGrantedAuthority(permission.getKeyword()));
            }
        }
        return authList;
    }

    @Override
    public String getPassword() {
        return this.user.getPassword();
    }

    @Override
    public String getUsername() {
        return ObjectUtils.isEmpty(this.user) ? "" :this.user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return UserStatusEnum.EFFECTIVE.getCode().equals(this.user.getState());
    }

    public SecurityUser(User user, String jti) {
        this.user = user;
        this.jti = jti;
    }

    public SecurityUser() {
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getJti() {
        return jti;
    }

    public void setJti(String jti) {
        this.jti = jti;
    }
}

4、登录处理

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHeaders;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;

/**
 * @author :
 * @date :Created in 16:25 2022/9/11
 * @description :
 * @version: 1.0
 */
@Slf4j
public class JwtLoginFilter extends UsernamePasswordAuthenticationFilter {

    private AuthenticationManager authenticationManager;

    public JwtLoginFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }


    @SneakyThrows
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response){
        log.info("[login]接收到请求");
        User user = new ObjectMapper().readValue(request.getInputStream(), User.class);
        log.info("[login]username:{}", user.getUsername());
        UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword());
        return authenticationManager.authenticate(authRequest);
    }

    @Override
    public void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException {
        log.info("[login]认证成功");
        response.addHeader(HttpHeaders.AUTHORIZATION, JwtUtils.BEARER_PREFIX + ((SecurityUser)authResult.getPrincipal()).getJti());
        response.setContentType(APPLICATION_JSON_VALUE);
        response.setStatus(HttpServletResponse.SC_OK);
        log.info("[login]返回token");
        ServletUtils.render(request, response, Result.success(null));
    }

}

5、校验处理

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHeaders;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 检验(认证授权)
 * @Author 
 * @Date Created in 15:33 2022/9/29
 * @Description
 * @param
 * @return
 **/
public class JwtVerifyFilter extends BasicAuthenticationFilter {

    private RsaKeyProperties prop;
    private IUserCacheService iUserCacheService;
    private VerifyAuthenticationEntryPoint verifyAuthenticationEntryPoint;

    public JwtVerifyFilter(AuthenticationManager authenticationManager, RsaKeyProperties prop, IUserCacheService iUserCacheService, VerifyAuthenticationEntryPoint verifyAuthenticationEntryPoint) {
        super(authenticationManager);
        this.prop = prop;
        this.iUserCacheService = iUserCacheService;
        this.verifyAuthenticationEntryPoint = verifyAuthenticationEntryPoint;
    }

    @Override
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            String jtiInfo = request.getHeader(HttpHeaders.AUTHORIZATION);
            checkJti(jtiInfo);
            String jti = jtiInfo.replace(BEARER_PREFIX, "");
            String jwt = iUserCacheService.getJwtByJti(jti);
            checkJwt(jwt);
            Payload<JwtClaim> payload = JwtUtils.getInfoFromToken(jwt, prop.getPublicKey(), JwtClaim.class);
            UsernamePasswordAuthenticationToken authResult = new UsernamePasswordAuthenticationToken("", null, null);;
            if (!payload.getUserInfo().getClientType().equals(ClientTypeEnum.TO_C.getId())) {
                SecurityUser securityUser = new SecurityUser(iUserCacheService.getUserAndRenewalByUserNameAndJti(payload.getUserInfo().getUsername(), jti), jti);
                authResult = new UsernamePasswordAuthenticationToken(securityUser, securityUser.getPassword(), securityUser.getAuthorities());
            }
            SecurityContextHolder.getContext().setAuthentication(authResult);
            chain.doFilter(request, response);
        }catch (AuthenticationException ex){
            verifyAuthenticationEntryPoint.commence(request, response, ex);
        }
    }

    private void checkJwt(String jwt) {
        if (StringUtils.isBlank(jwt)) {
            throw new InsufficientAuthenticationException(VerifyAuthenticationEntryPoint.VerifyConstants + ExceptionCodeEnum.EXPIRED_TOKEN.getDesc());
        }
    }

    private void checkJti(String jtiInfo) {
        if (StringUtils.isBlank(jtiInfo) || !jtiInfo.startsWith(BEARER_PREFIX)) {
            throw new InsufficientAuthenticationException(VerifyAuthenticationEntryPoint.VerifyConstants + ERROR_TOKEN.getDesc());
        }
    }
}

6、登录失败处理

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.security.authentication.AccountStatusException;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author :
 * @date :Created in 15:20 2022/9/10
 * @description :
 * @version: 1.0
 */
@Slf4j
@Component
public class LoginFailureHandler implements AuthenticationFailureHandler {

    private final String UserConstants = "用户";

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException {
        String message;
        if(e.getMessage().contains(UserConstants)){
            ServletUtils.render(request, response, Result.of(ExceptionCodeEnum.PARAM_ERROR, e.getMessage()));
            return;
        }
        if (e instanceof BadCredentialsException) {
            message = "用户名不存在或密码错误!";
        } else if (e instanceof AccountStatusException) {
            message = "用户状态不可用!";
        } else {
            message = "登录失败!";
            log.error("[登录失败]message:{}", ExceptionUtils.getStackTrace(e));
        }
        log.info("[登录失败] - {}", message);
        ServletUtils.render(request, response, Result.of(ExceptionCodeEnum.PARAM_ERROR, message));
    }
}

7、权限不足处理

mport lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author :
 * @date :Created in 16:30 2022/9/8
 * @description :
 * @version: 1.0
 */
@Slf4j
@Component
public class LoginUserAccessDeniedHandler implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        log.warn("用户权限不足,访问[{}]失败", request.getRequestURI());
        ServletUtils.render(request, response, Result.of(ExceptionCodeEnum.FORBIDDEN_OPERATION, "权限不足!"));
    }
}

8、校验失败处理

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author :
 * @date :Created in 16:37 2022/9/8
 * @description :
 * @version: 1.0
 */
@Component
@Slf4j
public class VerifyAuthenticationEntryPoint implements AuthenticationEntryPoint {

    public static final String VerifyConstants = "验证异常:";

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException {
        log.warn("用户认证,访问[{}]失败,AuthenticationException={}", request.getRequestURI(), e);
        String message;
        if (e instanceof InsufficientAuthenticationException) {
            message = "请重新登录!";
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        } else {
            message = "验证失败!";
            log.error("[验证失败]message:{}", ExceptionUtils.getStackTrace(e));
        }
        log.info("[验证失败] - {}", message);
        ServletUtils.render(request, response, Result.of(ExceptionCodeEnum.PARAM_ERROR, message));
    }
}

9、退出登录

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHeaders;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author :
 * @date :Created in 16:28 2022/9/8
 * @description :
 * @version: 1.0
 */
@Component
@Slf4j
@AllArgsConstructor
public class LogoutSuccessHandler implements org.springframework.security.web.authentication.logout.LogoutSuccessHandler {

    private IUserCacheService iUserCacheService;

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        log.info("[logout]用户退出登录");
        String header = request.getHeader(HttpHeaders.AUTHORIZATION);
        if (header == null || !header.startsWith(BEARER_PREFIX)) {
            log.info("[logout]用户退出登录成功");
        } else {
            String jti = header.replace(BEARER_PREFIX, "");
            iUserCacheService.deleteJwtAndUser(jti, null);
        }
        log.info("[logout]用户退出登录成功");
        ServletUtils.render(request, response, Result.success(null));
    }
}

10、前后端分离工具类

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author :
 * @date :Created in 16:30 2022/9/11
 * @description :
 * @version: 1.0
 */
public class ServletUtils {

    /**
     * 渲染到客户端
     *
     * @param object   待渲染的实体类,会自动转为json
     */
    public static void render(HttpServletRequest request, HttpServletResponse response, Object object) throws IOException {
        // 允许跨域
        response.setHeader("Access-Control-Allow-Origin", "*");
        // 允许自定义请求头token(允许head跨域)
        response.setHeader("Access-Control-Allow-Headers", "token, Accept, Origin, X-Requested-With, Content-Type, Last-Modified");
        response.setHeader("Content-type", "application/json;charset=UTF-8");
        response.getWriter().print(JSONObject.toJSONString(object));
    }


    /**
     * 获取request
     */
    public static HttpServletRequest getRequest() {
        return getRequestAttributes().getRequest();
    }

    /**
     * 获取response
     */
    public static HttpServletResponse getResponse() {
        return getRequestAttributes().getResponse();
    }

    public static ServletRequestAttributes getRequestAttributes() {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) attributes;
    }
}
Spring Cloud Security实现单点登录(JWT+RSA) JWT,全称是Json Web Token, 是JSON风格轻量级的授权和身份认证规范, 可实现无状态、分布式的Web应用授权;官网:https://jwt.io JWT包含三部分数据: –Header:头部,通常头部有两部分信息: 声明类型,这里是JWT 加密算法,自定义 我们会对头部进行base64加密(可解密),得到第一部分数据 –Payload:载荷,就是有效数据,一般包含下面信息: ... 阅读详情

相关推荐

SpringSecurity-3

文章目录SpringSecurity整合SpringBoot集中式版1.技术选型2.初步整合认证第一版1.创建工程并导入jar包2.提供处理器3.编写启动类4.测试效果5.加入SpringSecurity的jar包6.重启再次测试3.整合认证第二版【加入jsp使用自定义认证页面】1.说明2.导入SpringBoot的tomcat启动插件jar包3.加入jsp页面等静态资源4.提供SpringSecurity配置类5.修改产品处理器6.配置视图解析器7.使用tomcat插件启动项目8.测试效果4.整合认证第三

ginger_mr的博客 1718

spring security+jwt实现认证和授权

下来就是说认证了,认证的逻辑其实也很简单,这里我是结合JWT去做的认证校验。大致流程就是,登录的时候,验证完用户之后,会根据用户生成一个带有用户信息的token返回给客户端,客户端再下次请求时则带着token访问,过滤器会获取token来进行验证,如果验证通过,则对该用户进行资源授权,如果验证不通过,则返回认证失败,大致流程就是这样。在上述返回用户以及用户的权限之后,返回的资源我们会在redis或者其他手段保存下来,在下次请求进来时,完成认证之后,会获取相关用户的权限进行授权。首先,引入相关的依赖。

weixin_41377877的博客 650

基于SpringSecurity 的登录详解(前后端分离)

前后端分离登录:JWT单点登录

qq_45784240的博客 5055

使用Spring Security 资源服务器来保护Spring Cloud 微服务

我在上一篇对资源服务器进行了简单的阐述资源服务器改造以Spring Security实战干货所需依赖在Spring Security的基础上,我们需要加入新的依赖来支持OAuth2 Res...

码农小胖哥 1142

Spring Boot+Spring Security+JWT 实现token验证

Spring Boot+Spring Security+JWT 实现token验证什么是JWT?JWT的工作流程JWT的主要应用场景JWT的结构SpringBoot+Spring Security和JWT的集成实现token验证引入JWT依赖JWT的生成和解析工具类Spring Security配置登录生成tokentoken的校验演示总结 通常情况下,把API直接暴露出去是风险很大的,不说别的,直接被机器攻击就喝一壶的。那么一般来说,对API要划分出一定的权限级别,然后做一个用户的鉴权,依据鉴权结果给予用

xue317378914的专栏 1万+

Sciter教程_00_创建HelloWorld工程

本教程记录Sciter工程的创建和编译运行的过程。

qq_36707072的博客 2278

分布式系统认证解决方案SpringSecurityOAuth2.0(三)资源服务器使用Redis令牌、JWT令牌认证及RSA非对称加密算法

目录一、简介二、JWT三、代码实现——JWT格式令牌3.1 POM依赖3.2 修改授权服务器修改TokenStore修改令牌管理服务tokenServices()3.3 修改资源服务器TokenStore四、测试——JWT令牌申请校验4.1 原来申请的普通令牌4.2 申请的JWT令牌4.3 请求资源服务器认证五、代码实现——数据库存储客户端详情、授权码5.1 建表SQL5.2 数据库存储客户端详情5.3 数据库存储授权码六、测试——数据库存储客户端详情、授权码6.1 申请令牌6.2 校验令牌申请授权码 一、

DreamsArchitects的博客 2092

VMware vSphere运维管理手册

ESXi 7.0 引入了一种系统存储布局,可对大型模块和第三方组件进行灵活的分区管理和支持,同时简化了调试操作。ESXi 7.0 系统存储更改在 ESXi 7.0 之前,分区大小固定不变,除 /scratch 分区和可选 VMFS 数据存储之外,且分区号是静态的,这些限制了分区管理。在 ESXi 7.0 中,分区整合为更少且更大的可扩展分区,具体取决于所使用的引导介质及其容量。ESXi 7.0 系统存储布局包含四个分区:分区适用情况类型系统引导存储引导加载程序和 EFI 模块。FAT16。

Avenjan优快云博客 3626

SpringSecurity 整合 JWT

项目集成Spring Security(一) 在上一篇基础上继续集成 JWT ,实现用户身份验证。 前言 前后端分离项目中,如果直接把 API 接口对外开放,我们知道这样风险是很大的,所以在上一篇中我们引入了 Spring Security ,但是我们在登陆后缺少了请求凭证部分。 什么是JWT? JWT是 Json Web Token 的缩写。它是基于 RFC 7519 标准定义的一种可以安全...

niceyoo的博客 1万+

SIwave仿真手册——软件基础(一)

最近在学习SIWAVE,在这里将自己的笔记整理一下,做一个专题。希望对大家有帮助,这个会持续更新的。仅限于软件操作学习,不涉及信号完整性的讨论。

luohuo9844的博客 4万+

Python爬虫实战:使用最新技术爬取路透社新闻数据

网络爬虫(Web Crawler)是一种自动获取网页内容的程序,是搜索引擎的重要组成部分。随着大数据和人工智能技术的发展,爬虫技术在数据采集、市场分析、舆情监控等领域发挥着越来越重要的作用。requests:同步HTTP请求库aiohttp:异步HTTP请求库:HTML解析库lxml:高效的HTML/XML解析库selenium:浏览器自动化工具playwright:现代浏览器自动化工具pandas:数据处理和分析库scrapy:专业的爬虫框架:生成随机User-Agentredis:缓存和分布式爬虫支持。

2201_76125261的博客 1204

SpringBoot SpringSecurity JWT+Redis+RSA授权登录登出 验证码 前后端分离 分布式

对于微服务来说,私钥放在认证服务上,其他服务只需要存公钥即可。因为其他服务只做校验,不加密JWT。私钥加密,公钥解密。公钥和私钥放到服务器上,私钥用于授权服务器授权token时加密,其他服务器仅需要通过公钥便可对加密内容进行解析了。服务器通过用户输入的验证码结果和redis中的缓存进行比较得出是否验证码正确。只要安装了JDK,就有这个工具。携带错误的token测试:可以看到错误的token会被服务器警告。退出登录后,redis中缓存的用户信息将被删除。这里我们便实现了登录逻辑。复制文本,重命名文件。

qq_50909707的博客 5102

RT-DETR改进策略【损失函数篇】| 2024 引进Focaler-IoU损失函数 加强边界框回归 (Focaler-DIoU、Focaler-GIoU、Focaler-CIoU等)

本文记录的是改进RT-DETR的损失函数,将其替换成。现有研究通过利用边界框之间的几何关系来提高回归性能,但忽略了困难样本和简单样本分布对边界框回归的影响。不同检测任务中困难样本和简单样本的分布不同,对于简单样本占主导的检测任务,关注简单样本的边界框回归有助于提高检测性能;对于困难样本比例较高的检测任务,需要关注困难样本的边界框回归。,提高检测器在不同检测任务中的性能。实现的。

Limiiiing的博客 1925

B093-springsecurity整合jwt和RSA

springsecurity整合jwt和RSA

窗外有风景,笔下有前途,低头是题海,抬头是未来 458

Windows远程桌面开发之九-虚拟显示器(Windows 10 Indirect Display 虚拟显示器驱动开发)

by fanxiushu 2019-06-24 转载或引用请注明原始作者。 这里与远程桌面关系不是太大,但这个部分是xdisp_virt远程控制程序的实现多显示器桌面扩展的子功能,因此也归为远程桌面开发一类。 这篇文章与之前发布的...

fanxiushu的专栏 2万+

【系统分析师】2026年-上半年真题:综合知识-答案及详解(75题完整回忆版)

系统分析师考试备考指南(2026上半年机考) 考试安排: 2026年5月23日举行,分三科连考: 综合知识+案例分析(08:30-12:30,240分钟) 论文(14:30-16:30,120分钟) 科目详情: 综合知识:75道单选(含5道英文题),满分75分,45分及格。 案例分析:5选3主观题,满分75分,45分及格。 论文:4选1论述题,满分75分,45分及格。 重点题型解析: 软件工程:结构化分析以数据字典为核心(题1)。 概率统计:独立事件概率计算(题2,三人解题概率≈0.9)。 数据库安全:DB

数据知道的博客 1894

SpringBoot整合SpringSecurity+JWT实现单点登录

SpringBoot整合SpringSecurity+JWT实现单点的登录 一、JSON Web Token(JWT) 官方解释:JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私...

摸鱼佬的博客 4795

下载MNIST数据集并使用python将数据转换成NumPy数组(源码解析)

下载MNIST数据集并使用python将数据转换成NumPy数组首先来分析init_mnist函数接下来继续分析load_mnist函数实现数据集转换的python脚本的代码显示MNIST图像并确认数据 下载MNIST数据集并将数据转换成NumPy数组的Python脚本里面最重要的就是load_mnist函数,其他项目想要调用数据集的话,就可以调用load_mnist函数,得到一个字典类型的数据,字典的值是一个Numpy数组。 这些过程是如何实现的,现在开始逐字逐句分析源码: 在load_mnist函数中第

及时总结 4269

springSecurity中jwt机制及应用详解

前言: 在Spring的众多组件中,个人认为Springsecurity组件绝对是比较有难度的一款。对于springSecurity涵盖的内容比较多,在接下来的内容中会分几篇内容进行梳理讲解。先从JWT这里开始。需要明确的一点就是:JWT并不是springsecurity的一部分,其是单独的一个标准,只不过,在spring security组件中使用了它。如果是在开发过程中,你不想使用Springsecurity来完成jwt这种操作,是可以单独使用相关的jar包来实现。springsecurity组件是将

Javaesandyou的博客 6311

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SpringSecurity权限管理系统实战—六、SpringSecurity整合JWT

最近是真的懒。。。

CoderMy的博客 5939

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

基于SpringBoot+SpringSecurity+JWT+RSA非对称加密算法签名实现登录和权限认证

一名本科在读软件工程大三学生 —— Liujian 微笑面对生活,生活也会微笑面对你。 目录(文章过长 使用 Ctrl+F 搜索): 1、导入jar包(maven构件项目导入其坐标) 2、创建数据库、数据表及数据库连接URL(JDBC - MySQL) 3、创建实体类User、JwtUser及Dao层 4、实现UserDetailsService接口 5、编写RSA工具类 6、Token工具类 7、验证用户登录信息的拦截器 8、Token颁发服务类 9、SpringSecurity配置 10、测试认证.

Liujian的博客 2721

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

A093_SpringSecurity整合jwt和RSA.md

springsecurity整合jwt和RSA实现前后端分离权限校验 1. 传统前后分离权限问题 1.1 security过滤器执行流程图分析 结合上面两张图,可以得出security中核心的filter的执行顺序如下: SecurityContextPersistenceFilter >> UsernamePasswordAuthenticationFilter >> BasicAuthenticationFilter >> RemeberMeAuthentic

窗外有风景,笔下有前途,低头是题海,抬头是未来 683

SpringBoot + SpringSecurity + JWT认证

JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准( RFC 7519 ),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。至此,spring-security 整合 jwt 认证 就已经完成了。负载中包含了所有用户所需要的信息,避免了多次查询数据库。application.properties 配置。简洁(Compact)

Eden 的博客 224

Spring Boot+Spring Security+JWT实现单点登录

目录第一章 常用术语1.1、SSO1.2、JWT1.3、RSA第二章 认证思路2.1、分析集中式认证流程2.2、分析集中式认证流程第三章 工程介绍3.1、介绍父工程3.2、导入数据库第四章 通用模块4.1、导入依赖4.2、统一格式4.2.1、统一载荷对象4.2.2、统一返回结果4.3、常用工具4.3.1、Json工具类4.3.2、Jwt工具类4.3.3、Rsa工具类4.4、生成密钥第五章 认证服务5.1、导入依赖5.2、编写配置文件5.3、编写属性类5.4、编写工具类5.5、编写实体类5.6、编写映射接口5

轻松的小希 8743
上一篇: 8、权限模型RABC建表SQL
下一篇: 自定义注解之单机版限流
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白de成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值