当前位置: 首页 > news >正文

Java Web 安全实战:从登录到退出

Java Web 安全实战:从登录到退出

1. 介绍

在当今互联网时代,用户信息安全至关重要。在Java Web开发中,Spring Security是一个强大且灵活的身份验证和访问控制框架,它可以帮助我们构建安全可靠的应用程序。本文将介绍如何使用Spring Security实现一个安全的Java Web应用,涵盖登录、记住我、授权、退出登录、验证码、JWT整合、跨域、CSRF跨站攻击防护以及后台日志记录等方面。

 2. 登录实战

登录是用户进入系统的第一个屏障,安全的登录系统是保障用户信息安全的第一步。在Spring Security中,我们可以通过配置`WebSecurityConfigurerAdapter`来定制我们的登录逻辑。以下是一个简单的登录配置示例:

```

java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/dashboard")
                .permitAll()
                .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login?logout")
                .permitAll();
    }

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

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

在上述配置中,我们定义了登录页面的路径为`/login`,默认成功登录后跳转到`/dashboard`。`CustomUserDetailsService`是我们自定义的用户信息获取服务。

 3. 记住我功能

记住我功能可以在用户下次访问时免除登录过程,提供了更好的用户体验。在Spring Security中,我们可以通过`rememberMe()`来启用记住我功能:

```

java
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .rememberMe()
            .tokenValiditySeconds(604800) // 一周有效期
            .key("mySecretKey") // 密钥
            .userDetailsService(userDetailsService)
            .and()
        // 其他配置...
}
```

4. 授权实战

授权是确定用户能否访问某个资源的过程。Spring Security中的授权是非常灵活的,可以基于角色、权限、方法等进行控制。例如,我们可以通过注解实现方法级别的授权控制:

```java
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<?> performAdminAction() {
    // 执行需要管理员权限的操作
}
```

5. 退出登录

退出登录是保障用户信息安全的另一个关键点。Spring Security提供了默认的退出登录配置,可以通过以下方式进行自定义:

```java
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login?logout")
            .permitAll()
            .and()
        // 其他配置...
}
```

 6. 验证码

验证码是防止恶意攻击的重要手段,可以有效防止暴力破解等攻击。在Spring Security中,我们可以通过自定义`Filter`来实现验证码的验证:

```java
public class CaptchaFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // 验证码逻辑
        // ...
        filterChain.doFilter(request, response);
    }
}
```

7. JWT整合

JSON Web Token(JWT)是一种安全的身份验证方式,它可以在用户和服务器之间传递安全可靠的信息。在Spring Security中,我们可以使用`JJwt`库来实现JWT的生成和验证:

```java
String token = Jwts.builder()
    .setSubject(username)
    .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
    .signWith(SignatureAlgorithm.HS512, SECRET)
    .compact();
