【Spring Security】快速入门之案例实操

目录

一、简介

1、什么是安全框架

2、主流的安全框架

3、为什么使用Spring Security

二、引言

1、什么是Spring Security

2、Spring Security工作原理

3、特点

三、快速入门

1、引入依赖

2、配置

3、启动测试

4、配置自定义账号密码

四、Web安全配置类

1.HttpSecurity介绍

2、实现自定义的登录(案例)

①配置相关页面及请求路径

②创建SecurityConfig配置类

③配置自定义登录

④配置安全退出

⑤配置多用户角色访问

⑥配置自定义异常处理器

6.1、请求接口302错误

6.2、提示403错误


一、简介

1、什么是安全框架

        安全框架是对访问权限进行控制的系统架构,旨在确保应用的安全性。应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。

        用户认证是验证某个用户是否为系统中的合法主体,即用户能否访问该系统。一般要求用户提供用户名和密码,系统通过校验用户名和密码来完成认证过程。

        用户授权是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。例如,对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。

        安全框架的选择也会影响系统的安全性。例如,Shiro比Spring Security更容易使用,实现上简单一些,同时基本的授权认证Shiro也基本够用。而Spring Security社区支持度更高,社区的亲儿子,支持力度和更新维护上有优势,同时和Spring这一套的结合较好。

2、主流的安全框架

  1. Shiro:是一个轻量级的安全框架,上手简单,提供了许多功能,包括身份验证、授权、加密和会话管理等。它不依赖于任何容器,可以运行在JavaSE和JavaEE项目中。
  2. Spring Security:这是一个比较重的安全框架,但也是最流行的。它提供了许多过滤器,也方便扩展。
  3. Sa-Token:这是一个近期的开源框架,上手容易,只需使用注解即可。它也内置了非常多的方法和注解,方便扩展。

3、为什么使用Spring Security

  1. 成熟稳定:Spring Security是一个成熟的框架,经过多年的发展和改进,已经相当稳定和可靠。它拥有庞大的用户基础和活跃的社区,可以提供丰富的支持和资源。
  2. 开源免费:Spring Security是开源的,可以免费使用和定制。这意味着用户可以根据自己的需求进行修改和扩展,同时也可以为该项目做出贡献。
  3. 易于集成:Spring Security与Spring框架深度集成,因此可以方便地使用Spring的其他功能,如依赖注入、事务管理等。这使得在Spring环境下开发安全功能更加便捷。
  4. 丰富的功能:Spring Security提供了丰富的安全功能,包括用户认证、授权、密码加密、会话管理等。这些功能可以帮助开发者快速构建安全的应用程序,而无需从头开始实现。
  5. 灵活的定制:尽管Spring Security提供了丰富的功能,但它也允许开发者根据自己的需求进行定制。这使得开发者可以根据应用程序的具体需求进行调整和优化。
  6. 安全性高:Spring Security采用了许多先进的安全技术,如加密、身份验证、授权等,可以有效地保护应用程序的安全。同时,由于其社区的活跃性和开源性质,安全性问题可以得到及时的解决和更新。

二、引言

1、什么是Spring Security

        Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI和AOP功能。Spring Security为基于J2EE企业应用软件提供了全面安全服务,包括认证、授权、加密和会话管理等。它对Web安全性的支持大量地依赖于Servlet过滤器。Spring Security采用“安全层”的概念,使每一层都尽可能安全,连续的安全层可以达到全面的防护。它可以在Controller层、Service层、DAO层等以加注解的方式来保护应用程序的安全。Spring Security提供的是应用程序层的安全解决方案,一个系统的安全还需要考虑传输层和系统层的安全,例如采用Htps协议、服务器部署防火墙等。

2、Spring Security工作原理

权限框架一般包含两大核心模块:认证(Authentication)和鉴权(Authorization)。

  • 认证:认证模块负责验证用户身份的合法性,生成认证令牌,并保存到服务端会话中(如TLS)。

  • 鉴权:鉴权模块负责从服务端会话内获取用户身份信息,与访问的资源进行权限比对。

