一文详解Spring Security的基本用法

一文详解Spring Security的基本用法

Spring Security是Spring框架中用于安全管理的子框架,它提供了一系列机制来保护应用程序的资源不被未经授权的用户访问,是Web应用程序开发中不可或缺的一部分。本文将详细讲解Spring Security的基本用法,包括如何添加依赖、配置安全和认证、以及如何使用注解来保护资源。

添加Spring Security依赖

为了使用Spring Security,首先需要将其添加到项目中。可以通过Maven或Gradle来实现。以Maven为例,添加以下依赖:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.4.5</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.4.5</version>
</dependency>

这里我们同时添加了spring-security-webspring-security-config两个依赖,前者提供了Spring Security的Web支持,后者提供了基本的安全和认证配置。

配置Spring Security

Spring Security的配置通常是通过Java类实现的。我们可以通过继承WebSecurityConfigurerAdapter类并重写其中的方法来完成配置。

配置用户

首先是配置用户。通过创建一个UserDetailsService的实现类来实现。例如:

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new UsernameNotFoundException("User not found with username " + username));
        return new org.springframework.security.core.userdetails.User(user.getUsername(),
                user.getPassword(),
                Collections.singletonList(new SimpleGrantedAuthority(user.getRole().name())));
    }
}

这里UserRepository是一个用于从数据库中查询用户信息的接口,根据具体的项目需求可以采用不同的实现方式。User是一个自定义的用户实体类。

配置安全和认证

接下来是配置安全和认证的部分。通过重写configure(HttpSecurity http)方法来实现:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

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

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

