跟着JHipster学做项目 (6) 安全访问控制(上)JWT的Spring Boot应用

JHipster:Java和JavaScript的全栈框架 现在,当打开导航栏中的Entities菜单项时,你将看到所有刚导入的实体,以及一个可完全控制的控制台来管理它们。例如,您可以创建一个新的“Country”实体,然后创建一个新的“Location”实体,并在Location实体中引用新创建的Country实体。幸运的是,这些基本上是最新的代码,并且遵循了编程最佳实践。选择是,则继续构建。获得文件后,通过命令行转到项目根目录下,在命令行键入jhipsterjdlmyjdlfile.jdl,其中是my-jdl-file.jdl是刚刚导出的文件的名称。... 阅读详情

通过配置可以生成JHipster运用JWT进行访问控制的一套代码,主要是通过JWTFilter过滤器,并把它置于UsernamePasswordAuthenticationFilter前端对用户进行Authentication(认证)和Authorization(授权)控制,此外对于认证或者授权失败是采用前文提到的异常处理。

这里需要引入的依赖如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
<dependency>
    <groupId>org.zalando</groupId>
    <artifactId>problem-spring-web</artifactId>
    <version>${problem-spring-web.version}</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>${io.jsonwebtoken.version}</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>${io.jsonwebtoken.version}</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>${io.jsonwebtoken.version}</version>
    <scope>runtime</scope>
</dependency>

首先创建JWT过滤器JWTFilter:

public class JWTFilter extends GenericFilterBean {

    public static final String AUTHORIZATION_HEADER = "Authorization";

    private final TokenProvider tokenProvider;

    public JWTFilter(TokenProvider tokenProvider) {
        this.tokenProvider = tokenProvider;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String jwt = resolveToken(httpServletRequest);
        if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) {
            Authentication authentication = this.tokenProvider.getAuthentication(jwt);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    private String resolveToken(HttpServletRequest request) {
        String bearerToken = request.getHeader(AUTHORIZATION_HEADER);
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7);
        }
        return null;
    }
}

完成过滤器主要功能在于tokenProvider类,它分别完成token的key获取,以及用此Key来完成token的生成和解析,代码如下:

 @PostConstruct
    public void init() {
        byte[] keyBytes;
        String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getSecret();
        if (!StringUtils.isEmpty(secret)) {
            log.warn("Warning: the JWT key used is not Base64-encoded. " +
                "We recommend using the `jhipster.security.authentication.jwt.base64-secret` key for optimum security.");
            keyBytes = secret.getBytes(StandardCharsets.UTF_8);
        } else {
            log.debug("Using a Base64-encoded JWT secret key");
            keyBytes = Decoders.BASE64.decode(jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret());
        }
        this.key = Keys.hmacShaKeyFor(keyBytes);
        this.tokenValidityInMilliseconds =
            1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSeconds();
        this.tokenValidityInMillisecondsForRememberMe =
            1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt()
                .getTokenValidityInSecondsForRememberMe();
    }

    public String createToken(Authentication authentication, boolean rememberMe) {
        String authorities = authentication.getAuthorities().stream()
            .map(GrantedAuthority::getAuthority)
            .collect(Collectors.joining(","));

        long now = (new Date()).getTime();
        Date validity;
        if (rememberMe) {
            validity = new Date(now + this.tokenValidityInMillisecondsForRememberMe);
        } else {
            validity = new Date(now + this.tokenValidityInMilliseconds);
        }

        return Jwts.builder()
            .setSubject(authentication.getName())
            .claim(AUTHORITIES_KEY, authorities)
            .signWith(key, SignatureAlgorithm.HS512)
            .setExpiration(validity)
            .compact();
    }

    public Authentication getAuthentication(String token) {
        Claims claims = Jwts.parser()
            .setSigningKey(key)
            .parseClaimsJws(token)
            .getBody();

        Collection<? extends GrantedAuthority> authorities =
            Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(","))
                .map(SimpleGrantedAuthority::new)
                .collect(Collectors.toList());

        User principal = new User(claims.getSubject(), "", authorities);

        return new UsernamePasswordAuthenticationToken(principal, token, authorities);
    }

