了解 RBAC

在 RBAC 模型中存在三个关键实体。他们是,

  1. 用户或主题 ——执行操作的系统参与者。它可以代表一个自然人、一个自动帐户,甚至是另一个应用程序。
  2. 角色 ——由职位、部门或职能层次结构定义的权限级别。
  3. 特权——执行操作的批准或许可

话虽如此,以下是这些实体如何相互映射的说明。


springsecurity角色权限配置 spring security用户角色权限_spring


基本上,用户可以执行操作。要执行操作,他们需要具有一定的权限或特权。这就是为什么将权限分配给角色而将角色分配给用户的原因。让我们看看如何实现这些。

 

本指南向您展示如何在Spring Security中配置基于角色的授权。要使用 Spring Security 授权,我们必须根据登录的用户角色覆盖并授权每个请求的方法。configure(HttpSecurity http)WebSecurityConfigurerAdapter

我们将建造什么

在此示例中,我们将创建一个 Spring Boot 应用程序并根据登录的用户角色授权每个请求。为此,我们需要以下内容:

1. 分配给用户授权访问 URL/页面的用户的角色:

private static final String ROLE_1 = "ADMIN";
private static final String ROLE_2 = "USER";


复制


2.不同角色的用户:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {		
	auth.inMemoryAuthentication()
			.withUser("admin")
			.password(passwordEncoder().encode("admin@123"))
			.roles(ROLE_1)
			.and()
			.withUser("user")
			.password(passwordEncoder().encode("user@123"))
			.roles(ROLE_2);
}


复制


为了演示,我们使用了 In-Memory 身份验证。

3.根据登录的用户角色授权每个请求:

@Override
protected void configure(HttpSecurity http) throws Exception {
	http.authorizeRequests()
			.antMatchers("/admin").hasRole(ROLE_1)
			.antMatchers("/user").hasAnyRole(ROLE_2, ROLE_1)
			.antMatchers("/all").permitAll()
			.and().formLogin();	
}


复制


4. 以及用户根据分配的角色访问的一些端点。

类似帖子:

  1. 带有 JPA 身份验证和 MySQL 的 Spring Boot + Spring Security
  2. 使用 Spring Boot 进行 Spring Security JDBC 身份验证

使用的技术

查找此应用程序中使用的所有技术的列表。

  1. 弹簧工具套件 4
  2. JDK 8
  3. Spring Boot 2.1.7.RELEASE
  4. Spring Security 5.1.6.RELEASE
  5. Maven 3

所需的依赖项

要解决 JAR 依赖关系,请将以下代码添加到您的pom.xml中。


pom.xml


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.7.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>org.websparrow</groupId>
	<artifactId>spring-security-authorization</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring-security-authorization</name>
	<description>Demo project for Spring Secuirty Authorization</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>


复制


项目结构

我们在 STS 4 IDE 中的应用程序的最终项目结构将如下所示:


springsecurity角色权限配置 spring security用户角色权限_应用程序_02


现在,让我们跳到实际的代码部分。

1. 用户端点

根据角色创建一些供用户访问的端点/页面。在这个控制器中,我创建了 3 个 REST 端点,即

  1. /admin → 用户访问的角色为“ ADMIN ”。
  2. /user → 用户访问的角色为“ USER/ADMIN ”。当然,ADMIN可以访问所有内容。
  3. /all → 所有人都可以访问。无需登录。

MyController.java


package org.websparrow.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

	@GetMapping("/admin")
	public String admin() {

		return "<h2>Welcome Admin!</h2>";
	}

	@GetMapping("/user")
	public String user() {

		return "<h2>Welcome User!</h2>";
	}

	@GetMapping("/all")
	public String all() {

		return "<h2>Hello Everyone!</h2>";
	}
}


复制


2.安全配置

为了限制用户的访问,我们需要扩展WebSecurityConfigurerAdapter类并覆盖它的方法,并根据登录的用户角色授权每个请求。configure(HttpSecurity http)

1. /admin → 用户访问的角色为“ ADMIN ”。
2. /user → 用户访问的具有“ USER/ADMIN ”角色。当然,ADMIN可以访问所有内容。
3. /all → 被所有人访问。无需登录。


SecurityConfiguration.java


package org.websparrow.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
	
	// Roles for users
	private static final String ROLE_1 = "ADMIN";
	private static final String ROLE_2 = "USER";
	
	// In-memory users with roles
	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {		
		auth.inMemoryAuthentication()
				.withUser("admin")
				.password(passwordEncoder().encode("admin@123"))
				.roles(ROLE_1)
				.and()
				.withUser("user")
				.password(passwordEncoder().encode("user@123"))
				.roles(ROLE_2);
	}
	
	// Password encoding
	@Bean
	public PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}

	// Authorized the request based on role
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests()
				.antMatchers("/admin").hasRole(ROLE_1)
				.antMatchers("/user").hasAnyRole(ROLE_2, ROLE_1)
				.antMatchers("/all").permitAll()
				.and().formLogin();
	}
}


复制


不要忘记在自定义安全配置类的类级别添加@Configuration和注释。@EnableWebSecurity

3. 运行应用程序

该类SecurityApp包含主要方法并负责启动应用程序。


SecurityApp.java


package org.websparrow;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SecurityApp {

	public static void main(String[] args) {
		SpringApplication.run(SecurityApp.class, args);
	}
}


复制


4. 测试应用

要测试应用程序,请通过执行上述类启动 Spring Boot 应用程序并按照以下步骤操作:

对于 /admin 页面:

  1. 点击 localhost:8080/admin,它会将您重定向到登录页面。
  2. 使用具有“ ADMIN ”角色的用户登录,成功验证后,它将显示管理页面。
  3. 同样,尝试使用不具有“ ADMIN ”角色的用户(用户具有“ USER ”角色)访问管理 URL,Spring Security 将阻止您访问管理页面。

对于 /user 页面:

  1. 点击 localhost:8080/user,它会将您重定向到登录页面。
  2. 使用具有角色“ USER ”的用户登录,成功验证后,它将显示用户页面。
  3. 用户具有“管理员”角色也可以访问它。

对于/所有页面:

  1. Spring Security 允许所有人访问 localhost:8080/all URL。它不需要经过身份验证。