核心组件介绍:

  • AuthenticationManager:管理身份验证,可以从多种身份验证方案中选择一种。

  • Authentication:用于验证用户的身份。

  • SecurityContextHolder:用于管理 SecurityContextThreadLocal,以便在整个请求上下文中进行访问,方便用户访问。

  • AccessDecisionManager:负责对访问受保护的资源的请求进行决策(即决定是否允许用户访问资源)

  • AccessDecisionVoter:是AccessDecisionManager的实现组件之一,它用于对用户请求的访问受保护的资源所需要的角色或权限进行投票。

  • ConfigAttribute:用于表示受保护资源或URL需要的访问权限,它可以理解为是访问控制策略的一部分

总结

        Spring Security的基本原理是基于J2EE的拦截器原理,形成一条很长的过滤器链。当客户端发起请求时,请求会进入Spring Security的过滤器链,这个过程会判断是否为登录请求。如果是登录请求,则进行用户认证,验证用户是否为系统中的合法主体;如果不是登录请求,则进行用户授权,验证用户是否有权限执行某个操作。在过滤器链中,会根据URI找到对应的鉴权管理器,进行鉴权。

        Spring Security还采用了责任链的设计模式,通过实现一些拦截器来对访问的URL进行拦截,通过对缓存中的角色进行相应判定后决定是否能访问该URL。

3、特点

  1. 兼容性强Spring Security是一个流行的开源框架,它可以与Spring应用程序完美集成。由于它的兼容性很好,因此可以非常方便地使用它保护Web应用程序。

  2. 功能强大Spring Security具备众多功能,包括注销、登录、角色、权限、令牌、XSS防御、CSRF防御等等。它还支持各种身份验证、角色和权限管理方式,如基于表单的认证、基于记住我功能的认证以及OAuth认证等等。

  3. 安全可靠Spring Security具有极高的安全性,它使用最新的安全标准和协议来保护Web应用程序。Spring Security采用安全性分层的策略来保护应用程序中的各个层,例如Web层、Service层、DAO层等等。除此之外,Spring Security还支持自定义安全策略和事件响应,从而使得开发者可以根据应用程序需求定制安全保护。

  4. 易于使用Spring Security提供了一种高度简化的方式来保护Web应用程序。它使用简单的标签和安全注解来添加安全保护,从而使得开发者可以基本不需要手动编写代码就可以完成安全保护。

  5. 社区广泛Spring Security是一个著名的开源框架,因此它有一个庞大的用户社区。这个社区不仅提供了大量的文档、示例和教程,而且还会解答开发者的问题、修复框架中的BUG等等。这为开发者提供了无限的支持和帮助,从而可以使用Spring Security更加自信。

三、快速入门

1、引入依赖

搭建一个Spring Boot的项目,导入相关依赖。

导入我们的security依赖。

        <!--        security-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <!-- freemarker -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

spring-boot-starter-security包含了以下几个主要的依赖:

  • spring-security-coreSpring Security的核心模块,提供了基于权限的访问控制以及其他安全相关功能。

  • spring-security-config:提供了Spring Security的配置实现,例如通过Java配置创建安全策略和配置Token存储等。

  • spring-security-web:提供了Spring Security Web的基本功能,例如Servlet集成和通过HttpSecurity配置应用程序安全策略。

2、配置

配置application.yml文件

spring:
    freemarker:
        # 设置freemarker模板后缀
        suffix: .ftl
        # 设置freemarker模板前缀
        template-loader-path: classpath:/templates/
        enabled: true

3、启动测试

创建HellController类,并定义hello请求处理方法:

@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
       return "hello,spring security";
    }
}

        在未配置spring security依赖之前,直接启动项目是可以无阻碍的任意访问请求路径的;但是配置了spring security之后需要通过认证登录后才能访问请求路径。

启动项目,系统会自动生成一个默认的随机登录密码(因为当前没有配置用户信息,配置之后就不会在生成默认登录密码)

这就是 Spring Security 为默认用户 user 生成的临时密码,是一个 UUID 字符串

4、配置自定义账号密码

application.yml文件中配置自定义用户名和密码。

spring:
  security:
    user:
      name: admin
      password: 123456

配置完成之后,请重启服务进行测试。

四、Web安全配置类

1.HttpSecurity介绍

HttpSecuritySpring Security 的一个核心类,用于配置应用程序的安全策略。

HttpSecurity 类通常包含许多方法,可以用于配置以下内容:

  1. HTTP 请求的安全策略,例如访问控制、跨站点请求伪造 (CSRF) 防护等。

  2. HTTP 验证的安全策略,例如基于表单、HTTP 基本身份验证、OAuth 等。

  3. 访问受保护资源时所需的身份验证和授权方式。