新版本的JWT处理类io.jwtwebtoken对于secret长度有一定要求,JHipster关于jwt参数配置如下:(对于RemberMe的处理方式是:非选中保持24小时,选中则保持10天)

jhipster.security.authentication.jwt.base64-secret=ZjU1YWVlMDU0OWNlYjZjMjYwMDBlZjU0NmUwZDAyMThlNzUxYzU0ZGI2Njg3NDRjNjJiMDM1NTJiNGViODRlZTNiMDAwMzg3NGRjZDEzN2Y2YzkxMjU5NTNjMjZmNjNiOGQ3NjVmNGVmNGQ3MjI5MTI4ZTRiOGQ4MDQ3NjFiNjE=
# Token is valid 24 hours
jhipster.security.authentication.jwt.token-validity-in-seconds=86400
jhipster.security.authentication.jwt.token-validity-in-seconds-for-remember-me=2592000

JHipster通过对SecurityConfigurerAdapter类的扩展完成JWTFilter配置

public class JWTConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {

    private final TokenProvider tokenProvider;

    public JWTConfigurer(TokenProvider tokenProvider) {
        this.tokenProvider = tokenProvider;
    }

    @Override
    public void configure(HttpSecurity http) {
        JWTFilter customFilter = new JWTFilter(tokenProvider);
        http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
    }
}

最后再来看一下Spring Boot的核心配置类,JHipster给出一个比较简洁而规范的方式。

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Import(SecurityProblemSupport.class)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private final TokenProvider tokenProvider;

    private final CorsFilter corsFilter;
    private final SecurityProblemSupport problemSupport;

    public SecurityConfiguration(TokenProvider tokenProvider, CorsFilter corsFilter, SecurityProblemSupport problemSupport) {
        this.tokenProvider = tokenProvider;
        this.corsFilter = corsFilter;
        this.problemSupport = problemSupport;
    }

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

    @Override
    public void configure(WebSecurity web) {
        web.ignoring()
            .antMatchers(HttpMethod.OPTIONS, "/**")
            .antMatchers("/app/**/*.{js,html}")
            .antMatchers("/i18n/**")
            .antMatchers("/content/**")
            .antMatchers("/swagger-ui/index.html")
            .antMatchers("/test/**");
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            .csrf()
            .disable()
            //in WebConfigurer class define it for csrf
            .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class)
            .exceptionHandling()
                .authenticationEntryPoint(problemSupport)
                .accessDeniedHandler(problemSupport)
        .and()
            .headers()
            .contentSecurityPolicy("default-src 'self'; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://storage.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:")
        .and()
            .referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN)
        .and()
            .featurePolicy("geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'")
        .and()
            .frameOptions()
            .deny()
        .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
            .authorizeRequests()
            .antMatchers("/api/authenticate").permitAll()
            .antMatchers("/api/register").permitAll()
            .antMatchers("/api/activate").permitAll()
            .antMatchers("/api/account/reset-password/init").permitAll()
            .antMatchers("/api/account/reset-password/finish").permitAll()
            .antMatchers("/api/**").authenticated()
            .antMatchers("/management/health").permitAll()
            .antMatchers("/management/info").permitAll()
            .antMatchers("/management/prometheus").permitAll()
            .antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN)
        .and()
            .httpBasic()
        .and()
            .apply(securityConfigurerAdapter());
        // @formatter:on
    }

    // add jwtFilter before UsernamePasswordAuthenticationFilter.class
    // validate if header has Bearer then parse it to Authentication
    private JWTConfigurer securityConfigurerAdapter() {
        return new JWTConfigurer(tokenProvider);
    }
}

在这个核心配置类中不仅对跨域访问做了配置,同时对静态资源的访问也进行了配置,在配置末尾apply(securityConfigurerAdapter())使得JWTFilter生效。由于采用了Spring Boot默认的AuthenticationManagerBuilder和User,因此省略了对configure(AuthenticationManagerBuilder auth)方法进行重载,但是根据Spring 5.0对密码前缀要求,PasswordEncoder必须给出,这是核心配置中定义@Bean的原因。

核心配置类要求提供UserDetailsService的一个实现,示例代码如下:

@Component("userDetailsService")
public class DomainUserDetailsService implements UserDetailsService {

    private final Logger log = LoggerFactory.getLogger(DomainUserDetailsService.class);

    private final UserRepository userRepository;

    public DomainUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(final String login) {
        log.debug("Authenticating {}", login);

        if (new EmailValidator().isValid(login, null)) {
            return userRepository.findOneByEmailIgnoreCase(login)
                .map(user -> createSpringSecurityUser(login, user))
                .orElseThrow(() -> new UsernameNotFoundException("User with email " + login + " was not found in the database"));
        }

        String lowercaseLogin = login.toLowerCase(Locale.ENGLISH);
        return userRepository.findOneByLogin(lowercaseLogin)
            .map(user -> createSpringSecurityUser(lowercaseLogin, user))
            .orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the database"));

    }

    private org.springframework.security.core.userdetails.User createSpringSecurityUser(String lowercaseLogin, User user) {
        if (!user.getActivated()) {
            throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated");
        }
        List<GrantedAuthority> grantedAuthorities = user.getAuthorities().stream()
            .map(authority -> new SimpleGrantedAuthority(authority.getName()))
            .collect(Collectors.toList());
        return new org.springframework.security.core.userdetails.User(user.getLogin(),
            user.getPassword(),
            grantedAuthorities);
    }
}

完成以上配置,后端可以实现对用户认证和授权的功能,下面展示一下controller中授权请求中如何运用以上配置类,以及最终返回给前端的responseEntity。

    @PostMapping("/authenticate")
    public ResponseEntity<JWTToken> authorize(@Valid @RequestBody LoginVM loginVM) {
    	
        UsernamePasswordAuthenticationToken authenticationToken =
            new UsernamePasswordAuthenticationToken(loginVM.getUsername(), loginVM.getPassword());

        Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
       
        SecurityContextHolder.getContext().setAuthentication(authentication);
        boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe();
        String jwt = tokenProvider.createToken(authentication, rememberMe);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);
        return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK);
    }

Good Luck,

Cheers!

 

 

 

【Unity-UGUI控件全面解析】| Layout自动布局组件详解 UGUI中有个自动布局组件Auto Layout,主要包含下面几个模块(点击可进入官方文档下查看描述): 自动布局 布局元素 (Layout Element) 水平布局组 (Horizontal Layout Group) 垂直布局组 (Vertical Layout Group) 网格布局组 (Grid Layout Group) 内容大小适配器 (Content Size Fitter) 自动布局系统 基于布局元素和布局控制器的概念。一个布局元素是具有矩形变换以及其他可选组件的游戏对象。布局元素对自身 阅读详情

相关推荐

基于单片机负载控制的无人机电气设备监测系统设计

为深入分析无人机电气设备的电子负载性能,实现对传输电子量的合理性监管与控制,设计基于单片机负载控制的无人机电气设备监测系统;利用电气信号发生电路,构建负载网络控制器与以太网模块运行所需的电气设备负载环境,借助PCB监控板建立PLC扩展负载模块与核心监控主机之间的物理连接关系,实现无人机电气设备监测系统的硬件执行环境搭建;在此基础上,通过STM32型单片机移植协议,确定无人机电气设备通信主机的现有组态形式,联合已设定的监控任务有线级条件,实现监测系统的软件执行环境搭建,完成基于单片机负载控制的无人机电气设备监

weixin_45905610的博客 1300

JWT

概念:它是json web token的缩写,它将用户信息保存到token中,服务器不保存任何用户信息,服务器通过使用保存的秘钥验证token的正确性,只要正确即通过验证。优点: 1.在分布式系统中很好的解决了单点登录的问题,很容易解决session共享的问题 2.因为json的通用性,所以JWT是可以跨语言支持的,像C#,JavaScript,NodeJS,PHP等许多语言都可以使用 3.因为由...

小金莫慌 935

别再死磕文档了!用国产MBSES软件5分钟上手MBSE建模(保姆级图文教程)

