首页 文章 精选 留言 我的

精选列表

搜索[SpringBoot],共4255篇文章
优秀的个人博客,低调大师

MateCloud 4.3.8 正式版发布,更新至 SpringBoot 最新版本

一、发布说明 MateCloud 4.3.8对Spring Boot和Spring Cloud进行一次大版本升级,基于Spring Cloud Alibaba推出的微服务快速开发平台,集成Spring Boot 2.6.4, Spring Cloud 2021.0.1、Nacos 2.0.4、Sentinel 1.8.3、Jetcache等诸多中间件。欢迎体验。 1.1 功能升级 拆分用户按钮权限接口 spring cloud loadbalancer集成caffenine, 增加本地环境变量的配置,支持同机多环境的开发 删除掉暂时不用的加密模块 移除Velocity模板依赖 修复操作日志消费两次的bug 1.2 文档更新 去掉投票地址 1.3 依赖升级 升级至 Spring Boot 2.6.4 升级至 Spring Cloud 2021.0.1 升级至 Mybatis Plus 3.5.1 升级至 Spring Boot Admin 2.6.2 升级至 XXL-JOB 2.3.0 升级至 Postgresql 42.3.3 升级至 Nacos 2.0.4 升级至 Hutool 5.7.19 二、系统演示 2.1 演示地址:http://cloud.mate.vip 账号 密码 操作权限 admin matecloud mate-system模块不能执行增删改请求 如果需要验证手机号码登录,手机号码采用页面默认号码,点击获取验证码,输入1188,即可登录。 2.2 商业版:http://plus.mate.vip 账号 密码 操作权限 admin matecloud123 不能执行增删改请求,如需全部权限加微信 matecloud 联系 2.3 版本演进 核心中间件 2.5.8及以下 3.0.8+ Spring Boot 2.3.*.RELEASE Spring Cloud Hoxton SR* Spring Cloud Alibaba 2.2.*.RELEASE Nacos 1.4.*及以下 Sentinel 1.8.1 2.4 官方文档 2.4.1 文档地址:http://www.mate.vip/docs 2.4.2 商业版文档:http://doc.mate.vip 2.4.3 快速安装:http://www.mate.vip/archives/107 三、 前端重大更新 前端采用Vue3.2、Vite 2.5.*、Ant-Design-Vue 2.*、TypeScript的大型中后台解决方案。 四、 版本发布 4.1.8版本已经发布,实现了系统管理的基础功能,主要包括菜单管理、用户管理、角色管理、部门管理、日志管理、客户端管理等功能。欢迎体验。 五、技术架构 六、 功能特点 主体框架:采用最新的Spring Cloud 2021.0.0,Spring Boot 2.6.1,Spring Cloud Alibaba 2021.1版本进行系统设计; 统一注册:支持Nacos作为注册中心,实现多配置、分群组、分命名空间、多业务模块的注册和发现功能; 统一认证:统一Oauth2认证协议,采用jwt的方式,实现统一认证,并支持自定义grant_type实现手机号码登录,第三方登录集成JustAuth实现微信、支付宝等多种登录模式; 业务监控:利用Spring Boot Admin来监控各个独立Service的运行状态。 内部调用:集成了Feign和Dubbo两种模式支持内部调用,并且可以实现无缝切换,适合新老程序员,快速熟悉项目; 业务熔断:采用Sentinel实现业务熔断处理,避免服务之间出现雪崩; 身份注入:通过注解的方式,实现用户登录信息的快速注入; 在线文档:通过接入Knife4j,实现在线API文档的查看与调试; 代码生成:基于Mybatis-plus-generator自动生成代码,提升开发效率,生成模式不断优化中,暂不支持前端代码生成; 消息中心:集成消息中间件RocketMQ和Kafka,对业务进行异步处理; 业务分离:采用前后端分离的框架设计,前端采用vue-element-admin,商业版采用antd-pro-vue 链路追踪:自定义traceId的方式,实现简单的链路追踪功能 多租户功能:集成Mybatis Plus,实现SAAS多租户功能 七、 项目源码 项目 GITHUB 码云 MateCloud后端源码 https://github.com/matevip/matecloud https://gitee.com/matevip/matecloud Artemis前端源码 https://github.com/matevip/artemis https://gitee.com/matevip/artemis MateBoot后端源码 https://github.com/matevip/mateboot https://gitee.com/matevip/mateboot 7.1 微服务项目示例 https://gitee.com/matevip/mate-demo 八、部分截图 八、下一步更新计划 对uaa认证模块进行重构。敬请期待。

优秀的个人博客,低调大师

SpringBoot技术专题】「JWT技术专区」SpringSecurity整合JWT授权和认证实现

