springboot security

2023-05-16


Authority    权限
Credential    证书
Grant    授予

Authentication 身份验证

以下,我们将通过四步,逐步实现spring-security的username+password身份验证的登录功能。

一、添加spring-boot-start-security依赖即可实现默认的username+password登录。(默认用户认证)
二、实现自定义的固定用户和密码(内存用户认证)
三、实现自定义用户及密码登录的系统(UserDetailsService认证)
四、配置自定义页面,可配置的相关页面包括:登录表单页,登录错误页,登录成功页等。

请注意,我们是以一个spring-boot-starter-web项目为起点。


一、添加spring-boot-start-security依赖即可实现默认的username+password登录。(默认用户认证)


        <!-- 依赖:spring-security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>  

启动web应用,访问站点资源时,会出现spring-security提供的默认登录页面

其默认用户名为:user

登录密码在启动信息中可以找到:

填写正确即可登录成功。

这个最简单的配置适用于只有一个用户且每次系统启动后查阅更新密码的系统。当然,这种系统不常见。

二、实现自定义的固定用户和密码(内存用户认证)

需添加自定义配置,我们以java配置方式实现。

1. 创建一个继承自org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter的类;

2. 类上以@Configuration和@EnableWebSecurity注解,表明这是一个java配置类,并启用spring-security身份认证;

3. 覆写configure(AuthenticationManagerBuilder auth)方法;

4. 调用auth对象的.inMemoryAuthentication().withUser("xxx").password("xxx").roles("USER")等方法,指定用户、密码及角色,多个用户可以调用.and()方法来连接.withUser方法。


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
        .inMemoryAuthentication()    // 内存用户认证
          .withUser("xxx").password("xxx").roles("USER")    // 配置用户xxx密码xxx及角色USER
          .and()
       .withUser(
"yyy").password("yyy").roles("USER") // 配置用户yyy密码yyy及角色USER

 ; } }  

重启web应用后,默认的user用户登录方式已失效,

现在可以用户xxx或yyy登录(针对spring4版本)

使用spring5版本的话,在此,会报错:java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null",登录页面无法跳转

spring5要求必须指定密码编译码器,我们可以用BCryptPasswordEncoder。

修改一下configure(AuthenticationManagerBuilder auth)方法,填加一行代码:.passwordEncoder(new BCryptPasswordEncoder())    // 指定加密方式


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
        .inMemoryAuthentication()    // 内存用户认证
        .passwordEncoder(new BCryptPasswordEncoder())    // 指定加密方式
        .withUser("xxx").password("xxx").roles("USER")    // 配置用户xxx密码xxx及角色USER
    .and()
     .withUser(
"yyy").password("yyy").roles("USER") // 配置用户yyy密码yyy及角色USER
    
;
  }

重新登录,还出错:

控制台有提示:Encoded password does not look like BCrypt(看上去不像BCrypt编码的密码)

我们的密码"xxx"是以明文方式传递的,用new BCryptPasswordEncoder().encode("xxx")改为密文即可。


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
        .inMemoryAuthentication()    // 内存用户认证
        .passwordEncoder(new BCryptPasswordEncoder())    // 指定加密方式
        .withUser("xxx").password(new BCryptPasswordEncoder().encode("xxx")).roles("USER")    // 配置用户xxx密码xxx及角色USER
        .and()
        .withUser("yyy").password(new BCryptPasswordEncoder().encode("yyy")).roles("USER")    // 配置用户yyy密码yyy及角色USER
        ;
    }

}  

以上是修改后的配置类,再次重启登录就正常了。

这个简单的配置适用于拥有少数明确固定用户且密码不得改变的系统。当然,这种系统不够灵活。

三、实现自定义用户及密码登录的系统(UserDetailsService认证)

1. 依然使用上面的配置类;

2. 只是调用auth的.userDetailsService方法,该方法需要一个UserDetailsService接口作为参数;