方法说明
authorizeRequests()用于配置如何处理请求的授权,默认情况下所有的请求都需要进行认证和授权才能访问受保护的资源
formLogin()用于配置基于表单的身份验证,包括自定义登录页面、登录请求路径、用户名和密码的参数名称、登录成功和失败的跳转等。
httpBasic()用于配置基于HTTP Basic身份验证,包括定义使用的用户名和密码、realm名称等。
logout()用于配置退出登录功能,包括定义退出登录请求的URL、注销成功后的跳转URL、清除会话、删除Remember-Me令牌等。
csrf()用于配置跨站请求伪造保护,包括定义CSRF Token的名称、保存方式、忽略某些请求等。
sessionManagement()用于配置会话管理,包括定义并发控制、会话失效、禁用URL重定向、会话固定保护等。
rememberMe()用于配置Remember-Me功能,包括定义Remember-Me令牌的名称、有效期、加密方法、登录成功后的处理方式等。
exceptionHandling()用于配置自定义的异常处理,包括定义异常处理器和异常处理页面等。
headers()用于配置HTTP响应头信息,包括定义X-Content-Type-Options、X-XSS-Protection、Strict-Transport-Security等头信息。
cors()用于配置跨域资源共享,包括定义可访问的来源、Headers等。
addFilter()用于向当前HttpSecurity中添加自定义的Filter
and()用于在配置中添加另一个安全规则,并将两个规则合并。

匹配规则:

  • URL匹配

方法说明
requestMatchers()配置一个request Mather数组,参数为RequestMatcher对象,其match规则自定义,需要的时候放在最前面,对需要匹配的的规则进行自定义与过滤
authorizeRequests()URL权限配置
antMatchers()配置一个request Matherstring数组,参数为ant路径格式, 直接匹配url
anyRequest()匹配任意url,无参 ,最好放在最后面

  • 保护URL

方法说明
authenticated()保护Url,需要用户登录
permitAll()指定URL无需保护,一般应用与静态资源文件
hasRole(String role)限制单个角色访问
hasAnyRole(String… roles)允许多个角色访问
access(String attribute)该方法使用 SPEL, 所以可以创建复杂的限制
hasIpAddress(String ipaddressExpression)限制IP地址或子网

  • 登录formLogin

方法说明
loginPage()设置登录页面的 URL
defaultSuccessUrl()设置登录成功后的默认跳转页面
failuerHandler()登录失败之后的处理器
successHandler()登录成功之后的处理器
failuerUrl()登录失败之后系统转向的url,默认是this.loginPage + “?error”
loginProcessingUrl()设置登录请求的 URL,即表单提交的 URL
usernameParameter()设置登录表单中用户名字段的参数名,默认为 username
passwordParameter()设置登录表单中密码字段的参数名,默认为 password

  • 登出logout

方法说明
logoutUrl()登出url , 默认是/logoutl
logoutSuccessUrl()登出成功后跳转的 url 默认是/login?logout
logoutSuccessHandler()登出成功处理器,设置后会把logoutSuccessUrl 置为null

2、实现自定义的登录(案例)

①配置相关页面及请求路径

  • 自定义登录页

<h1>用户登录</h1>
<form action="/userLogin" method="post">
    <label>用户:</label><input type="text" name="username"/><br/>
    <label>密码:</label><input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
</form>
  • 创建UserController

@Controller
public class UserController {

    @RequestMapping("/toLogin")
    public String toLogin() {
        return "login";
    }

    @RequestMapping("/userLogin")
    public String userLogin(String username, String password) {
        System.out.println("username=" + username + ",password=" + password);
        return "index";
    }

    @RequestMapping("/admin/toAddUser")
    public String toAddUser() {
        return "admin/addUser";
    }

    @RequestMapping("/admin/toListUser")
    public String toListUser() {
        return "admin/listUser";
    }

    @RequestMapping("/admin/toResetPwd")
    public String toResetPwd() {
        return "admin/resetPwd";
    }

    @RequestMapping("/admin/toUpdateUser")
    public String toUpdateUser() {
        return "admin/updateUser";
    }

    @RequestMapping("/user/toUpdatePwd")
    public String toUpdatePwd() {
        return "user/updatePwd";
    }

    @RequestMapping("/noAccess")
    public String noAccess() {
        return "accessDenied";
    }

}

