前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot集成SpringSecurity - 入门(一)

SpringBoot集成SpringSecurity - 入门(一)

作者头像
用户1212940
发布于 2022-04-13 09:03:03
发布于 2022-04-13 09:03:03
1.1K00
代码可运行
举报
文章被收录于专栏:LambdaLambda
运行总次数:0
代码可运行

源码地址:https://github.com/springsecuritydemo/microservice-auth-center01

无论是在生活还是在 WEB 应用开发中,安全一直是非常重要的一个方面。安全虽然属于应用的非功能需求,但是应该在应用开启初期就考虑进来。如果在应用开发的后期才考虑安全问题,就可能陷入一个两难的境地:

一方面,应用存在严重的安全漏洞,无法满足用户的要求,并可能造成用户的隐私数据被攻击者窃取;

两一方面,应用的基本架构已经确定,要修复安全漏洞,可能要对系统的架构做出比较重大的调整,进而需要更多的开发时间,影响整个项目的进度。所以,从应用开发的前期就应该把安全相关的因素考虑进来,并在整个系统开发过程中应用。

一、SpringSecurity简介

SpringSecurity 是基于Spring 提供声明式安全保护的安全性框架。SpringSecurity提供了完整的安全性解决方案,能够在Web请求级别方法调用级别处理身份认证授权

1.1 SpringSecurity 如何解决安全性问题 ?

SpringSecurity从两个角度来解决安全性问题:

  • 使用 Servlet 规范中的 Filter: 保护web请求并限制 URL 级别的访问;
  • 使用 Spring AOP 保护方法调用:借助于动态代理和使用通知,确保只有具备适当权限的用户才能访问安全保护的方法。

1.2 SpringSecurity 模块划分

Spring Security被分为了11个模块:

模块

描述

ACL(access control list)

支持通过访问控制列表(ACL)为域对象提供安全性

切面(Aspects)

当使用Spring Security注解时,会使用基于AspectJ的切面,而非标准的AOP

CAS(Central Authentication Service)客户端

提供与Jasig的中心认证服务(CAS)进行集成的功能

配置(Configuratiion)*

包含通过XML和Java配置Spring Security的功能支持

核心(Core)     *

提供Spring Security基本库

加密(Cryptography)

提供了加密和密码编码的功能

LDAP

支持基于LDAP进行认证

OpenID

支持使用OpenID进行集中式认证

Remoting

提供了对Spring Remoting的支持

标签库(Tag Library)

Spring Security的JSP标签库

Web

提供了Spring Security基于Filter的Web安全性支持

接下来我们就使用SpringBoot + SpringSecurity完成入门程序。

二、SpringSecurity基本原理

  • 绿色部分: 都是项目中根据需求进行自行添加的。
  • 蓝色部分Exception Translation Filter在后面的黄色部分抛出权限相关的异常之后会被拦截到,做相应的处理。
  • 黄色部分:是对Rest请求服务是否通过认证的最终决定。
  • 处理逻辑:当有一个非登录请求过来的时候,会直接进入到黄色部分,在黄色部分验证是否登录,如果登录则放行请求;如果未登录则抛出异常,被蓝色部分拦截后,会重定向到登录页面要求用户登录。在此时如果用户填写用户名和密码单击登录后,请求会被相应的绿色部分的Filter拦截,在Filter中进行用户登录,如果用户登录成功,则会把第一次的请求重定向到后面的Interceptor中继续判断是否可以访问REST API

三、SpringBoot整合SpringSecurity

3.1 导入依赖

导入 spring-boot-starter-security 依赖,在 SpringBoot 2.0.5 环境下默认使用的是 5.0.8 版本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

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

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid-spring-boot-starter</artifactId>
     <version>1.1.10</version>
</dependency>
 <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.16</version>
 </dependency>

3.2 创建数据库表