3. 需要实现UserDetailsService接口的loadUserByUsername(String username):UserDetails方法来完成用户身份认证;

  loadUserByUsername(String username)返回一个UserDetails接口;

  UserDetails接口要求提供用户名、密码、角色等属性信息;

4. 注意指定密码编译器,可参考前例。

我们用一个私有方法来提供UserDetails接口作为示例,实际运用时推荐调用一个实体服务方法(例如:UserService.findBy(String username):User)来提供UserDetails接口。示例代码如下:


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(new UserDetailsService(){

            @Override
            public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
                return findBy(username);    //findBy(username)仅是一个示例方法
                //return UserService.findByName(username);    //通常,应该用一个Serice来实现
            }
            
            // 示例方法findBy(username)
            private UserDetails findBy(String username) {
                return new UserDetails(){
                    
                    private String username = "aaa";    //假定用户名为aaa
                    private String password = "aaa";    //假定用户密码为aaa
                    
                    @Override
                    public String getUsername() {
                        return username;
                    }
                    
                    @Override
                    public String getPassword() {
                        // 注意在此返回指定密码编译器编译的密文密码
                        return new BCryptPasswordEncoder().encode(password);
                    }
                    
                    //以上属性通常是自定义实体类User定义的
                    //以下属性是User实现UserDetails接口必须的

                    @Override
                    public Collection<? extends GrantedAuthority> getAuthorities() {
                        return java.util.Arrays.asList(new SimpleGrantedAuthority("USER"));//默认为USER角色
                    }

                    @Override
                    public boolean isAccountNonExpired() {
                        return true;    //默认账户未过期
                    }

                    @Override
                    public boolean isAccountNonLocked() {
                        return true;    //默认用户未被锁定
                    }

                    @Override
                    public boolean isCredentialsNonExpired() {
                        return true;    //默认证书未过期
                    }

                    @Override
                    public boolean isEnabled() {
                        return true;    //默认有效,即用户未被停用
                    }};
            }})
        .passwordEncoder(new BCryptPasswordEncoder())        // 指定密码编译器
        ;
    }

}  

配置类经过以上修改,再次重启,以用户aaa密码aaa就正常登录了。

需注意事项:

1. Arrays来自java.util.Arrays;

2. spring5中必须指定密码编译器,.passwordEncoder(new BCryptPasswordEncoder())

3. new SimpleGrantedAuthority("USER")只是示例性的简单授权,实际应用中应以数据源来提供用户角色。

4. 如果我们另以MyUserDetailsService实现UserDetailsService接口的话,代码更清晰,实际上主体代码是:


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
      .userDetailsService(
new MyUserDetailsService())
      .passwordEncoder(new BCryptPasswordEncoder()) // 指定密码编译器 ; } }

以上为UserDetailsService认证的java配置类主体代码。

这种通过实现UserDetailsService接口来完成用户身份认证的方式基本可以满足绝大部分系统需求,即username+password认证方式。

至此,功能倒是实现了,但spring-security提供的默认登录页面,未免过于简陋,这些界面是可以定制的。

四、配置自定义页面,可配置的相关页面包括:登录表单页,登录错误页,登录成功页等。

依然使用上面的配置类,重写configure(HttpSecurity http)方法来配置自定义页面。

以登录页为例,我们以spring-boot-starter-web和Thymeleaf来做示例。

前例中使用spring-security默认的登录页url为:http://localhost:8080/login,登录错误页url为:http://localhost:8080/login?error=true。

1. 对应的,我们设计自定义的url:登录http://localhost:8080/uia/login,登录错误http://localhost:8080/uia/login?error=true来取代。

2. 定义一个控制器来响应上面的登录请求

3. 编写登录页面,默认的输入参数name分别为username和password,自定义的话可以用类似.usernameParameter("usr").passwordParameter("pwd")方法来指定;

4. 修改配置类,重写configure(HttpSecurity http)方法,若啥也不写的话,默认配置为匿名访问所有资源。

