详解如何在项目中应用SpringSecurity权限控制

yizhihongxing

一、Spring Security介绍

Spring Security是为Java应用程序提供身份验证和授权框架的安全框架。它是基于Spring框架构建的,并为REST API,SOAP服务和Web应用程序提供安全性。通过在应用程序中提供针对身份验证和授权的支持,Spring Security可以有效地确保应用程序的安全性。

二、添加Spring Security依赖

在项目的pom.xml文件下的dependencies节点添加以下依赖:

<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-web</artifactId>
   <version>5.3.1.RELEASE</version>
</dependency>

<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-config</artifactId>
   <version>5.3.1.RELEASE</version>
</dependency>

三、配置Spring Security

在Spring Boot项目的src/main/java/com/example/security/下创建一个名为WebSecurityConfig的Java类。这个类需要扩展WebSecurityConfigurerAdapter。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http
               .authorizeRequests()
               .antMatchers("/", "/home").permitAll()
               .anyRequest().authenticated()
               .and()
               .formLogin()
               .loginPage("/login")
               .permitAll()
               .and()
               .logout()
               .permitAll();
   }
}

上述代码的意思是让根目录“/”和“/home”页面可以被未登录用户访问,其余页面必须先登录。同时,我们也定义了一个custom登录页面。在上述代码中,.and()方法确定安全策略链在相同的位置结束。我们添加了一个.formLogin()方法,允许Web应用程序使用Spring Security进行身份验证。

四、用户认证

在Spring Security中,用户和用户角色被称为权力。

在WebSecurityConfig类中,我们需要使用身份验证管理器注册身份验证对象。我们可以将内存AuthenticationProvider用作即时使用的用户存储,具体操作如下:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
   @Autowired
   public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
       auth
               .inMemoryAuthentication()
               .withUser("user").password("{noop}password").roles("USER")
               .and()
               .withUser("admin").password("{noop}password").roles("ADMIN");
   }
   ...
}

作者在这里创建了两个用户 : user和admin,它们都有ROLE_USER权限。上述代码中的{noop}表示不使用加密算法,以对其进行密码验证。推荐使用加密算法,以提高安全性。

五、示例代码

下面作者提供一个示例,以更好地说明如何在项目中使用Spring Security权限控制。

示例代码: https://github.com/wanglearn/SpringSecurity

在这个示例中,我们创建了一个简单的基于Spring Boot的Web应用程序,在其中添加了Spring Security进行身份验证和授权。

这是一个基本的项目结构,其中扫描了一些控制器类:

springsecurity
|-- src
|   |-- main
|   |   |-- java
|   |   |   |-- com
|   |   |   |   |-- example
|   |   |   |   |   |-- config
|   |   |   |   |   |   `-- WebSecurityConfig.java
|   |   |   |   |   |-- controller
|   |   |   |   |   |   |-- HelloController.java
|   |   |   |   |   |   |-- HomeController.java
|   |   |   |   |   |   `-- LoginController.java
|   |   |   |   |   |-- SpringSecurityApplication.java
|   |   |   |   |-- entity
|   |   |   |   |   `-- User.java
|   |   |   |   |-- repository
|   |   |   |   |   `-- UserRepository.java
|   |   |   |   `-- service
|   |   |   |       |-- UserService.java
|   |   |   |       `-- impl
|   |   |   |           `-- UserServiceImpl.java
|   |   |   `-- resources
|   |   |       |-- static
|   |   |       `-- templates
|   |   |           |-- hello.html
|   |   |           |-- home.html
|   |   |           |-- login.html
|   |   |           |-- my.html
|   |   |           `-- user.html
|   |   `-- resources
|   |       |-- application.properties
|   |       `-- schema.sql
|   `-- test
|       `-- java
|           `-- com
|               `-- example
|                   |-- SpringSecurityApplicationTests.java
|                   `-- TestJpa.java

在运行示例之前,请检查项目的数据库配置项,我们使用了MySQL数据库,这里将数据库地址、账号和密码设置为本地默认的root用户。

下面我们来看一下关键代码片段,这将告诉您如何启用Spring Security,以及如何对URI进行权限控制。

首先,在WebSecurityConfig类中启用Spring Security。这里的@EnableWebSecurity注解激活Spring Security。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http
               .authorizeRequests()
               .antMatchers("/", "/home").permitAll()
               .antMatchers("/user/**").hasRole("USER")
               .antMatchers("/admin/**").hasRole("ADMIN")
               .anyRequest().authenticated()
               .and()
               .formLogin()
               .loginPage("/login")
               .permitAll()
               .and()
               .logout()
               .permitAll();
   }
   ...
}

在上述代码中,handlerAuthenticationSuccess() , handlerAuthenticationFailure() 和 handlerLogoutSuccess() 方法将处理身份验证成功事件,身份验证失败事件和注销事件。

接下来,我们将使用身份验证对象来进行身份验证并将其存储在内存中。您可以将其存储在数据库中,以进行长期身份验证,这样,用户只需在注册时创建帐户。以下代码是为了演示而设置的。在正式部署前,请将内存身份验证替换为长期身份验证。在这里,我们提供了两个User实例。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
   @Autowired
   private UserServiceImpl userService;

   @Bean
   public PasswordEncoder passwordEncoder() {
       return new BCryptPasswordEncoder();
   }

   @Autowired
   public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
       auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
   }
   ...
}

其中,UserService和UserServiceImpl主要用于从数据库中加载注册用户和他们的密码和角色信息。为此,我们创建了UserRepository,并在Service层中引用它。

@Service
public class UserServiceImpl implements UserService, UserDetailsService {
   @Autowired
   private UserRepository userRepository;

   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
       User user = userRepository.findByUsername(username);
       if (user == null) {
           throw new UsernameNotFoundException("用户不存在!");
       }

       List<GrantedAuthority> authorities = new ArrayList<>();
       for (Role role : user.getRoles()) {
           authorities.add(new SimpleGrantedAuthority(role.getName()));
       }

       return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
   }
}

以上就是如何在Spring Boot项目中应用Spring Security权限控制的完整攻略,示例代码中提供了基于内存和数据库的身份验证方式,以及简单的URI权限控制规则,但是具体的实现还需要根据实际需要进行定制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解如何在项目中应用SpringSecurity权限控制 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 一个开发人员眼中的JSP技术(上)

    下面是一个详细的攻略: 什么是JSP技术? JSP(JavaServer Pages)是一种基于Java语言的web开发技术,它是由Servlets衍生出来的一种技术。它允许将Java代码插入到HTML页面中,使得页面具备动态生成内容的能力。相比于Servlets,JSP技术更加容易开发,并且更适合于构建动态网站。这是因为在JSP中可以通过EL表达式、自定义…

    Java 2023年6月15日
    00
  • springboot配置templates直接访问的实现

    下面是springboot配置templates直接访问的实现攻略: 1、添加Maven依赖 在pom.xml文件中添加以下Maven依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-star…

    Java 2023年5月19日
    00
  • Java 如何解析key为动态的json操作

    使用JsonNode解析动态key的Json 使用Jackson库中的JsonNode对象可以在解析动态key的Json时非常有用。JsonNode对象可以类比Java的DOM节点进行操作从而解析Json。可以像以下这样使用JsonNode解析动态key的Json: String jsonString = "{\"key1\":…

    Java 2023年5月26日
    00
  • Java线程休眠的5种方法

    Java线程休眠的5种方法 Java中的线程可以通过休眠来暂停一段时间。线程的休眠有5种方法,本文将详细介绍这5种方法,并给出代码示例。 方法一:使用Thread.sleep() Thread.sleep()是Java中比较常用的线程休眠方法。它可以将当前正在执行的线程休眠指定的时间,单位是毫秒。下面是使用Thread.sleep()方法的示例: publi…

    Java 2023年5月19日
    00
  • MyBatis注解式开发映射语句详解

    下面我将为您详细讲解“MyBatis注解式开发映射语句详解”的攻略。 什么是MyBatis注解式开发 MyBatis是一个开源持久层框架,它通过XML或注解的方式来实现面向关系型数据库的操作。在MyBatis中,我们可以使用注解来直接编写SQL语句,而不需要编写XML文件。 MyBatis注解式开发的优点 使用注解式开发,可以减少编写XML文件的工作量,直接…

    Java 2023年5月20日
    00
  • java导出dbf文件生僻汉字处理方式

    下面是java导出dbf文件生僻汉字处理方式的完整攻略。 总体思路 在java中,如果需要导出dbf文件中含有生僻汉字,需要进行字符集的转换,防止乱码。具体步骤如下: 将生僻汉字以GBK编码存储到List或数组中。 将List或数组中的每个字符转换成Unicode编码,并转换成16进制格式的字符串,存储到新的List或数组中。 使用Apache POI相关类…

    Java 2023年5月26日
    00
  • 如何使用Java字节码操纵库?

    Java字节码操纵库是一个用于读写、操纵Java字节码的工具库,常用于动态生成和修改字节码,实现AOP、代码增强等功能。本文将详细讲解Java字节码操纵库的使用攻略,包括环境配置、库的选择、常用API使用示例等。 环境配置 在开始使用Java字节码操纵库之前,我们需要确保系统已安装JDK,建议使用JDK 8及以上版本。然后,我们需要下载并导入所选的字节码操纵…

    Java 2023年5月11日
    00
  • Springmvc基于fastjson实现导包及配置文件

    SpringMVC 是一个非常流行的框架,它能很好的帮助我们实现 Web 应用开发。而 fastjson 是一个非常优秀的 JSON 序列化和反序列化类库,具备快速、可靠、灵活等特点,能够大大提高 Web 应用的效率。 在 SpringMVC 中使用 fastjson 可以大大减轻我们的开发负担,那么该如何实现呢? 导入 fastjson 包 首先需要在项目…

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