一文详解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日

相关文章

  • java实现银行家算法(Swing界面)

    Java实现银行家算法(Swing界面)攻略 银行家算法(Banker’s Algorithm)是一种经典的死锁预防算法,常用于操作系统中。在多进程环境下,进程需要占用资源,但是资源并不足够,如果资源分配策略不合理,则可能会出现死锁的情况。银行家算法通过资源的最大需求量和已分配需求量来判断分配资源是否会导致死锁的发生,从而保障系统运行的安全性。 本文基于Ja…

    Java 2023年5月19日
    00
  • Java 超基础讲解String的使用

    我将为您提供 Java 超基础讲解 String 的使用的完整攻略,具体如下: 一、什么是 String 在 Java 中,String 是一个类,它代表了一个字符串。 二、创建一个字符串变量 可以通过两种方式来创建一个字符串变量: 1. 直接赋值 String str1 = "Hello World"; 2. 使用构造方法 String…

    Java 2023年5月26日
    00
  • 深入理解Java中HashCode方法

    深入理解Java中HashCode方法 HashCode方法的概念和作用 HashCode是Java中的一个重要方法,它返回一个对象的hash值,即对象在内存中的地址的一个唯一标识符。在Java中,Hashtable、HashMap、HashSet等基于Hash算法实现的数据结构会使用对象的HashCode来确定对象在集合中的位置。因此,HashCode方法…

    Java 2023年5月26日
    00
  • 详解@ConfigurationProperties实现原理与实战

    详解@ConfigurationProperties实现原理与实战 什么是@ConfigurationProperties @ConfigurationProperties是Spring Boot提供的一种基于类型安全的配置方式。它可以方便地将properties文件中的属性映射到Java Bean中。可以通过@ConfigurationProperties…

    Java 2023年6月16日
    00
  • Mysql下载安装、部署与图形化详细操作教程

    下面是Mysql下载安装、部署与图形化详细操作教程的完整攻略。 下载Mysql 首先,我们需要从Mysql官网下载Mysql的安装文件。Mysql提供了多个版本,我们可以根据自己的操作系统和需要选择合适的版本进行下载。在本文中,我们以Windows 10系统为例,选择了Mysql数据库5.7版本。 下载链接:https://dev.mysql.com/dow…

    Java 2023年6月15日
    00
  • Java Web开发中过滤器和监听器使用详解

    Java Web开发中过滤器和监听器使用详解 概述 Java Web开发中的过滤器和监听器是用于处理Web请求和响应的框架,它们根据特定的需求对请求和响应进行预处理和后处理,从而实现Web应用的功能扩展以及业务处理。过滤器和监听器能够帮助我们实现诸如:事务管理、安全控制、请求和响应处理、统计性能等等的功能。 当我们需要在Web应用程序中加入某种公共的处理逻辑…

    Java 2023年6月15日
    00
  • eclipse创建springboot项目的三种方式总结

    在Eclipse中,我们可以使用以下三种方式来创建Spring Boot项目: 使用Spring Initializr创建项目 使用Eclipse自带的Spring Boot项目向导创建项目 使用Maven或Gradle创建项目 以下是每种方式的详细步骤和示例: 1. 使用Spring Initializr创建项目 步骤 打开Eclipse,选择File -…

    Java 2023年5月14日
    00
  • Java实现导出Excel功能

    下面我将详细讲解Java实现导出Excel功能的完整攻略,过程中包含以下几个步骤: 导入POI依赖 创建Excel工作簿和工作表 设置表头 向表中填充数据 导出Excel文件 1. 导入POI依赖 POI是Java操作Excel的开源项目,我们需要在项目中导入POI的相关依赖,这里以Maven为例,添加以下依赖即可: <dependency> &…

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