本文通过国产MBSES软件,详细演示了如何在5分钟内完成智能家居系统的MBSE建模。从模块图定义到状态机图构建,再到参数约束验证,全程图文指导,帮助工程师快速掌握基于模型的系统工程方法,显著提升复杂系统设计效率。

weixin_26833503的博客 237

漫步SpringSecurity---采用持久化token来实现remember-me功能(SpringBoot项目)

之前几篇博客记录了一下SpringSecurity一些基础知识,也在整合Security那篇博客中记录了remember-me的使用方法和一些基本原理。这一篇就来记录一个和remember-me有关的一个操作,采用持久化token的方式来实现remember-me 小前言 以前我们实现remember-me功能时,是直接在配置类相应方法中加入这一行代码: http.rememberMe(); 之后就会在登录页面自动生成这一个单选框。 当然如果我们需要自定义登录页的话,只需要在前端页面添加一个rad

LeslieLau的博客 1669

【DAB收音机】DAB 认证介绍

DAB 认证ESTI 标准文档: ETSI 103461实际过认证时,需要根据产品的受众国家及区域,参考当地官方是否有国内认证协议。需要参考当地文档进行功能开发。例如:阿联酋地区用《UAE.S 5021 _ 2018.pdf》标准进行认证。ESTI 的DAB认证协议规定了家用和车载数字无线电的最低要求,及其对应的测试方法,是数字无线电认证标志规定的技术基础。本文以车载数字无线电接收器为例,进行部分DAB认证的介绍,详情请见官方文档。或联系博主获取DAB ESTI 103461的中文翻译资料。

qq_15271231的博客 1219

Ubuntu系统全盘备份——TimeShift的安装与使用

