当前位置: 首页 > 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;实现线上线下的互动和协同。线上商城则是指通过互…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...