②创建SecurityConfig配置类

创建WebSecurityConfig配置类,设置@EnableWebSecurity注解开启Spring Security的默认行为。

@Configuration
//开启SpringSecurity的默认行为
@EnableWebSecurity
public class WebSecurityConfig {
​
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http)
            throws Exception{
        http.authorizeRequests()
                    // 开放接口访问权限,不需要登录就可以访问
                    .antMatchers("/toLogin").permitAll()
                    // 其余所有请求全部需要鉴权认证
                    .anyRequest().authenticated()
        return http.build();     
    }
}

配置完毕之后,请重启项目访问主页页面进行测试。

除了开放接口能正常访问以外,其他接口均提示403错误。

③配置自定义登录

@Configuration
//开启SpringSecurity的默认行为
@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http)
            throws Exception{
        http.authorizeRequests()
                    // 开放接口访问权限,不需要登录授权就可以访问
                .antMatchers("/toLogin").permitAll()
                    // 其余所有请求全部需要鉴权认证
                    .anyRequest().authenticated()
                .and()
                    .formLogin()
                    // 设置登录页面的 URL
                    .loginPage("/toLogin")
                    // 设置登录请求的 URL,即表单提交的 URL
                    .loginProcessingUrl("/userLogin")
                    // 设置登录表单中用户名字段的参数名,默认为username
                    .usernameParameter("username")
                    // 设置登录表单中密码字段的参数名,默认为password
                    .passwordParameter("password")
                ;
        return http.build();
    }
}

配置完毕之后,请重启项目访问登录页

④配置安全退出

修改SecurityConfig配置类,加入Spring Security安全退出设置。

@Configuration
//开启SpringSecurity的默认行为
@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http)
            throws Exception{
        http.authorizeRequests()
                    // 开放接口访问权限,不需要登录授权就可以访问
                    .antMatchers("/toLogin").permitAll()
                    // 其余所有请求全部需要鉴权认证
                    .anyRequest().authenticated()
                .and()
                    .formLogin()
                    // 设置登录页面的 URL
                    .loginPage("/toLogin")
                    // 设置登录请求的 URL,即表单提交的 URL
                    .loginProcessingUrl("/userLogin")
                    // 设置登录表单中用户名字段的参数名,默认为username
                    .usernameParameter("username")
                    // 设置登录表单中密码字段的参数名,默认为password
                    .passwordParameter("password")
                .and()
                    .logout()
                    // 设置安全退出的URL路径
                    .logoutUrl("/logout")
                    // 设置退出成功后跳转的路径
                    .logoutSuccessUrl("/")
                ;
        return http.build();
    }
}

配置完毕之后,请重启项目。先跳转到登录页面,输入账号密码登录,然后再点击安全退出按钮测试是否成功退出

⑤配置多用户角色访问

首先请删除或注释掉application.yml文件中的配置的自定义账号和密码。

spring:
  freemarker:
    suffix: .ftl
    template-loader-path: classpath:/templates/
    enabled: true
#  security:
#    user:
#      name: admin
#      password: 123456

修改SecurityConfig配置类,加入多用户角色配置。

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails admin = User.withUsername("admin")
                .password(bcryptPasswordEncoder().encode("123456"))
                .roles("ADMIN", "USER").build();
        UserDetails user = User.withUsername("user")
                .password(bcryptPasswordEncoder().encode("123456"))
                .roles("USER").build();
        return new InMemoryUserDetailsManager(admin, user);
    }

异常说明:

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

解决方案:这个错误通常是因为在使用 Spring Security 进行密码验证时没有正确地配置密码编码器。在 Spring Security 中,密码编码器用于将用户提供的密码编码为安全的散列值,并将其与存储在数据库中的散列值进行比较。如果没有正确地配置密码编码器,则 Spring Security 将无法识别密码编码器的类型,并在比较密码时引发“没有映射到 id“null”的密码编码器”异常。要解决这个问题,需要在 Spring Security 配置中配置一个密码编码器,并将其用于验证用户提供的密码。常用的密码编码器有 BCryptPasswordEncoderStandardPasswordEncoder

修改SecurityConfig配置类,配置密码编码器。

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

重启项目,重新使用账号和密码登录进行测试。

⑥配置自定义异常处理器

修改SecurityConfig配置类,设置不同角色的访问权限。

