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. 创建主应用类
java 复制代码
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, 创建用户服务
java 复制代码
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 {
    @Bean
    public PasswordEncoder passwordEncoder() {
        // 使用 BCrypt 作为密码编码器
        return new BCryptPasswordEncoder();
    }
    @Bean
    public 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();
    }
    @Bean
    public 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. 创建控制器
java 复制代码
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
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

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

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 中:
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
yaml 复制代码
spring.thymeleaf.cache=false

运行步骤

启动项目。

访问 http://localhost:8080/login 进入登录页面。

用户名:user,密码:password

用户名:admin,密码:admin

登录后:

http://localhost:8080/home:普通用户和管理员都可访问。

http://localhost:8080/admin:仅管理员可访问。

登出:点击页面中的 Logout

相关推荐
黄同学real2 小时前
使用.NET 8构建高效的时间日期帮助类
后端·c#·.net
ChinaRainbowSea3 小时前
四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用)
java·javascript·数据库·redis·后端·nosql
苏-言4 小时前
SSM框架探秘:Spring 整合 Mybatis 框架
java·spring·mybatis
忆~遂愿5 小时前
3大关键点教你用Java和Spring Boot快速构建微服务架构:从零开发到高效服务注册与发现的逆袭之路
java·人工智能·spring boot·深度学习·机器学习·spring cloud·eureka
eybk6 小时前
Qpython+Flask监控添加发送语音中文信息功能
后端·python·flask
计算机-秋大田6 小时前
基于SpringBoot的假期周边游平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
java·vue.js·spring boot·后端·课程设计
大叔_爱编程7 小时前
wx044基于springboot+vue+uniapp的智慧物业平台小程序
vue.js·spring boot·小程序·uni-app·毕业设计·源码·课程设计
SomeB1oody8 小时前
【Rust自学】16.3. 共享状态的并发
开发语言·后端·rust
2501_903238658 小时前
Spring Boot与H2数据库:快速搭建内存数据库应用
数据库·spring boot·oracle·个人开发