所以如果有那天你不小心作了个大死,并且幸运到还能打开GNOME桌面和Timeshift(只要不是执行sudo rm -f /*这样的自杀程序)的时候,点击你要恢复的那个备份文件再点击Restore,经过短暂的重启后你的系统就成功恢复了。打开软件后,会有一些初始化设置,只需要一直点击 Next。根据自己电脑的内存大小决定是自动备份还是手动备份。当然,对于虚拟机用户来说,没有比在客户机直接拷贝虚拟磁盘文件更棒的方式了。点击左上角的 Create,就会执行备份操作。最下面的意思就是说不会自动备份需要手动操作。

琉璃轻纱的博客 4703

跟着JHipster学做项目 (6) 安全访问控制(下)JWT的Vue前端应用

JHipster前端对JWT处理主要包括两个方面: 请求后端授权后对token进行解析。 从localStorage或者sessionStorage中获取token并放入请求报文。 JHipster没有采用Spring Boot默认的formData以及/login, 而是json报文,/authenticate,代码如下: public doLogin(): void { const data = { username: this.login, password: this.passw

java_augur的专栏 559

(五)C++自制植物大战僵尸游戏LoadingScene的实现讲解

游戏启动后就会立即切换到游戏加载场景中。只有游戏资源文件加载完成后,才能进入游戏。Loadingscene类继承Cocos2d-x中的Scene父类,表明Loadingscene是一个场景类。切换到LoadingScene场景中,首先会创建该场景,会调用函数,在该函数中调用自己定义的方法实现指定功能。代码文件的位置如下图所示。

尔灵尔亿的博客 2006

SpringSecurity OAuth2 配置 token有效时长

SpringSecurity OAuth2 配置 token有效时长

qq_31683775的博客 4612

在 SAP Fiori 里玩转 Manage Views:把过滤器与列表布局固化成你的默认工作台

本文介绍了SAP Fiori应用中"Manage Views"功能的核心价值和使用方法。该功能允许用户保存和复用个性化界面设置,包括筛选条件、列布局等,将重复操作简化为一次性配置。文章从技术实现、用户操作和治理建议三个维度展开: 功能本质:View存储的是界面状态而非业务模型,是提升个人生产力的工具 核心价值:固化高频操作,支持默认视图设置,实现"开箱即用"的工作状态 操作指南:详细说明了收藏、重命名、设为默认、自动应用等关键功能 治理建议:区分标准视图、个人视图和公

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 125

HFSS实战项目——基片集成波导(SIW)带通滤波器

设计了一款直接耦合的SIW带通滤波器, 采用直接耦合的形式, 工作频率覆盖19~21 GHz, 通带内插入损耗小于1.5 dB, 回波损耗小于-20 dB, 带外抑制特性良好.

2401_87464239的博客 4895

Spring security登录授权用户有效期简单例子

在上一个例子基础上: https://zhangphil.blog.csdn.net/article/details/122489213https://zhangphil.blog.csdn.net/article/details/122489213加入一些简单改造,任何登录授权用户会给一个登录后的有效期,超时后,当前用户需要重新登录认证。这种场景就是常见的网页和app的“记住我”(记住用户名和密码)功能,“记住我”的时间可以通过spring的rememberMe()完成。 修改的代码: @

Zhang Phil 2508

PCIe(二) —— 配置空间

好了,这一篇我们把配置空间的结构,分配和访问,都大概总结了一遍,并且还介绍了它们的头部字段和这些字段的意义,包括BAR和消息路由的原理。之后,如果有时间,我们会继续来探索PCIe的数据报文的结构和传输等等。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1767

用最低成本支持 IE8/IE9:aight 条件加载与按需构建实践

内网 OA、老版企业系统里往往还有一批 IE8/IE9 用户。aight 是面向这批浏览器的 JavaScript 垫片集合,是 IE8/IE9 兼容与旧版 IE 性能优化的手段:通过条件加载和按需构建,它只补齐旧版 IE 缺失的 ES5 与 DOM 能力,把加载和执行开销压到最低。 ## 📌 一、项目定位:aight 只补指定 API,不做浏览器模拟 aight 的边界很明确:只补齐指定

gitblog_00867的博客 314

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

JHipster 全栈开发(一)

本书,使用 JHipster 进行全栈开发,旨在解决全栈开发者今天面临的以下挑战:有大量的技术和选项需要学习客户需求增加,因此上市时间变得更加紧迫客户端框架变得复杂,难以集成技术和概念之间的集成如此之多,以至于大多数新手甚至熟练的开发者都会感到不知所措JHipster 为开发者提供了一个平台,使他们能够轻松地从零开始创建 Web 应用和微服务,无需花费大量时间来连接一切和集成技术。这为开发者节省了大量时间,使他们能够真正专注于解决方案,而不是花费时间学习和编写样板代码。

龙哥盟 1475

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如何用JHipster快速构建企业级Web应用:完整入门指南

JHipster是一个强大的开源项目生成器,基于Yeoman构建,能够帮助开发者快速搭建整合Spring Boot后端与Angular/React/Vue前端的现代化Web应用。它通过自动生成代码、集成开发工具和支持多种技术栈,极大提升了开发效率,是企业级应用开发的理想选择。 ## 🚀 JHipster核心优势解析 JHipster之所以受到开发者青睐,源于其独特的技术整合能力和开发效率提升

gitblog_00009的博客 1050

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JHipster 纯后端怎么替换原生swagger并在swagger配置jwt验证

最近刚入手学习JHipster,项目要进行完全的前后端分离,在jhipster --skip-client生成开发环境后,在完全脱离前端的情况下,想要通过类似Spring-boot后端配置swagger来进行API接口展示和调用测试 &lt;dependency&gt; &nbsp; &nbsp; &lt;groupId&gt;io.springfox&lt;/groupId&gt; &nb...

u013594885的博客 1536

JHipster 生成器快速入门

JHipster是一个用于生成、开发和部署Spring Boot应用程序及前端(Angular/React/Vue)的开发平台。本指南介绍了从环境准备到应用生成的完整流程: 环境要求:需安装Node.js(^20.17.0或>=22.9.0)、npm(>=8.0.0)、Git和Java JDK(17/21/24) 安装步骤: 通过npm全局安装Yeoman和generator-jhipster 创建项目目录并运行jhipster启动交互式配置 配置选项: 选择应用类型(单体/微服务) 配置前后端

Ciel_7521的博客 560

jHipster 3.4 创建最流行Java Web应用项目最简单的入门基本教程

转自:http://www.cnblogs.com/sam8881-Blogs/p/5630976.html 学习(Java Web)编程技术要点及方向; 完成项目的要决 jHipster(J潮客)其亮点: 风头超劲,席卷欧美,最新全能Java Web开发程式产生器 (java web generator)。由Java专家累积的开发经验,配上各类实用的框架技术,去

逍遥飞鹤的专栏 8094

JHipster-Online 源码架构设计详解

JHipster-Online是一个基于Angular 14和Spring Boot 2.7构建的前后端分离企业级Web应用开发平台。其架构采用模块化设计:前端为Angular单页应用,包含核心模块、业务模块、账户模块和管理模块,支持懒加载和路由守卫;后端为Spring Boot RESTful服务,分层实现表现层、业务逻辑层和数据访问层,集成JWT认证、Git集成等功能。系统通过领域驱动设计实现代码生成核心业务,支持技术栈选择、项目配置、Git集成等完整开发流程。该架构具备组件化、松耦合、高扩展性等特点,

Ciel_7521的博客 961

jHipster创建简单项目

潮客(jHipster)是什么东西? 是谁开始的?其实J潮客是开源技术, 在2013年由法国Java专家 Julien Dubois (朱利安 杜波尔斯)率先倡导,至今仍是J潮客项目主导者。简易直说它是工具集堆综合技术,意思是由多种技术工具配置而成的Java Web开发程式产生器。好处是由Java专家累积的开发经验,配上各类实用的框架技术,去繁取精的运用,全方位的配置,制成出完备的开发应用程式,绝...

qq_30281443的博客 1948

great-big-example-application 安全机制详解:JWT 认证与权限控制实现

在当今的Web应用开发中,**安全机制**是每个应用都必须重视的核心部分。Great Big Example Application作为一个全栈示例应用,采用了一套完善的**JWT认证**和**权限控制**系统来保护应用安全。本文将深入解析这个项目的**安全架构**,帮助开发者理解如何在实际项目中实现可靠的用户认证和授权机制。🚀 ## 🔐 JWT认证机制:现代Web应用的安全基石 Grea

gitblog_00328的博客 713

JHipster介绍:一个适用于Java和JavaScript的全栈框架

JHipster是一个用于生成混合Java和JavaScript应用程序的成熟框架,它支持你所喜爱的开发工具,并提供监控和其他开箱即用的管理功能。JHipster是一个历史悠久、雄心勃勃的Java和JavaScript混合项目,致力于使用现代反应式前端来简化全栈Java应用程序的开发。JHipster开发团队持续发布新版本,以跟上行业变化。让我们通过构建一个简单的应用程序来了解这个框架能做什么。开箱即用,JHipster在前端支持React、Vue和Angular。基于JPA的关系型数据存储,其中。...

Q54665642ljf的博客 1998

终极Spring Boot与Kotlin整合指南:great-big-example-application后端开发最佳实践

Spring Boot与Kotlin是现代Java后端开发的黄金组合,而great-big-example-application项目正是这一技术栈的完美示范。这个由JHipster生成的全栈示例应用展示了如何将Spring Boot的便捷性与Kotlin的现代语法相结合,构建企业级后端服务的最佳实践。🚀 ## 📋 项目架构概览 great-big-example-application是

gitblog_01410的博客 328

JHipster:颠覆传统开发模式的全栈框架利器

在当今快速变化的软件开发环境中,**全栈开发框架**已经成为提升开发效率的关键工具。JHipster作为一个集成了前后端技术的**快速构建Web应用**解决方案,正在重新定义现代企业级应用的开发方式。 ## 为什么选择JHipster来加速你的开发流程? ### 解决开发者的核心痛点 传统的Web应用开发往往需要开发者分别搭建后端API和前端界面,这个过程不仅耗时耗力,还容易出现技术栈不匹配

gitblog_00793的博客 955

jHipster详解

作者:LoveEmperor-王子様 转:https://blog.csdn.net/u010209217/article/details/79544357 JHipster中文文档(一) ...

你当像鸟飞往你的山~~ 5589
上一篇: 跟着JHipster学做项目 (5) 异常处理(下)Vue前端
下一篇: 跟着JHipster学做项目 (6) 安全访问控制(下)JWT的Vue前端应用
java_augur
博客等级 码龄22年 67粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值