@Configuration
//开启SpringSecurity的默认行为
@EnableWebSecurity
public class WebSecurityConfig {
​
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http)
            throws Exception{
        http.authorizeRequests()
                    // 开放接口访问权限,不需要登录授权就可以访问
                    .antMatchers("/toLogin").permitAll()
                    // 设置角色权限
                    .antMatchers("/admin/**").hasRole("ADMIN")
                    .antMatchers("/user/**").hasAnyRole("ADMIN","USER")
                    // 其余所有请求全部需要鉴权认证
                    .anyRequest().authenticated()
                .and()
                    .formLogin()
                    // 设置登录页面的 URL
                    .loginPage("/toLogin")
                    // 设置登录请求的 URL,即表单提交的 URL
                    .loginProcessingUrl("/userLogin")
                    // 设置登录表单中用户名字段的参数名,默认为username
                    .usernameParameter("username")
                    // 设置登录表单中密码字段的参数名,默认为password
                    .passwordParameter("password")
                .and()
                    .logout()
                    // 设置安全退出的URL路径
                    .logoutUrl("/logout")
                    // 设置退出成功后跳转的路径
                    .logoutSuccessUrl("/")
                ;
        return http.build();
    }
}
6.1、请求接口302错误

重启项目,跳转登录页重新登录。这时发现登录不成功,后台控制台也没有产生任何异常信息,通过浏览器的网络(network)查看现实登录请求接口302错误。

解决方案:关闭csrf

修改SecurityConfig配置类,添加关闭csrf配置。

http.csrf().disable();

再次重启项目,发现登录正常。

6.2、提示403错误