一般权限控制有三层,即:用户<–>角色<–>权限,用户与角色是多对多,角色和权限也是多对多。这里我们先暂时不考虑权限,只考虑用户<–>角色。 这里为了测试,表结构简单设计,后续可以根据业务添加先关字段。

数据库:Mysql 5.6 创建表结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 用户表
CREATE TABLE `sys_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 角色表
CREATE TABLE `sys_role` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 用户-角色关系表
CREATE TABLE `sys_user_role` (
  `user_id` int(11) NOT NULL,
  `role_id` int(11) NOT NULL,
  PRIMARY KEY (`user_id`,`role_id`),
  KEY `fk_role_id` (`role_id`),
  CONSTRAINT `fk_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

初始化数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO `sys_role` VALUES ('1', 'ROLE_ADMIN');
INSERT INTO `sys_role` VALUES ('2', 'ROLE_USER');

INSERT INTO `sys_user` VALUES ('1', 'admin', '123');
INSERT INTO `sys_user` VALUES ('2', 'pyy', '123');

INSERT INTO `sys_user_role` VALUES ('1', '1');
INSERT INTO `sys_user_role` VALUES ('2', '2');

注意:这里的权限格式为ROLE_XXX,是Spring Security规定的,不要乱起名字哦。具体如何修改我们后面讲到权限控制时才做处理。

3.3 准备页面

因为是实例程序,这里页面简单设计,只用于登录的 login.html 以及用户登录成功后跳转的 index.html,将其放置在工程 resources/static 目录下:

登录login.html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆</title>
</head>
<body>
<h1>登陆</h1>
<form method="post" action="/login">
    <div>
        用户名:<input type="text" name="username">
    </div>
    <div>
        密 码:<input type="password" name="password">
    </div>
    <div>
        <button type="submit">立即登陆</button>
    </div>
</form>
</body>
</html>

注意:用户的登陆认证是由Spring Security进行处理的,请求路径默认为/login,用户名字段默认为username,密码字段默认为password

首页index.html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>登陆成功</h1>
    <a href="/admin">检测ROLE_ADMIN角色</a>
    <a href="/user">检测ROLE_USER角色</a>
    <button onclick="window.kk='/logout'">退出登录</button>
</body>
</html>

3.4 配置application.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 9000
  servlet:
    context-path: /auth
spring:
  application:
    name: microservice-auth-center
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/auth_center?characterEncoding=utf-8
      username: root
      password: 123456
      driverClassName: com.mysql.jdbc.Driver
      initialSize: 5  #初始建立连接数量
      minIdle: 5  #最小连接数量
      maxActive: 20 #最大连接数量
      maxWait: 10000  #获取连接最大等待时间,毫秒
      testOnBorrow: true #申请连接时检测连接是否有效
      testOnReturn: false #归还连接时检测连接是否有效
      timeBetweenEvictionRunsMillis: 60000 #配置间隔检测连接是否有效的时间(单位是毫秒)
      minEvictableIdleTimeMillis: 300000 #连接在连接池的最小生存时间(毫秒)
      
mybatis:
  configuration:
    map-underscore-to-camel-case: true #开启Mybatis下划线命名转驼峰命名

3.5 创建实体类、DAO、Service和Controller

实体类:

  • SysUser:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class SysUser implements Serializable{
    private static final long serialVersionUID = -2836223054703407171L;

    private Integer id;

    private String name;

    private String password;
}
  • SysRole:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class SysRole implements Serializable {
    private static final long serialVersionUID = 7510551869226022669L;

    private Integer id;

    private String name;
}
  • SysUserRole:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class SysUserRole implements Serializable{
    private static final long serialVersionUID = -3256750757278740295L;

    private Integer userId;

    private Integer roleId;
}

DAO:

  • SysUserMapper:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapper
public interface SysUserMapper {

    @Select("SELECT * FROM sys_user WHERE id = #{id}")
    SysUser selectById(Integer id);