```

8. 跨域

跨域请求是Web开发中常遇到的问题,它涉及到浏览器的同源策略。Spring Security提供了跨域配置的支持,可以在`WebSecurityConfigurerAdapter`中进行配置:

```java
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .cors()
            .and()
        // 其他配置...
}
```

 9. CSRF跨站攻击防护

CSRF(Cross Site Request Forgery)是一种常见的Web攻击方式,攻击者通过伪造用户请求,实现对用户资源的操作。Spring Security提供了CSRF防护的支持,可以通过以下配置进行启用:

```java
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and()
        // 其他配置...
}
```

 10. 后台日志记录

在安全领域,日志记录是一种重要的安全措施,可以帮助我们追踪恶意请求、异常登录等安全事件。我们可以使用日志框架(例如Logback)来记录相关信息:

```xml
<appender name="SECURITY" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/security.log</file>
    <encoder>
        <pattern>%date [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>logs/security.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <maxFileSize>10MB</maxFileSize>
        <maxHistory>30</maxHistory>
    </rollingPolicy>


</appender>
```

11. 结语

在Java Web开发中,安全性至关重要。通过Spring Security,我们可以轻松地实现登录、记住我、授权、退出登录、验证码、JWT整合、跨域、CSRF跨站攻击防护和后台日志记录等功能,从而构建更加安全可靠的应用程序。希望本文对您在Java Web安全方面的学习和实践有所帮助。

这篇CSDN博客详细介绍了Java Web安全的各个方面,结合了实战经验和独特见解,旨在帮助读者构建更加安全可靠的应用程序。希望您喜欢这篇博客并从中受益。如果您有任何问题或建议,请随时留言,我将尽力为您解答。

相关文章:

Java Web 安全实战:从登录到退出

Java Web 安全实战&#xff1a;从登录到退出 1. 介绍 在当今互联网时代&#xff0c;用户信息安全至关重要。在Java Web开发中&#xff0c;Spring Security是一个强大且灵活的身份验证和访问控制框架&#xff0c;它可以帮助我们构建安全可靠的应用程序。本文将介绍如何使用Spr…...

08.Diffusion Model数学原理分析(下)

文章目录 denoising matching term σ t z \sigma_tz σt​z的猜想Diffusion Model for SpeechDiffusion Model for TextMask-Predict 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜索。 书接上文。 denoising matching term E q ( x t ∣ x 0 …...

什么样的CRM系统更适合外贸企业?

外贸CRM系统作为外贸客户关系管理的工具&#xff0c;已经成为了当下外贸企业对外贸易过程中不可或缺的一环。那什么样的CRM系统更适合外贸企业&#xff1f;小Z向您推荐Zoho CRM。下面说说它到底有什么好处和作用。 一、搭建更高效的客户关系管理系统 外贸企业从前期推广、开发…...

selenium自动化测试入门 —— 键盘鼠标事件ActionChains

在使用 Selenium WebDriver 做自动化测试的时候&#xff0c;会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作&#xff1b;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中&#xff0c;有一个专门的类来负责实现这些测试场…...

高级运维学习(十四)Zabbix监控(一)

一 监控概述 1 监控的目的 &#xff08;1&#xff09;报告系统运行状况 每一部分必须同时监控内容包括吞吐量、反应时间、使用率等 &#xff08;2&#xff09;提前发现问题 进行服务器性能调整前&#xff0c;知道调整什么找出系统的瓶颈在什么地方 2 监控的资源类别 …...

vite + electron引入itk报错

代码 import { readImageArrayBuffer } from itk-wasm console.log(readImageArrayBuffer)通过itk-wasm官网&#xff0c;创建新的项目vitevue&#xff08;vue2或者vue3&#xff09;&#xff0c;都没问题。加入electeon后包此错。通过排查&#xff0c;意外找到原因&#xff0c;…...

大厂面试题-MySQL为什么使用B+Tree作为索引结构

从几个方面来回答&#xff1a; 首先&#xff0c;常规的数据库存储引擎&#xff0c;一般都是采用B树或者B树来实现索引的存储。 (如图)因为B树是一种多路平衡树&#xff0c;用这种存储结构来存储大量数据&#xff0c;它的整个高度会相比二叉树来说&#xff0c;会矮很多。 而对…...

Tomcat的Engine容器

https://tomcat.apache.org/tomcat-10.1-doc/config/engine.html Engine元素代表与一个特定的Catalina Service关联的、整体的请求处理系统。它从一个或多个Connector接收并处理请求、返回完整的响应给Connector&#xff0c;以便最终传输给客户端。 在Service元素内部&#xf…...

vscode绿色行数设置

"workbench.colorCustomizations": {"editorLineNumber.foreground": "#00ff00"},...

闪站侠洗衣洗鞋管理系统app小程序开发;

闪站侠洗护软件系统为您提供全面的洗衣洗鞋解决方案&#xff0c;系统多门店&#xff0c;多网点。为您开通公中号小程序&#xff0c;并与顺丰、天猫、抖音、美团点评等第三方平台紧密连接。 我们解决洗衣工厂/门店的五大问题&#xff1a; 一、效率 从门店收衣到工厂出库&#xf…...

【操作系统】测试一

文章目录 单选题判断题简答题 单选题 &#xff08; &#xff09;不是基本的操作系统。 A. 批处理操作系统 B. 分时操作系统 C. 实时操作系统 D. 网络操作系统 【 正确答案: D】 操作系统提供给程序员的接口是&#xff08; &#xff09;。 A. 进程 B. 系统调用 C. 库函数 D. B和…...

如何用sklearn对随机森林调参

文章目录 一、概述二、实操1、导入相关包2、导入乳腺癌数据集&#xff0c;建立模型3、调参 三、总结 Link&#xff1a;https://zhuanlan.zhihu.com/p/126288078 Author&#xff1a;陈罐头 一、概述 sklearn是目前python中十分流行的用来实现机器学习的第三方包&#xff0c;其中…...

Java中单例模式

什么是单例模式&#xff1f; 1. 构造方法私有化 2. 静态属性指向实例 3. public static的 getInstance方法&#xff0c;返回第二步的静态属性 饿汉式是立即加载的方式&#xff0c;无论是否会用到这个对象&#xff0c;都会加载。 package charactor;public class GiantDragon…...

第1章 现代通信网概述

文章目录 1.1 通信网的定义1.2 通信网的分类1.3 通信网的结构1.4 通信网的质量要求 1.1 通信网的定义 1.1.1 通信系统 1.1.2 通信网的定义 通信网是由一定数量的节点 (包括终端节点、交换节点) 和连接这些节点的传输链路有机地组织在一起&#xff0c;以实现两个或多个规…...

99%的时间里使用的14个git命令

学习14个Git命令&#xff0c;因为你将会在99%的时间里使用它们 【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等 https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502 必须了解的命令整理 1&…...

适用于 iOS 的 10 个最佳数据恢复工具分享

在当今的数字时代&#xff0c;我们的移动设备占据了我们生活的很大一部分。从令人难忘的照片和视频到重要的文档和消息&#xff0c;我们的 iOS 设备存储了大量我们无法承受丢失的数据。然而&#xff0c;事故时有发生&#xff0c;无论是由于软件故障、无意删除&#xff0c;甚至是…...

泛微E-Mobile 6.0命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、漏洞原理 泛微E-Mobile 6.0存在命令执行漏洞的问题&#xff0c;在…...

React 共享组件状态及其实践

React 是一个强大的JavaScript库&#xff0c;它提供了一种简单的方式来构建用户界面。然而&#xff0c;随着应用规模的增长&#xff0c;状态管理成为一个复杂的问题。本篇文章将深入探讨如何在React组件之间共享状态。 状态提升 首先&#xff0c;我们来谈谈"状态提升&qu…...

linux目录说明

我一般会在/opt目录下创建 一个software目录&#xff0c;用来存放我们从官网下载的软件格式是.tar.gz文件&#xff0c;或者通过 wget地址下载的.tar.gz文件 执行解压缩命令&#xff0c;这里以nginx举例 tar -zxvf nginx-1.16.0.tar.gz -C /usr/local/src/ 把源码解压到/usr/loc…...

成集云 | 英克对接零售O2O+线上商城 | 解决方案

方案介绍 零售O2O线上商城是一种新型的商业模式&#xff0c;它通过线上和线下的融合&#xff0c;提供更加便捷的购物体验。其中&#xff0c;O2O指的是线上与线下的结合&#xff0c;通过互联网平台与实体店面的结合&#xff0c;实现线上线下的互动和协同。线上商城则是指通过互…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...