5. 配置开放静态资源(/res/**)及及登录等(/uia/**),而其他请求都得认证;

6. 配置登录表单等请求;

7. 为简化复杂性,忽略csft防范!!! 切记,生产环境中不可忽略。spring4+默认启用csft,会拦截所有的POST请求,表现为提交登录表单无效。


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
            .antMatchers("/css/**", "/uia/**").permitAll()    //开放静态资源和登录等页面
            .anyRequest().authenticated()    //其他所有资源均需认证
            .and()
        .formLogin()    // 启用登录表单
            .loginPage("/uia/login")    //指定登录请求
            .failureUrl("/uia/login?error=true")    //指定登录失败请求
            //.usernameParameter("usr").passwordParameter("pwd")    //指定form中输入域input的name属性
        .and().csrf().disable()    //示例中为简化复杂性,忽略csft防范!!!切记,此项不可用于生产环境。
        ;
    }  

 Controller简单示例,其他如注册,找回密码等代码已移除。


@RestController
@RequestMapping("/uia")
public class UiaController {
    
    @RequestMapping(value="/login")
    public ModelAndView login(){
        //TODO 处理些页面后台数据,例如:登录提示、错误原因等
        return new ModelAndView("loginView");
    }
    
    @RequestMapping("/logout")
    public ModelAndView logout(HttpServletRequest request, HttpServletResponse response){
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null){    
            new SecurityContextLogoutHandler().logout(request, response, auth);
        }
        return new ModelAndView("loginView");
    }
}  

登录页loginView.html简单示例,在此使用了Thymeleaf模板,多余的如bootstrap代码均已移除。


!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>Login</title>
</head>
<body>
                <h2>Please login</h2>
                <form name="f" method="post" th:action="@{/uia/login}" >
                        <input type="text" name="username" placeholder="user name" />
                        <input type="password" name="password" placeholder="password" />
                    <input type="submit" value="login" /> 
                </form>
                <p><span th:if="${param.error}">登录失败</span></p>
</body>
</html>  

注意:

form的action属性被th:action="@{/uia/login}所替代,这样,在post提交时,会自动补上sessionId。

最后,贴上完成的SecurityConfig.java代码


 1 @Configuration
 2 @EnableWebSecurity
 3 public class SecurityConfigB extends WebSecurityConfigurerAdapter{
 4 
 5     @Override
 6     protected void configure(HttpSecurity http) throws Exception {
 7         http
 8         .authorizeRequests()
 9             .antMatchers("/css/**", "/uia/**").permitAll()    //开放静态资源和登录等页面
10             .anyRequest().authenticated()    //其他所有资源均需认证
11             .and()
12         .formLogin()    // 启用登录表单
13             .loginPage("/uia/login")    //指定登录请求
14             .failureUrl("/uia/login?error=true")    //指定登录失败请求
15             //.usernameParameter("usr").passwordParameter("pwd")    //指定form中输入域input的name属性
16         .and().csrf().disable()    //示例中为简化复杂性,忽略csft防范!!!切记,此项不可用于生产环境。
17         ;
18     }
19 
20     @Override
21     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
22         auth.userDetailsService(new UserDetailsService(){
23 
24             @Override
25             public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
26                 return findBy(username);    //findBy(username)仅是一个示例方法
27                 //return UserService.findByName(username);    //通常,应该用一个Serice来实现
28             }
29             
30             // 示例方法findBy(username)
31             private UserDetails findBy(String username) {
32                 return new UserDetails(){
33                     
34                     private String username = "aaa";    //假定用户名为aaa
35                     private String password = "aaa";    //假定用户密码为aaa
36                     
37                     @Override
38                     public String getUsername() {
39                         return username;
40                     }
41                     
42                     @Override
43                     public String getPassword() {
44                         // 注意在此返回指定密码编译器编译的密文密码
45                         return new BCryptPasswordEncoder().encode(password);
46                     }
47                     
48                     //以上属性通常是自定义实体类User定义的
49                     //以下属性是User实现UserDetails接口必须的
50 
51                     @Override
52                     public Collection<? extends GrantedAuthority> getAuthorities() {
53                         return java.util.Arrays.asList(new SimpleGrantedAuthority("USER"));
54                     }
55 
56                     @Override
57                     public boolean isAccountNonExpired() {
58                         return true;    //默认账户未过期
59                     }
60 
61                     @Override
62                     public boolean isAccountNonLocked() {
63                         return true;    //默认用户未被锁定
64                     }
65 
66                     @Override
67                     public boolean isCredentialsNonExpired() {
68                         return true;    //默认证书未过期
69                     }
70 
71                     @Override
72                     public boolean isEnabled() {
73                         return true;    //默认有效,即用户未被停用
74                     }};
75             }})
76         .passwordEncoder(new BCryptPasswordEncoder())        // 指定密码编译器
77         ;
78     }
79 }  

请自行实现UserService服务,启用下面第27行代码:


 

 把配置文件变成这样


@Configuration
@EnableWebSecurity
public class SecurityConfigC extends WebSecurityConfigurerAdapter{
    
    @Autowired
    UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
            .antMatchers("/res/**", "/uia/**").permitAll()    //开放静态资源和登录等页面
            .anyRequest().authenticated()    //其他所有资源均需认证
            .and()
        .formLogin()    // 启用登录表单
            .loginPage("/uia/login")    //指定登录请求
            .failureUrl("/uia/login?error=true")    //指定登录失败请求
            //.usernameParameter("usr").passwordParameter("pwd")    //指定form中输入域input的name属性
        //.and().csrf().disable()    //示例中为简化复杂性,忽略csft防范!!!切记,此项不可用于生产环境。
        ;
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(new UserDetailsService(){

            @Override
            public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
                return userService.findByName(username);    //通常,应该用一个Service来实现
            }
            
        })
        .passwordEncoder(new BCryptPasswordEncoder())        // 指定密码编译器
        ;
    }
}  

至此,spring-security也算可以用起来了。

转载于:https://www.cnblogs.com/godwithus/p/9127755.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot security 的相关文章

  • Thymeleaf:传递 javascript 参数

    我有一个基本的 SpringBoot 应用程序 使用 Spring Initializer 嵌入式 Tomcat Thymeleaf 模板引擎 并打包为可执行 JAR 文件 我想将 POJO 的属性传递给 javascript 函数 tr
  • CSS 未在 Spring Boot 中加载

    我是 spring 框架工作和 spring boot 的新手 我正在尝试使用 CSS javascript js 添加静态 html 文件 文件结构是 我的 html 文件头看起来像这样
  • openssl_crypt 中初始化向量的使用

    我看了一下this https stackoverflow com questions 1391132 two way encryption in php问题 并想为自己做 当我运行这段代码时 直接取自这个答案 https stackove
  • 断路器和隔板式有什么区别?

    在微服务开发过程中 我们可以在Spring Boot中同时使用两者吗 这些都是从根本上不同的图案 The 断路器模式在消费者上实现 以避免压垮可能难以处理呼叫的服务 可以找到 Spring 中的示例实现here http www vinsg
  • 在 Spring 中设置 WS https 调用超时 (HttpsUrlConnectionMessageSender)

    我正在尝试为 WS 调用设置超时 我延长了WebServiceGatewaySupport并尝试将发送者超时设置为如下 public Object marshalSendAndReceive Object requestPayload We
  • 未捕获的安全错误:阻止了具有原点的框架...访问具有原点的框架

    我已经为 SAP 解决方案 无论什么 制作了一个组件 该组件通过 iframe 嵌入到报告中 在 SAP 平台 BO 上部署报告后 我收到此错误 在 Chrome 上 但在 IE 或 FF 上也不起作用 Uncaught SecurityE
  • 春季启动大战

    我倾向于在开发过程中使用可运行的 JAR 但我需要 WAR 来进行部署 我已经关注了this http spring io guides gs convert jar to war 有关从 JAR 转换为 WAR Spring Boot G
  • 解码 OAEP 填充时出错

    我的问题已经解决了一半 请帮助 我已使用数字签名的公钥成功加密了文本 但在解密时出现错误 解码 OAEP 填充时出错 我的代码如下 region Test Encryption public void a using var rsa new
  • Spring Websocket升级请求处理

    我正在尝试使用Spring Websocket with Sockjs and STOMPjs 如上所述Spring Websocket 文档 https docs spring io spring docs 5 0 0 BUILD SNA
  • Cloud Firestore 安全规则使用的语言名称是什么?

    我想知道用于 Cloud Firestore 安全规则的语法名称 如下所述https firebase google com docs firestore security get started authuser 0 https fire
  • 测试期间依赖性不满足

    我有一个运行良好的 Spring Boot 2 0 0 M2 应用程序 我在构造函数上使用自动装配 RequestMapping value rest RestController public class AddressRestContr
  • Web 应用程序的 Spring Boot 和 Comodo https 配置

    我是 https 配置的新手 并尝试配置 spring boot 和 Comodo SSL 经过几次电话和尝试后 我已经弄清楚如何为您的 spring boot 网站正确配置 https 下面的答案是详细步骤 希望它可以帮助人们生成更安全的
  • 如何在非Spring的构造型类中使用@Autowired

    我想在此类中使用该存储库 但是当我放置像 Component 这样的构造型时 我从 IDE 收到错误 无法自动装配 未找到 身份验证 类型的 bean public class CustomMethodSecurityExpressionR
  • 如何检测CSRF漏洞[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定一个网站 如何检测潜在的 CSRF 漏洞 提前致谢 这是一个CSRF https www owasp org index php
  • com.netflix.zuul.exception.ZuulException:Hystrix 读取超时

    我正在尝试使用 eureka 和 zuul 进行微服务 而且所有请求都有问题 耗时超过1秒 据我了解 1秒是默认的hystrix超时 为了在Zuul中配置超时 我必须配置这些属性 hystrix command default execut
  • AES 在汇编中的实现 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 大家好 我正在尝试构建一个代码来演示
  • 使用 CreateRestrictedToken(LUA_TOKEN) 从提升的进程创建低/中进程

    我正在尝试从提升的进程创建中或低完整性进程 我知道还有其他类似的问题 但它们主要关注使用资源管理器或任务计划程序等解决方法 我想坚持使用CreateRestrictedToken CreateProcessAsUser 我认为一定可以以某种
  • 用于集成测试的 Spring-boot 默认配置文件

    Spring boot利用弹簧型材 http docs spring io spring boot docs current reference html boot features profiles html它允许针对不同的环境进行单独的
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • Spring boot 2.3 中找不到 javax.validation [重复]

    这个问题在这里已经有答案了 升级到 Spring Boot 2 3 1 后javax validation找不到包

随机推荐

  • Docker容器 暴露多个端口

    1 创建容器是指定 docker run p lt host port1 gt lt container port1 gt p lt host port2 gt lt container port2 gt 2 修改dockerfile ex
  • 巴特沃斯(Butterworth)滤波器 (1)

    下面深入浅出讲一下Butterworth原理及其代码编写 1 首先考虑一个归一化的低通滤波器 xff08 截止频率是1 xff09 xff0c 其幅度公式如下 xff1a 当n gt 时 xff0c 得到一个理想的低通滤波反馈 xff1c
  • java如何将二进制转换为十进制

    1 使用java内部提供的方法 xff0c 直接进行api的调用 public static void binaryTodecimal2 int n String res 61 Integer toBinaryString n System
  • k8s中文文档

    k8s概念比较多 xff0c 有什么概念的疑惑的推 荐看k8s中文文档 me的环境 操作系统 xff1a centos7docker xff1a 1 12 6 环境跟me的不一致 xff1f 不要慌 xff0c 基本大部分操作都是行的通的
  • Spring Cloud Feign 请求动态URL

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 FeignClient 中不要写url 使用 64 RequestLine 修饰方法 2 调用地方必须引入 FeignClientConfiguration 必须有De
  • 折半查找:查找成功的最少/多次数、平均次数,查找不成功的最少/多次数、平均次数...

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最方面的方法是建立一个判定树 现在有11个数 xff1a xff08 第1行是索引 xff0c 第2行是数 xff09 0 1 2 3 4 5 6 7 8 9 10 7 1
  • goldengate 认证矩阵matrix

    http www oracle com technetwork middleware ias downloads fusion certification 100350 html 64 more 64 来自 ITPUB博客 xff0c 链接
  • 关于maven打包 “程序包com.sun.deploy.net不存在” 的问题

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 关于maven打包 程序包com sun deploy net不存在 的问题 遇到问题如下 xff1a INFO payGateway 1 0 SNAPSHOT SUCCE
  • 印度理工学院有多难考?

    http app myzaker com news article php pk 61 599546401bc8e08604000085 印度理工学院有多难考 xff1f 何赟08 17 原文是六月高考季时给公众号 34 中印对话 34 x
  • iOS系统下 的手机屏幕尺寸 分辨率 及系统版本 总结

    今天 我对iOS系统下 的手机屏幕尺寸 分辨率 及系统版本做了一次系统总结 供大家参考 首先 是系统 xff1a 随着iOS 系统不断升级 xff0c 现在已经到iOS7 0了 xff0c 并且TA有了很多新变化 xff0c 最震撼的就是
  • android ViewFlipper的使用

    屏幕切换指的是在同一个Activity内屏幕见的切换 xff0c 最长见的情况就是在一个FrameLayout内有多个页面 xff0c 比如一个系统设置页面 xff1b 一个个性化设置页面 通过查看 OPhone API文档可以发现 xff
  • linux tail命令的使用方法详解

    本文介绍Linux下tail命令的使用方法 linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备 xff0c 通常是终端 xff0c 通俗讲来 xff0c 就是把某个档案文件的最后几行显示到终端上 xff0c 假设该档
  • C/C++中static的用法全局变量与局部变量

    1 什么是static static 是C C 43 43 中很常用的修饰符 xff0c 它被用来控制变量的存储方式和可见性 1 1static的引入 我们知道在函数内部定义的变量 xff0c 当程序执行到它的定义处时 xff0c 编译器为
  • ubuntu apt-get和aptitude 安装软件包

    一 apt get apt get是一条linux命令 xff0c 适用于deb包管理式的操作系统 xff0c 主要用于自动从互联网的软件仓库中搜索 安装 升级 卸载软件或操作系统 什么是apt get编辑 是debian xff0c ub
  • 关于Egret Engine 2.5.3引入GUI模块问题记录

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 基本环境 xff1a Egret Engine 2 5 3 Egret Wing 2 1 使用EgretWing创建Game项目 xff0c 然后需要引入GUI模块 具体引
  • linux brctl command not found

    root 64 localhost brctl bash brctl command not found 解决方法 xff1a root 64 localhost yum install bridge utils
  • 参数LOG_ARCHIVE_MIN_SUCCEED_DEST

    LOG ARCHIVE MIN SUCCEED DEST PropertyDescriptionParameter type IntegerDefault value 1Modifiable ALTER SESSION ALTER SYST
  • Boot loader: Grub入门(转)

    Boot Loader Grub 在看完了前面的整个启动流程 xff0c 以及核心模块的整理之后 xff0c 你应该会发现到一件事情 xff0c 那就是 boot loader 是加载核心的重要工具 啊 xff01 没有 boot load
  • 容器概念与Linux Container原理

    一 容器与LxC 在像KVM等众多主机虚拟化解决方案中 xff0c 对每一个虚拟机实例提供的是从底层硬件开始一直到上层的环境 xff0c 在硬件级进行资源划分 虚拟机的内核是运行在硬件内核之上的 由于每个虚拟实例都有自己的运行内核 xff0
  • springboot security

    Authority 权限 Credential 证书 Grant 授予 Authentication 身份验证 以下 xff0c 我们将通过四步 xff0c 逐步实现spring security的username 43 password身