    @Select("SELECT * FROM sys_user WHERE name = #{name}")
    SysUser selectByName(String name);
}
  • SysRoleMapper:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapper
public interface SysRoleMapper {

    @Select("SELECT * FROM sys_role WHERE id = #{id}")
    SysRole selectById(Integer id);
}
  • SysUserRoleMapper:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapper
public interface SysUserRoleMapper {

    @Select("SELECT * FROM sys_user_role WHERE user_id = #{userId}")
    List<SysUserRole> listByUserId(Integer userId);
}

Service:

  • SysUserService:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class SysUserService {

    @Autowired
    private SysUserMapper userMapper;

    public SysUser selectById(Integer id) {
        return userMapper.selectById(id);
    }

    public SysUser selectByName(String name) {
        return userMapper.selectByName(name);
    }
}
  • SysRoleService:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class SysRoleService {

    @Autowired
    private SysRoleMapper roleMapper;

    public SysRole selectById(Integer id){
        return roleMapper.selectById(id);
    }
}
  • SysUserRoleService:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class SysUserRoleService {

    @Autowired
    private SysUserRoleMapper userRoleMapper;

    public List<SysUserRole> listByUserId(Integer userId) {
        return userRoleMapper.listByUserId(userId);
    }
}

Controller:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
public class LoginController {
    private Logger logger = LoggerFactory.getLogger(LoginController.class);

    @GetMapping("/login")
    public String showLogin() {
        return "login.html";
    }

    @GetMapping("/")
    public String showHome() {
        String name = SecurityContextHolder.getContext().getAuthentication().getName();
        logger.info("当前登陆用户:" + name);

        return "index.html";
    }

    @GetMapping("/admin")
    @ResponseBody
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public String printAdmin() {
        return "如果你看见这句话,说明你有ROLE_ADMIN角色";
    }

    @GetMapping("/user")
    @ResponseBody
    @PreAuthorize("hasRole('ROLE_USER')")
    public String printUser() {
        return "如果你看见这句话,说明你有ROLE_USER角色";
    }
}

注意:如代码所示:

  • 获取当前登录用户:SecurityContextHolder.getContext().getAuthentication()
  • @PreAuthorize 用于判断用户是否有指定权限,没有就不能访问

四、配置SpringSecurity

4.1 自定义用户认证逻辑UserDetailService

首先,我们需要自定义 UserDetailService, 将用户信息和权限注入进来。

我们需要重写 loadUserByUsername 方法,参数是用户输入的 用户名。 返回值是 UserDetails,这是一个接口,一般使用它的子类 org.springframework.security.core.userdetails.User

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class User implements UserDetails, CredentialsContainer {
    private static final long serialVersionUID = 500L;
    private static final Log logger = LogFactory.getLog(User.class);
    private String password;
    private final String username;
    private final Set<GrantedAuthority> authorities;
    private final boolean accountNonExpired;
    private final boolean accountNonLocked;
    private final boolean credentialsNonExpired;
    private final boolean enabled;

    public User(String username, String password, Collection<? extends GrantedAuthority> authorities) {
        this(username, password, true, true, true, true, authorities);
    }

    public User(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
        if(username != null && !"".equals(username) && password != null) {
            this.username = username;
            this.password = password;
            this.enabled = enabled;
            this.accountNonExpired = accountNonExpired;
            this.credentialsNonExpired = credentialsNonExpired;
            this.accountNonLocked = accountNonLocked;
            this.authorities = Collections.unmodifiableSet(sortAuthorities(authorities));
        } else {
            throw new IllegalArgumentException("Cannot pass null or empty values to constructor");
        }
    }

这里我们暂时只关注三个参数:用户名、密码和权限集。其它属性暂时使用默认值。

实际情况下,大多将 DAO 中的 User 类继承 org.springframework.security.core.userdetails.User 返回。

CustomUserDetailsService:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service("userDetailsService")
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private SysUserService userService;

    @Autowired
    private SysRoleService roleService;

    @Autowired
    private SysUserRoleService userRoleService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        // 从数据库中取出用户信息
        SysUser user = userService.selectByName(username);

        // 判断用户是否存在
        if(user == null) {
            throw new UsernameNotFoundException("用户名不存在");
        }

        // 添加权限
        List<SysUserRole> userRoles = userRoleService.listByUserId(user.getId());
        for (SysUserRole userRole : userRoles) {
            SysRole role = roleService.selectById(userRole.getRoleId());
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }

        // 返回UserDetails实现类
        return new User(user.getName(), user.getPassword(), authorities);
    }

}

