一、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技术站