最后通过切换不同的用户(useradmin)来测试角色权限是否授权成功,admin账号访问所有接口权限正常;切换到user账号访问时,发现以/admin/**开头的接口不能访问(证明鉴权成功),但是却提示403错误。

解决方案:配置自定义异常处理器

修改SecurityConfig配置类,添加自定义异常处理,并设置异常处理页面。

http.exceptionHandling().accessDeniedPage("/noauth")

重启项目后发现无权限将跳转到自定义异常页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/283059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux操作系统】探秘Linux奥秘:文件系统的管理与使用

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;诗赋清音&#xff1a;柳垂轻絮拂人衣&#xff0c;心随风舞梦飞。 山川湖海皆可涉&#xff0c;勇者征途逐星辉。 目录 &#x1fa90;1 初识Linux OS &…

ACES 增强版不丹水稻作物地图(2016-2022 年)

ACES 增强版不丹水稻作物地图&#xff08;2016-2022 年&#xff09; 用于改善粮食安全决策的 2016-2022 年年度作物类型稻米地图仍然是不丹的一项挑战。这些地图是与不丹农业部和 SERVIR 合作开发的。通过专注于发展不丹的科学、技术、工程和数学 (STEM)&#xff0c;我们共同开…

【瞎折腾/3D】无父物体下物体的旋转与移动

目录 说在前面移动World SpaceLocal Space 旋转World SpaceLocal Space 代码 说在前面 测试环境&#xff1a;Microsoft Edge 120.0.2210.91three.js版本&#xff1a;0.160.0其他&#xff1a;本篇文章中只探讨了无父对象下的移动与旋转&#xff0c;有父对象的情况将在下篇文章中…

Oracle merge into 语句用法 Oracle merge into 批量更新 关联更新 批量修改 关联修改

Oracle merge into 语句用法 Oracle merge into 批量更新 关联更新 批量修改 关联修改 一、概述 在开发任务中&#xff0c;遇到一个需求&#xff0c;同一批次的名单&#xff1b;根据一定的条件判断是否存在&#xff0c;若存在&#xff0c;则进行更新操作&#xff1b;若不存在&a…

ES6之Reflect详解

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

MySQL基础入门(二)

多表内容 一对多 这个内容是黑马的入门问题&#xff0c;可以带大家思考一下这个怎么设计 我们要知道一个岗位可以对应很多用户&#xff0c;而一个用户只能对应一个岗位&#xff0c;这就属于一对多的类型 那么我们需要怎么将他们进行关联呢&#xff1f; 现在我们可以通过一个…

Visual Transformer (ViT)模型详解

1 Vit简介 1.1 Vit的由来 ViT是2020年Google团队提出的将Transformer应用在图像分类的模型&#xff0c;虽然不是第一篇将transformer应用在视觉任务的论文&#xff0c;但是因为其模型“简单”且效果好&#xff0c;可扩展性强&#xff08;scalable&#xff0c;模型越大效果越好…

strlen的自定义函数的三种实现方法

文章目录 一&#xff0c;概要二&#xff0c;题目三&#xff0c;方法1&#xff0c;方法一2&#xff0c;方法二3&#xff0c;方法三 四&#xff0c;总结 一&#xff0c;概要 在求字符串长度的时候我们会遇到求解字符串的长度&#xff0c;此时我们想到的是strlen&#xff0c;头文件…

如何跨系统构建docker镜像?

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 1. 前言 docker镜像有基于amd64系统的&#xff0c;也有基于arm64系统的。 前段时间用了一个在x86_64的centos7服务器上构建的i…

SpringBoot自动配置原理和自定义启动器

1、自动配置的原理 项目在加载上下文时&#xff0c;会根据SpringBootApplication注解运行。该注解中有一个CompoentScan注解&#xff0c;会扫描和加载当前启动类所在的目录&#xff0c;以及所有的子目录&#xff1b;还有一个是EnableAutoConfiguration注解&#xff0c;这个注解…

huggingface的tokenizer解读

文章目录 前言一、huggingface的tokenizer含义1、含义2、整体概括 二、加载lmsys/vicuna-7b-v1.5模型的tokenizer三、调用tokernizer方法四、字符串的tokens应用1、tokenizer应用2、tokenizer进行token分词(tokenizer.tokenize)3、tokens转模型识别ids(tokenizer.convert_token…

Centos7:Jenkins+gitlab+node项目启动(2)

Centos7&#xff1a;Jenkinsgitlabnode项目启动(1) Centos7&#xff1a;Jenkinsgitlabnode项目启动(1)-CSDN博客 Centos7&#xff1a;Jenkinsgitlabnode项目启动(2) Centos7&#xff1a;Jenkinsgitlabnode项目启动(2)-CSDN博客 Centos7&#xff1a;Jenkinsgitlabnode项目启…

数据结构【线性表篇】(三)

数据结构【线性表篇】(三&#xff09; 文章目录 数据结构【线性表篇】(三&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录一、双链表二、循环链表三、静态链表 结语 前言 为什么突然想学算法了&#xff1f; > 用较为“官方…

回溯法求不等式的所有整数解

这份代码本来是用来解决这个问题的 但是&#xff0c;修改之后即可用来解决任意多个xi组成的满足不等式的整数解 这里用真代码而不是伪代码来表示 源代码&#xff1a; #include<iostream> using namespace std; const int N1010; int p,q,r,goal,n; int cnt,sum,MIN; i…

ES6之生成器(Generator)

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

挑战Python100题(9)

100+ Python challenging programming exercises 9 Question 81 Please write a program to randomly print a integer number between 7 and 15 inclusive. Hints: Use random.randrange() to a random integer in a given range. 请编写一个程序,随机打印一个介于7和15之间…

Java学习,一文掌握Java之SpringBoot框架学习文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

2021-06-25 51蛋骗鸡按键切合LED

缘由ISIS 7 Professional_有问必答-CSDN问答 #include "REG52.h" sbit K1 P3^0; sbit K2 P3^1; sbit K3 P3^2; sbit K4 P3^3; void main() {unsigned char Xd0,xz0,cs0;unsigned int wei0;P1255;while(1){if(K10&&Xd0){P10;while(K10);}if(K20&&…

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于预训练ESPCN的轻量化图像超分辨率模型TPU部署方案

2023 CCF 大数据与计算智能大赛 《基于TPU平台实现超分辨率重建模型部署》 作品名&#xff1a;基于预训练ESPCN的轻量化图像超分辨率模型TPU部署方案 队伍名&#xff1a;Absofastlutely 蒋松儒 计算机科学与技术系 硕士 南京大学 中国-江苏 kahsoltqq.com 吕欢欢 计算…

AI产品经理 - 如何做一款软硬协同AI产品

【背景】从0做一款软硬协同的AI产品&#xff0c;以智能医药保温箱 1.以智能医药保温箱 2.调研定义市场方向 地点&#xff1a;医药、实验室 场景&#xff1a;长宽高/装箱/运输/实验室 3.需求挖掘 4.如何进行软硬件AI产品工作 软硬件产品设计&#xff1a;功能/硬件外观设计、…
最新文章