JWT基本概念 JWT,即 JSON Web Tokens(RFC 7519),是一个广泛用于验证 REST APIs 的标准。虽说是一个新兴技术,但它却得以迅速流行。 JWT的验证过程是: 前端(客户端)首先发送一些凭证来登录(我们编写的是 web 应用,所以这里使用用户名和密码来做验证)。 后端(服务端)这里指Spring应用校验这些凭证,如果校验通过则生成并返回一个 JWT。 客户端需要在请求头的Authorization字段中以 “Bearer TOKEN” 的形式携带获取到的token,服务端会检查这个token是否可用并决定授权访问或拒绝请求。 token中可能保存了用户的角色信息,服务端可以根据用户角色来确定访问权限。 实现 我们来看一下在实际的 Spring 项目中是如何实现JWT登录和保存机制的。 依赖 下面是我们示例代码的 Maven 依赖列表,注意,截图中并未包含Spring Boot、Hibernate等核心依赖(你需要自行添加)。 用户模型 创建一个包含保存用户信息、基于用户名和密码验证用户权限功能的 controller。 创建一个名为 User 的实体类,它是数据库中 USER 表的映射。需要的话,可以在其中添加其他属性。 还需要定义一个 UserRepository 类来保存用户信息,重写其 findByUsername 方法,在验证过程中会用到。 public interface UserRepository extends JpaRepository<User, String>{ User findByUsername(String username); } 千万不能在数据库中保存明文密码,因为很多用户喜欢在各种网站上使用相同的密码。 哈希算法有很多,BCrypt是最常用的之一,它也是推荐用于安全加密的算法。关于这个话题的更多内容,可以查看 这篇文章。 为了加密密码,我们在 @bean 注解标记的主类中定义一个 BCrypt Bean,如下所示: @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } 加密密码的时候将会调用这个Bean里面的方法。 创建一个名为 UserController 的类,为其添加 @RestController 注解并定义路由映射。 在这个应用中,我们接收前端传入的 UserDto 对象来保存用户信息。你也可以选择在 @RequestBody 参数中接收 User 对象。 @RestController @RequestMapping("/api/services/controller/user") @AllArgsConstructor public class UserController { private UserService userService; @PostMapping() public ResponseEntity<String> saveUser(@RequestBody UserDto userDto) { return new ResponseEntity<>(userService.saveDto(userDto), HttpStatus.OK); } } 我们使用之前定义的 BCrypt Bean 来加密传入的 UserDto 对象的 password 字段。这个操作也可以在 controller 之中执行,但是把逻辑操作集中到 service 类中是更好的做法。 @Transactional(rollbackFor = Exception.class) public String saveDto(UserDto userDto) { userDto.setPassword(bCryptPasswordEncoder.encode(userDto.getPassword())); return save(new User(userDto)).getId(); } 验证过滤器 需要通过权限验证来确定用户的真实身份。这里我们使用经典的【用户名-密码对】的形式来完成。 验证步骤: 创建继承 UsernamePasswordAuthenticationFilter 的验证过滤器 创建继承 WebSecurityConfigurerAdapter 的安全配置类并应用过滤器 验证过滤器的代码如下——也许你已经知道了,过滤器是 Spring Security 的核心。 public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private AuthenticationManager authenticationManager; public JWTAuthenticationFilter(AuthenticationManager authenticationManager) { this.authenticationManager = authenticationManager; setFilterProcessesUrl("/api/services/controller/user/login"); } @Override public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res) throws AuthenticationException { try { User creds = new ObjectMapper().readValue(req.getInputStream(), User.class); return authenticationManager.authenticate( new UsernamePasswordAuthenticationToken( creds.getUsername(), creds.getPassword(), new ArrayList<>()) ); } catch (IOException e) { throw new RuntimeException(e); } } @Override protected void successfulAuthentication(HttpServletRequest req, HttpServletResponse res, FilterChain chain, Authentication auth) throws IOException { String token = JWT.create() .withSubject(((User) auth.getPrincipal()).getUsername()) .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .sign(Algorithm.HMAC512(SECRET.getBytes())); String body = ((User) auth.getPrincipal()).getUsername() + " " + token; res.getWriter().write(body); res.getWriter().flush(); } } Spring Security 默认使用继承了 UsernamePasswordAuthenticationFilter 的子类进行密码验证 ,我们可以在其中编写自定义的验证逻辑。 我们在构造函数中调用setFilterProcessesUrl 方法,设置默认登录地址。 如果删除这行代码,Spring Security 会生成一个默认的 “/login” 端点,我们可以不用在 controller 中显式地定义登录端点。 这行代码执行之后,我们的登录端点将被设置为 /api/services/controller/user/login,你可以根据自己的实际代码来设置。 我们重写了 UsernameAuthenticationFilter 类的 attemptAuthentication 和 successfulAuthentication 方法。 用户登录时会执行 attemptAuthentication方法,它会读取凭证信息、创建用户 POJO、校验凭证并授权。 我们传入用户名、密码以及一个空列表。我们还没有定义用户角色,所以把这个表示用户权限(角色)的列表留空就行。 如果验证成功,就会执行 successfulAuthentication 方法,它的参数由Spring Security自动注入。 attemptAuthentication返回Authentication对象,这个对象包含了我们传入的权限信息。 我们想在验证成功之后返回一个使用用户名、密钥和过期时间创建的 token。先定义SECRET和 EXPIRATION_DATE。 public class SecurityConstants { public static final String SECRET = "SECRET_KEY"; public static final long EXPIRATION_TIME = 900_000; // 15 mins public static final String TOKEN_PREFIX = "Bearer "; public static final String HEADER_STRING = "Authorization"; public static final String SIGN_UP_URL = "/api/services/controller/user"; } 创建一个类作为常量的容器,SECRET 的值可以任意设置,最佳的做法是在 hash 算法支持的范围内使用尽可能长的字符串。例如我们使用的是 HS256 算法,SECRET 字符串的最佳长度即为 256 bits/32 个字符。 超时时间设置为 15 分钟,这是防御暴力破解密码的最佳实践。此处使用的时间单位为毫秒。 验证过滤器准备好了,但还不可用,我们还要创建一个授权过滤器,再通过一个配置类来应用它们。 授权过滤器会校验 Authorization 请求头中的 token 是否存在及其可用性。在配置类中指明哪些端点需要使用这个过滤器。 授权过滤器 doFilterInternal 方法拦截请求并校验 Authorization 请求头,如果不存在或者它的值不是以 “BEARER” 开头,则直接转到下一个过滤器。 如果这个请求头携带了合法的值,会调用 getAuthentication 方法,校验这个 JWT,如果这个 token 是可用的,它会返回一个Spring内部使用的 token。 这个新生成的 token 会被保存在 SecurityContext 中,如果需要基于用户角色进行授权的话,可以向这个 token 传入用户权限。 过滤器都准备好了,现在要通过配置类把它们投入使用。 public class JWTAuthorizationFilter extends BasicAuthenticationFilter { public JWTAuthorizationFilter(AuthenticationManager authManager) { super(authManager); } @Override protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException { String header = req.getHeader(HEADER_STRING); if (header == null || !header.startsWith(TOKEN_PREFIX)) { chain.doFilter(req, res); return; } UsernamePasswordAuthenticationToken authentication = getAuthentication(req); SecurityContextHolder.getContext().setAuthentication(authentication); chain.doFilter(req, res); } // Reads the JWT from the Authorization header, and then uses JWT to validate the token private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) { String token = request.getHeader(HEADER_STRING); if (token != null) { // parse the token. String user = JWT.require(Algorithm.HMAC512(SECRET.getBytes())) .build() .verify(token.replace(TOKEN_PREFIX, "")) .getSubject(); if (user != null) { // new arraylist means authorities return new UsernamePasswordAuthenticationToken(user, null, new ArrayList<>()); } return null; } return null; } 配置处理 给这个类添加 @EnableWebSecurity 注解,同时让它继承 WebSecurityConfigureAdapter 并实现自定义的安全逻辑。 自动注入之前定义的 BCrypt Bean,同时自动注入 UserDetailsService 用来获取用户账户信息。 最重要的是那个接收一个 HttpSecurity 对象作为参数的方法,其中声明了如何在各个端点中应用过滤器、配置了 CORS、放行了所有对注册接口的 POST 请求。 可以添加其他匹配器来基于 URL 模式和角色进行过滤,你也可以 查看 StackOverflow 上这个问题的相关示例。另一个方法配置了 AuthenticationManager 在登录校验时使用我们指定的编码器。 @EnableWebSecurity public class WebSecurity extends WebSecurityConfigurerAdapter { private UserDetailsServiceImpl userDetailsService; private BCryptPasswordEncoder bCryptPasswordEncoder; public WebSecurity(UserDetailsServiceImpl userService, BCryptPasswordEncoder bCryptPasswordEncoder) { this.userDetailsService = userService; this.bCryptPasswordEncoder = bCryptPasswordEncoder; } @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and().authorizeRequests() .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll() .anyRequest().authenticated() .and() .addFilter(new JWTAuthenticationFilter(authenticationManager())) .addFilter(new JWTAuthorizationFilter(authenticationManager())) // this disables session creation on Spring Security .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); } @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder); } @Bean CorsConfigurationSource corsConfigurationSource() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration().applyPermitDefaultValues(); source.registerCorsConfiguration("/**", corsConfiguration); return source; } } 测试实现 发送一些请求来测试应用是否正常工作。 使用 GET 请求访问受保护的资源,服务端返回了 403 状态码。 这是程序设计预期的行为,因为我们没有在请求头中携带 token 信息。 现在创建一个用户: 发送一个携带了用户信息数据的 POST 请求,以创建用户。稍后将登陆这个账户来获取 token。 获取到 token 了,现在可以用这个 token 来访问受保护的资源。 在 Authorization 请求头中携带 token,就可以访问受保护的端点了。 总结 Spring 中实现 JWT 授权和密码认证的步骤,同时学习了如何安全地保存用户信息。 参考内容 How to Set Up Java Spring Boot JWT Authorization and

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册