spring boot中使用spring-security案例

  1. 项目结构
    src
    └── main
    ├── java
    │ └── com.example.securitydemo
    │ ├── RestapiApplication.java
    │ ├── config
    │ │ └── SecurityConfig.java
    │ ├── controller
    │ │ └── UserController.java
    │ └── service
    │ └── CustomUserDetailsService.java
    └── resources
    ├── templates
    │ ├── login.html
    │ ├── home.html
    │ ├── admin.html
    ├── static
    │ └── css
    │ └── styles.css
    └── application.properties
  2. 创建主应用类
package cn.mayanan.restapi;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class RestapiApplication {public static void main(String[] args) {SpringApplication.run(RestapiApplication.class, args);}
}
  1. 配置 Spring Security, 创建用户服务
package cn.mayanan.restapi.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;@Configuration
public class SecurityConfig {@Beanpublic PasswordEncoder passwordEncoder() {// 使用 BCrypt 作为密码编码器return new BCryptPasswordEncoder();}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.csrf(csrf -> csrf.disable()) // 可选,禁用 CSRF(仅开发时使用).authorizeHttpRequests(auth -> auth.requestMatchers("/login", "/public/**", "/css/**").permitAll() // 公开的资源.requestMatchers("/admin").hasRole("ADMIN") // 仅 ADMIN 用户可以访问.anyRequest().authenticated() // 其他请求需要认证).formLogin(form -> form.loginPage("/login") // 自定义登录页面.defaultSuccessUrl("/home", true) // 登录成功后跳转.permitAll()).logout(logout -> logout.logoutUrl("/logout").logoutSuccessUrl("/login?logout") // 登出后跳转.permitAll());return http.build();}@Beanpublic UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {UserDetails user = User.builder().username("user").password(passwordEncoder.encode("password")).roles("USER").build();UserDetails admin = User.builder().username("admin").password(passwordEncoder.encode("admin")).roles("ADMIN").build();return new InMemoryUserDetailsManager(user, admin);}
}
  1. 创建控制器
package cn.mayanan.restapi.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class UserController {@GetMapping("/home")public String home() {return "home";}@GetMapping("/admin")public String admin() {return "admin";}@GetMapping("/login")public String loginPage() {return "login";}
}
  1. 添加 HTML 页面
    login.html
<!DOCTYPE html>
<html lang="en">
<head><title>Login</title><link rel="stylesheet" href="/css/styles.css">
</head>
<body><h2>Login</h2><form method="post" action="/login"><label for="username">Username:</label><input type="text" name="username" required><br><label for="password">Password:</label><input type="password" name="password" required><br><button type="submit">Login</button></form><p>Don't have an account? Contact admin!</p>
</body>
</html>

home.html

<!DOCTYPE html>
<html lang="en">
<head><title>Home</title>
</head>
<body><h1>Welcome Home!</h1><p>You are logged in.</p><a href="/logout">Logout</a>
</body>
</html>

admin.html

<!DOCTYPE html>
<html lang="en">
<head><title>Admin Page</title>
</head>
<body><h1>Welcome, Admin!</h1><p>Only admins can see this page.</p><a href="/logout">Logout</a>
</body>
</html>
  1. 添加静态资源(CSS)
    在 src/main/resources/static/css/styles.css 中:
body {font-family: Arial, sans-serif;margin: 20px;
}
form {margin: 20px 0;
}
label {display: block;margin-bottom: 5px;
}
input {margin-bottom: 10px;
}
  1. 配置 application.yml
spring.thymeleaf.cache=false

运行步骤
启动项目。
访问 http://localhost:8080/login 进入登录页面。
用户名:user,密码:password
用户名:admin,密码:admin
登录后:
http://localhost:8080/home:普通用户和管理员都可访问。
http://localhost:8080/admin:仅管理员可访问。
登出:点击页面中的 Logout

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XML实体注入漏洞攻与防

JAVA中的XXE攻防 回显型 无回显型 cve-2014-3574

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…

mysql create table的用法

在MySQL中创建表的基本语法如下&#xff1a; CREATE TABLE table_name (column1 datatype,column2 datatype,column3 datatype,... );这里是一个例子&#xff0c;假设我们要创建一个名为employees的表&#xff0c;包含以下字段&#xff1a; id&#xff1a;一个整数类型的主键…

云计算架构学习之LNMP架构部署、架构拆分、负载均衡-会话保持

一.LNMP架构部署 1.1. LNMP服务搭建 1.磁盘信息 2.内存 3.负载信息 4.Nginx你们公司都用来干嘛 5.文件句柄(文件描述符 打开文件最大数量) 6.你处理过系统中的漏洞吗 SSH漏洞 7.你写过什么shell脚本 8.监控通过什么告警 zabbix 具体监控哪些内容 9.mysql redis查询 你好H…

页高速缓存与缓冲区缓存的应用差异

页高速缓存&#xff08;Page Cache&#xff09;与缓冲区缓存&#xff08;Buffer Cache&#xff09;是计算机系统中用于提高数据访问性能的两种不同类型的缓存机制&#xff0c;它们的差异主要体现在以下几个方面&#xff1a; 缓存目的 页高速缓存&#xff1a;主要用于加速对磁…

C语言程序设计:算法程序的灵魂

文章目录 C语言程序设计&#xff1a;算法程序的灵魂算法数据结构程序数据结构算法数值运算算法非数值运算算法 简单的算法举例【例2.1】求12345【例2.2】有50个学生&#xff0c;要求输出成绩在80分以上的学生的学号和成绩 简单的算法举例【例2.3】判定2000—2500年中的每一年是…

第28章 测试驱动开发模式:深入绿条模式及相关技术

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…

SpringAI基于API对大语言模型调用

引言 随着人工智能技术的迅猛发展&#xff0c;大型语言模型&#xff08;LLM&#xff09;在各个领域的应用越来越广泛。SpringAI作为一个旨在简化AI集成的框架&#xff0c;为开发者提供了高效、便捷的工具来连接和调用这些大模型。本文将详细探讨如何使用SpringAI整合通义千问等…

Python 在Word中添加、或删除超链接

在Word文档中&#xff0c;超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超链接&#xff0c;用户可以轻松地导航到相关信息&#xff0c;从而增强文档的互动性和可读性。本文将介绍如何使用Python在Word中添加超链接、或删除Word文档中的超…

Spring 源码学习(七)——注解后处理器-2

五 InitDestroyAnnotationBeanPostProcessor 类 1 属性 InitDestroyAnnotationBeanPostProcessor 类用于处理初始化与销毁注解&#xff1b;其中第一个属性为用于标识初始化方法与销毁方法注解类型的 initAnnotationType 与 destroyAnnotationType 属性、还有一个用于标识执行顺…

概率论里的特征函数,如何用卷积定理去理解

概率论里的特征函数&#xff0c;如何用卷积定理去理解_哔哩哔哩_bilibili

Unity入门1

安装之后无法获得许可证&#xff0c;可以考虑重装 新建项目 单击空白处生成脚本 双击c#文件 会自动打开vstudio 检查引用 如果没有引用&#xff0c;重开vstu&#xff0c;或者重新加载项目 hierarchy层级 scenes场景 assets资产 inspector督察 icon图标 资源链接&…

如何跨互联网adb连接到远程手机-蓝牙电话集中维护

如何跨互联网adb连接到远程手机-蓝牙电话集中维护 --ADB连接专题 一、前言 随便找一个手机&#xff0c;安装一个App并简单设置一下&#xff0c;就可以跨互联网的ADB连接到这个手机&#xff0c;从而远程操控这个手机做各种操作。你敢相信吗&#xff1f;而这正是本篇想要描述的…

单片机基础模块学习——按键

一、按键原理图 当把跳线帽J5放在右侧&#xff0c;属于独立按键模式&#xff08;BTN模式&#xff09;&#xff0c;放在左侧为矩阵键盘模式&#xff08;KBD模式&#xff09; 整体结构是一端接地&#xff0c;一端接控制引脚 之前提到的都是使用了GPIO-准双向口的输出功能&#x…

第25篇 基于ARM A9处理器用C语言实现中断<一>

Q&#xff1a;怎样理解基于ARM A9处理器用C语言实现中断的过程呢&#xff1f; A&#xff1a;同样以一段使用C语言实现中断的主程序为例介绍&#xff0c;和汇编语言实现中断一样这段代码也使用了定时器中断和按键中断。执行该主程序会在DE1-SoC的红色LED上显示流水灯&#xf…

Baklib如何提升企业的内容管理效率与协作能力

内容概要 在现代企业中&#xff0c;内容管理的有效性直接影响到工作效率、团队协作和创新能力。随着信息量的不断增加&#xff0c;企业亟需一个系统化的平台来高效处理和管理这些内容。Baklib作为一款先进的内容管理平台&#xff0c;通过其丰富的功能和灵活的应用场景&#xf…

debian12.9编译freeswitch1.10.12【默认安装】

服务器操作系统 cat /etc/os-release PRETTY_NAME"Debian GNU/Linux 12 (bookworm)" NAME"Debian GNU/Linux" VERSION_ID"12" VERSION"12 (bookworm)" VERSION_CODENAMEbookworm IDdebian HOME_URL"https://www.debian.org/&quo…

【2024年终总结】深圳工作生活评测

距离上次写年终总结已经过了一年半了&#xff0c;这一年半中哪怕经历了很多的事情&#xff0c;但是感觉又没发生什么。想写一些骚话&#xff0c;却总觉得自己无法完全表达&#xff0c;便也就这样&#xff0c;静静地记录下这一段时光。 现在是2025年&#xff0c;春节前的时光&am…

【算法】分治

分治 1.逆序对2.求第 k 小的数3.最大子段和4.地毯填补问题 分治&#xff0c;字面上的解释是「分而治之」&#xff0c;就是把一个复杂的问题分成两个或更多的相同的子问题&#xff0c;直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解的合并。 1.逆序对 P…

MongoDB 数据库备份和恢复全攻略

在当今数据驱动的时代&#xff0c;数据库的稳定运行和数据安全至关重要。MongoDB 作为一款流行的 NoSQL 数据库&#xff0c;以其灵活的文档模型和高扩展性备受青睐。然而&#xff0c;无论数据库多么强大&#xff0c;数据丢失的风险始终存在&#xff0c;因此掌握 MongoDB 的备份…