4.2 WebSecurityConfig

Spring Security默认是禁用注解的,要想开启注解, 需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解, 来判断用户对某个控制层的方法是否具有访问权限

例如:上面代码方法前不加@preAuthorize注解,意味着所有用户都能访问方法,如果加上注解,表示只要具备指定角色的用户才有权限访问。

@EnableGlobalMethodSecurity详解

  • @EnableGlobalMethodSecurity(securedEnabled=true) 开启@Secured 注解过滤权限
  • @EnableGlobalMethodSecurity(jsr250Enabled=true)开启@RolesAllowed注解过滤权限
  • @EnableGlobalMethodSecurity(prePostEnabled=true) 使用表达式实现方法级别的安全性 ,4个注解可用:
    1. @PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问
    2. @PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常
    3. @PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
    4. @PreFilter允许方法调用,但必须在进入方法之前过滤输入值

首先,我们将自定义的 userDetailsService 注入进来,在 configure() 方法中使用 auth.userDetailsService() 方法替换掉默认的 userDetailsService

这里我们还指定了密码的加密模式(5.0版本强制要求设置),我们采用SpringSecurity提供的加密模式:BCryptPasswordEncoder,它帮我们实现了PasswordEncoder,当然也可以自定义加密模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.thtf.auth.security;

import org.springframework.beans.factory.annotation.Autowired;
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * ========================
 * Created with IntelliJ IDEA.
 * User:pyy
 * Date:2019/7/23 11:10
 * Version: v1.0
 * ========================
 */
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 如果有允许匿名的url,填在下面
//                .antMatchers().permitAll()
                .anyRequest().authenticated()
                .and()
                // 设置登陆页
                .formLogin().loginPage("/login")
                // 设置登陆成功页
                .defaultSuccessUrl("/").permitAll()
                // 自定义登陆用户名和密码参数,默认为username和password
//                .usernameParameter("username")
//                .passwordParameter("password")
                .and()
                .logout().permitAll();

        // 关闭CSRF跨域
        http.csrf().disable();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        // 设置拦截忽略文件夹,可以对静态资源放行
        web.ignoring().antMatchers("/css/**", "/js/**");
    }
}

五、运行测试

启动工程之前,由于数据库用户表的密码初始化的是明文,这里我们需要使用SpringSecurity 提供的加密工具类对密码进行重新加密修改: 加密类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SpringSecurityUtil {
    public static void main(String[] args) {
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
        String password = bCryptPasswordEncoder.encode("123");

        System.out.println(password);
    }
}

加密后密文:2a10

注:随机盐加密所以两次加密后结果不一样

启动工程:

ROLE_ADMIN 账户:用户名 admin,密码 123 ROLE_USER 账户:用户名 pyy,密码 123

  • 使用 ROLE_ADMIN 账号登录:
  • 使用 ROLE_USER 账号登录:

到此,我们的SpringBoot + SpringSecurity 入门案例已经讲解完毕,接下来我们将使用SpringSecurity 完成 用户登录 - 自动登录功能。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
[更新]U盘快捷方式蠕虫病毒查杀脚本
经过测试,确实U盘快捷方式被打开后病毒会被复制到电脑的C盘。C:users当前用户目录AppDataRoamingMicrosoft WindowsStart MenuProgramsStartup\ C:usersAppDataRoaming 这两处。
雨落凋殇
2019/12/25
4.2K0
[更新]U盘快捷方式蠕虫病毒查杀脚本
U盘内文件变为快捷方式怎么办?【一招解决】
文章目录 前言 二、解决方法 二、处理结果 总结 ---- 前言 ❗❗❗U盘内文件变为快捷方式怎么办❓ ---- 如图,优盘中蠕虫病毒,文件变为快捷方式 二、解决方法 1️⃣新建文本文件,后缀名改为 .bat 2️⃣将下面代码,复制进去 @echo off echo ============================================ echo. echo 恢复U盘隐藏文件夹 echo. echo ======================================
MIKE笔记
2023/03/22
8791
U盘内文件变为快捷方式怎么办?【一招解决】
YouTube博主实测病毒之王“熊猫烧香”,当年是它太强还是杀毒软件太弱?
2007年,有一款电脑病毒席卷大江南北,无论是个人还是企事业单位,电脑纷纷中招,网络一度瘫痪。
大数据文摘
2021/07/06
3.5K0
incaseformate传播与复现
2021-01-13日一种名为incaseformat的蠕虫在国内爆发,该蠕虫执行后将删除被感染计算机所有非系统软件,蠕虫设定的下一次删除时间为1月23日,建议各用户做好U盘防护及查杀工作。
天钧
2021/02/03
5080
incaseformate传播与复现
U盘病毒查杀工具:USBclean Mac
USBclean是一款强大的U盘病毒查杀工具,具有检测查杀70余种U盘病毒,U盘病毒广谱扫描,U盘病毒免疫,修复显示隐藏文件及系统文件等功能!
啾咪啾咪
2022/09/28
1.3K0
如何删除U盘system volume information_u盘单独文件夹加密
情景:U盘中毒,U盘内的文件夹名称变成.exe后缀,且多出一个名为System Volume Information的文件夹,对U盘进行格式化后,所有文件消失,当拔出U盘,再次插入电脑时,发现System Volume Information文件夹再次出现。
全栈程序员站长
2022/10/02
5.2K1
u盘文件夹exe病毒彻底_u盘中病毒文件变成快捷方式怎么办
笔者在使用U盘时,无意之间发现U盘所有文件的后缀名均变为“.exe”,经过查询相关资料,确认这是一种病毒(文件夹EXE病毒)
全栈程序员站长
2022/11/17
1.1K0
u盘文件夹exe病毒彻底_u盘中病毒文件变成快捷方式怎么办
哈哈,我把熊猫烧香病毒扒了!
链接:https://bbs.pediy.com/thread-266655.htm
良月柒
2021/10/14
2.1K0
1分钟教会你:DIY一个U盘图标及U盘文件夹图标
前不久买了张M2的固态,1T容量的配了个硬盘盒,用作日常使用。顺手就把U盘的图标和一级目录的图标改了。下面,就教大家修改U盘的图标以及文件夹的图标的方法。此外,本文还会提到windows
Power
2025/03/04
2510
自己手动复现一个熊猫烧香病毒
最近逛了一下 bilibili ,偶然的一次机会,我在 bilibili 上看到了某个 up 主分享了一个他自己仿照熊猫病毒的原型制作的一个病毒的演示视频,虽然这个病毒的出现距离现在已经十多年之久了,但是它的威胁性仍然不亚于永恒之蓝,出现了很多变种病毒。我觉得蛮有意思的,有必要深究一下,所以我花上几天的时间研究了一下熊猫烧香病毒的源码,仿照熊猫烧香病毒原型,也制作了一个类似的软件,实现的源码我会在文章的末尾给出 GitHub 项目链接,喜欢的朋友不要忘记给我一个 star and follow 呀!
Angel_Kitty
2018/09/21
7.3K0
自己手动复现一个熊猫烧香病毒
计算机病毒有哪几种,计算机病毒有哪几种
计算机病毒,也叫电脑病毒。它的种类很多。一旦感染这些病毒,轻则软件无法打开或文件被加密等;重则可能会使系统崩溃导致电脑无法正常启动,而电脑之所以会中病毒,主要是以下原因:
全栈程序员站长
2022/08/18
1.9K0
Windows应急响应Day2:蠕虫病毒
蠕虫病毒是一种十分古老的计算机病毒,它是一种自包含程序(或是一套程序),通常通过网络途径传播。每入侵到一台新的计算机,它就在这台计算机上复制自己,并自己执行它的程序。
Baige
2022/03/21
1K0
【安全事件】沉睡多年的incaseformat蠕虫病毒今日被唤醒!
2021年1月13日,绿盟科技应急响应团队接到全国多个客户反馈感染所谓的incaseformat病毒,涉及政府、医疗、教育、运营商等多个行业,且感染主机多为财务管理相关应用系统。感染主机表现为所有非系统分区文件均被删除,由于被删除文件分区根目录下均存在名为incaseformat.log的空文件,因此网络上将此病毒命名为incaseformat。
绿盟科技安全情报
2021/01/18
1.2K0
fun.xls.exe病毒分析、查杀及批处理清除「建议收藏」
大家经常用U盘, 也许就和我一样,遇到过这种叫 fun.xls.exe的病毒. fun.xle.exe是一种叫做U盘病毒tel.xls.exe的变种,会在电脑里注入文件,这个病毒目前应该有四个变种.用记事本打开AUTORUN是如下代码: [AutoRun] open=fun.xls.exe shellexecute=fun.xls.exe shell\Auto\command=fun.xls.exe shell=Auto [VVflagRun] aabb=kdkfjdkfk1 这个病毒瑞星暂不能查杀,我试了下用最新的卡巴可以杀掉,网上有人用国产的江民杀好象也能杀掉,笔者没有测试。
全栈程序员站长
2022/11/09
7980
让U盘永不中毒的解决办法
  在学校上课的时候,有个老师很潇洒的拿着一个U盘就来教室上课了。然后快上课的时候在电脑上准备播放课件。注意,这一瞬间其妙的事情发生了,课件因为他的U盘中病毒了,打不开了,老师当时笑了。后来又去拷贝一份,回来还是不行,就是不知道怎么回事,我记得以前只要把我的U盘插到学校教室里的电脑上,一定中毒,就知道学校电脑年久失修,病毒太疯狂了。老师当时一点招都没有,后来我默默的贡献出了我的已经被我“动过手脚”的U盘,拷贝回来再使用,一点问题没有,哈哈!当时别提多牛气,他们以为我的U盘比较贵比较好。其实:偷偷告诉你是因为我动手脚的原因,今天我来把这个经验分享给大家~
阿豪聊干货
2018/08/09
1.5K0
让U盘永不中毒的解决办法
文件夹exe病毒专杀器
仓库地址:WhitemuTeam/Folder-exe-virus-killer: 文件夹exe专杀器(针对某高中的拉跨系统制作) (github.com)
Moemu
2023/05/04
1.7K0
推荐阅读
相关推荐
[更新]U盘快捷方式蠕虫病毒查杀脚本
更多 >
LV.1
上海比升互联网技术有限公司JAVA开发工程师
目录
  • 一、SpringSecurity简介
    • 1.1 SpringSecurity 如何解决安全性问题 ?
    • 1.2 SpringSecurity 模块划分
  • 二、SpringSecurity基本原理
  • 三、SpringBoot整合SpringSecurity
    • 3.1 导入依赖
    • 3.2 创建数据库表
    • 3.3 准备页面
    • 3.4 配置application.yml
    • 3.5 创建实体类、DAO、Service和Controller
    • 四、配置SpringSecurity
    • 4.1 自定义用户认证逻辑UserDetailService
    • 4.2 WebSecurityConfig
  • 五、运行测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档