Spring Security概述

Spring Security是一个功能强大且高度可定制的框架,专门用于保护Java Web应用程序。它为开发者提供了一套全面的解决方案,帮助他们在应用程序中实现安全控制,从而确保数据的安全性和完整性。

添加依赖

首先,需要在Spring Boot项目的 pom.xml 文件中添加 Spring Security 的依赖,一定要注意版本问题。

复制代码
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-security</artifactId>
</dependency>

配置 Security

以下代码实现了一个简单的Spring Security配置,定义了基本的请求授权规则(部分路径公开,其他需认证)、表单登录方式(包括登录页面路径)、登出设置以及简单的内存用户认证信息(一个测试用户),为Spring Boot应用提供了初步的安全防护机制。

java 复制代码
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll() // 允许所有人访问主页和/home路径
                .anyRequest().authenticated() // 其他所有请求都需要认证
                .and()
            .formLogin() // 使用表单登录
                .loginPage("/login") // 设置登录页面的路径
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication() // 使用内存中的用户存储
                .withUser("user") // 创建一个用户
                    .password("{noop}password") // 设置密码({noop}表示不进行密码加密)
                    .roles("USER"); // 分配角色
    }
}

控制层

为了处理应用中的主页和登录页面请求,需要创建一个简单的控制器。

java 复制代码
@Controller
public class SimpleController {

    @GetMapping("/")
    public String home() {
        return "home";
    }

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

创建前端登录界面,实现应有的逻辑

然后运行应用

启动应用后,在浏览器中访问 http://localhost:8080/ ,此时,如果直接尝试访问受保护的路径,将会被自动重定向到登录页面。输入在配置中设定的用户名 "user" 和密码 "password",即可成功登录并访问相应的受保护资源。

常用注解

在Spring Security中,有几个比较重要的方法安全相关的注解和概念,它们对于实现细粒度的安全控制至关重要:

  1. @EnableMethodSecurity:这个注解用于启用方法安全功能,可以放在配置类上,以开启Spring Security的方法安全支持。
  2. @PreAuthorize:这是一个强大的注解,用于在方法执行之前进行权限检查,它允许使用Spring Expression Language编写表达式,以确定是否授权执行该方法,例如,@PreAuthorize("hasRole('ROLE_VIEWER')")表示只有拥有ROLE_VIEWER角色的用户才能调用该方法。
  3. @PostAuthorize:与@PreAuthorize相对应,这个注解用于在方法执行之后进行权限检查。它也可以访问方法的返回值,并根据返回值做出进一步的权限控制。
  4. @RolesAllowed:这是JSR-250规范中的注解,与@Secured类似,用于指定可以访问方法的角色。Spring Security也支持这个注解。
  5. @Secured:这是一个较旧的注解,用于授权方法调用。
  6. @WithMockUser:这个注解常用于测试中,用于模拟一个已认证的用户。可以指定用户名、角色等信息,以便在测试时模拟不同的用户场景。

这些注解和概念是Spring Security中方法安全的核心,它们使得开发者能够以声明式的方式实现复杂的安全逻辑,保护应用程序的关键部分不被未授权访问。

这些仅仅是 Spring Security 应用的冰山一角,实际上,Spring Security 提供了极为丰富的功能,例如认证、授权、防止CSRF,为构建安全的企业级应用程序提供了强大的支持。

相关推荐
Jul1en_2 分钟前
【Java 脚手架】封装通用工具类-1
java·spring boot·分布式·spring·spring cloud
关于不上作者榜就原神启动那件事34 分钟前
从 MDC 到 Agent:我手搓的文档路由协议,在 Spring AI Alibaba 里找到了正式实现
java·人工智能·spring·ai·agent
IKUN家族1 小时前
Spring MVC(三)
运维·服务器·spring boot·spring·servlet·java-ee
她说可以呀1 小时前
Spring-ai-alibaba视频生成
人工智能·spring·音视频
会编程的吕洞宾1 小时前
Spring Boot 虚拟线程实战:从原理到生产环境
java·后端·spring
黑桃小柒72 小时前
Prompt 工程的“断舍离“:如何用更少的词让 AI Agent 更聪明
java·后端·spring
一路向北North2 小时前
Spring AI(9) :解决百炼平台兼容性问题
java·人工智能·spring
玖石书2 小时前
ASP.NET Core 迁移至 Spring系列:语言基础篇
spring·asp.net·技术栈迁移
不才不才不不才21 小时前
Spring 源码系列(14): JDK 动态代理 vs CGLIB,以及拦截器责任链
java·开发语言·spring
用户31268748772021 小时前
Spring 事件机制到底怎么传播的?ApplicationEvent 源码拆解
java·spring