这里的配置指定了哪些URL需要认证和授权,以及如何进行认证和授权的处理逻辑。其中:

  • authorizeRequests()后的链式调用指定了不同URL对应的授权策略。例如/public/**表示所有以/public/开头的URL都不需要认证和授权,/private/**需要具有USER角色才能访问。
  • formLogin()指定使用表单验证登录,loginPage()指定了登录页面URL,defaultSuccessUrl()指定了登录成功后的默认跳转URL。
  • logout()指定了退出登录的处理逻辑,包括退出URL和退出后重定向的URL。
  • configure(AuthenticationManagerBuilder auth)方法配置了UserDetailsService,这个实例会在认证时被调用。

配置资源服务器

在以上的安全和认证配置完成后,还需要配置资源服务器的相关信息。通过继承ResourceServerConfigurerAdapter类来实现。例如:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/**").hasRole("ADMIN")
                .anyRequest().authenticated();
    }

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.tokenStore(tokenStore())
                .resourceId("my-resource");
    }

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(jwtAccessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("secret");
        return converter;
    }
}

这里的配置指定了哪些URL需要认证和授权,以及如何进行认证和授权的处理逻辑。其中:

  • configure(HttpSecurity http)指定了哪些URL需要认证和授权,例如/api/**需要ADMIN角色才能访问。
  • configure(ResourceServerSecurityConfigurer resources)指定了资源服务器的具体信息,其中tokenStore()指定了令牌的存储方式,这里采用的是JWT令牌,resourceId()是一个用于标识资源的唯一标识符。

使用注解保护资源

除了通过配置文件和代码来配置Spring Security,还可以通过注解来实现。例如:

@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/users")
    @PreAuthorize("hasRole('ADMIN')")
    public List<User> getUsers() {
        return userService.getUsers();
    }

}

这里使用了@PreAuthorize注解来保护资源,hasRole('ADMIN')表示只有具有ADMIN角色的用户才能访问。

示例1:使用Spring Security保护Web应用程序

下面的代码示例演示了如何使用Spring Security来保护Web应用程序:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

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

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

在上述代码中,除了初始化UserDetailsService外,我们还定义了哪些URL需要授权访问,例如:

  • /public/** 表示该目录下的所有资源都不需要授权即可访问
  • /private/** 表示该目录下的所有资源需要具备USER角色才能访问

我们还定义了登录页面地址、注销地址、注销后的跳转地址等。

示例2:使用Spring Security保护RESTful API

对于RESTful API,我们同样可以使用Spring Security来保护。以下示例使用JWT令牌进行认证和授权:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/**").hasRole("ADMIN")
                .anyRequest().authenticated();
    }

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.tokenStore(tokenStore())
                .resourceId("my-resource");
    }

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(jwtAccessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("secret");
        return converter;
    }
}

上述代码定义了哪些URL需要认证和授权,这里是/api/**,并且需要具备ADMIN角色。在资源服务器中,我们需要指定JWT令牌的存储方式以及资源标识符。

以上就是Spring Security的基本用法,包括添加依赖、配置安全和认证、使用注解保护资源等。希望这篇文章能够对大家了解Spring Security有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解Spring Security的基本用法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Docker学习笔记之Docker部署Java web系统

    Docker学习笔记之Docker部署Java web系统 本文将会详细介绍如何使用Docker来部署Java web系统。 步骤 步骤1:编写Dockerfile 首先需要编写一个Dockerfile,用于构建镜像。Dockerfile 中需要包含以下内容: FROM openjdk:8-jdk-alpine COPY target/myapp.war /…

    Java 2023年5月19日
    00
  • windows环境下java开发工具maven的安装教程图解

    Windows环境下Java开发工具Maven的安装教程图解 Maven是一款开源的项目管理工具,主要用于Java项目的构建、依赖管理和项目信息化管理。本文将详细介绍在Windows环境下安装Maven的步骤及图解。 准备工作 在安装Maven之前,需要确保以下环境已经准备好: Java运行环境已经安装并配置好环境变量 网络连接正常,可以访问Maven的官方…

    Java 2023年5月19日
    00
  • Java实现FTP上传与下载功能

    下面是Java实现FTP上传与下载功能的完整攻略: 1. 准备环境 在进行FTP上传与下载之前,需要准备以下环境: Java运行环境 FTP服务器 FTP登录账号和密码 2. 引入FTP客户端库 Java提供了FTP客户端库供我们使用,常见的有Apache commons-net和Spring FTP等,这里我们以Apache commons-net为例。在…

    Java 2023年5月20日
    00
  • RocketMQ是是如何管理消费进度的?又是如何保证消息成功消费的?

    RocketMQ消费者保障 消息确认机制 consumer的每个实例是靠队列分配来决定如何消费消息的。那么消费进度具体是如何管理的,又是如何保证消息成功消费的?(RocketMQ有保证消息肯定消费成功的特性,失败则重试) 什么是ACK 消息确认机制 在实际使用RocketMQ的时候我们并不能保证每次发送的消息都刚好能被消费者一次性正常消费成功,可能会存在需要…

    Java 2023年4月18日
    00
  • 从零开始让你的Spring Boot项目跑在Linux服务器

    首先我们来讲解“从零开始让你的Spring Boot项目跑在Linux服务器”的攻略。 准备工作 在将Spring Boot项目跑在Linux服务器之前,需要先确保我们已经满足以下条件: 已经有一台Linux服务器,并且可以通过SSH连接; 已经安装好Java Runtime Environment(JRE); 已经下载好我们的Spring Boot项目并打…

    Java 2023年5月19日
    00
  • JQuery标签页效果实例详解

    接下来我将为你详细讲解“JQuery标签页效果实例详解”的完整攻略。 概述 本文将介绍如何使用 jQuery 实现一个标签页效果。标签页是一种常见的网页布局方式,用户可以通过点击标签来切换不同的内容。在本文中,我们将使用 jQuery 和 CSS 实现一个简单的标签页效果。 实现步骤 创建 HTML 结构 首先需要创建一个 HTML 结构,包含多个标签和对应…

    Java 2023年6月15日
    00
  • maven中配置项目的jdk版本无效的排查方式

    请听我讲解maven中配置项目的jdk版本无效的排查方式的完整攻略。 1. 确认maven中配置jdk版本是否正确 在pom.xml文件中配置项目使用的jdk版本,如果这个配置是正确的,那么可以使用maven命令查看项目依赖的jdk版本: mvn help:effective-pom 执行该命令后,会在终端输出effective-pom的结果,其中即可看到j…

    Java 2023年5月20日
    00
  • Lombok和MapStruct整合详情

    Lombok和MapStruct是两个非常实用的Java开发工具,其中Lombok可以减少编写代码的麻烦,而MapStruct则可以生成JavaBean之间的映射关系,因此它们在项目中的应用十分广泛。下面将详细讲解Lombok和MapStruct整合的攻略。 Lombok和MapStruct整合:步骤说明 首先在项目的pom.xml文件中导入Lombok和M…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部