Nepxion Permission — это микросервисный API-фреймворк на основе Spring Cloud, который использует распределённое кэширование через Redis для хранения прав доступа. Он реализован с использованием Nepxion Matrix AOP и поддерживает как аннотированный, так и REST-вызовы.
Основные возможности:
Для получения имён переменных метода с помощью стандартного отражения необходимо установить параметр компилятора «-parameters» в IDE и Maven.
Nepxion Permission предоставляет простой в использовании AOP-фреймворк, но не является полноценной системой управления правами доступа. Пользователям необходимо самостоятельно реализовать следующие модули:
Версия фреймворка должна соответствовать версии Spring Cloud: 3.x.x для F-версии и 2.x.x для E-версии.
Зависимости: AOP:
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>permission-aop-starter</artifactId>
<version>${permission.version}</version>
</dependency>
Feign:
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>permission-feign-starter</artifactId>
``` **Текст запроса:**
String serviceName) { LOG.info("权限获取: userId={}, userType={}, permissionName={}, permissionType={}, serviceName={}", userId, userType, permissionName, permissionType, serviceName); // 验证用户是否有权限 // 需要和用户系统做对接,userId一般为登录名,userType为用户系统类型。目前支持多用户类型,所以通过userType来区分同名登录用户,例如财务系统有用户叫zhangsan,支付系统也有用户��занzhangsan // permissionName即在@Permission注解上定义的name,permissionType为权限类型,目前支持接口权限(API),网关权限(GATEWAY),界面权限(UI)三种类型的权限(参考PermissionType.java类的定义) // serviceName即服务名,在application.properties里定义的spring.application.name // 对于验证结果,在后端实现分布式缓存,可以避免频繁调用数据库而出现性能问题 // 示例描述用户zhangsan有权限,用户lisi没权限 if (StringUtils.equals(userId, "zhangsan")) { return true; } else if (StringUtils.equals(userId, "lisi")) { return false; }
return true;
}
}
**Перевод текста на русский язык:**
Строка serviceName) {
LOG.info («Получение разрешения: userId = {}, userType = {}, permissionName = {}, permissionType = {}, serviceName = {}», userId, userType, permissionName, permissionType, serviceName);
// Проверка наличия у пользователя разрешения
// Необходимо выполнить сопряжение с системой пользователей, где userId обычно является именем для входа, а userType — типом системы пользователей. В настоящее время поддерживается несколько типов пользователей, поэтому userType используется для различения пользователей с одинаковыми именами для входа, например, в системе финансов есть пользователь по имени zhangsan, и в платёжной системе также есть пользователь по имени zhangsan
// permissionName — это name, определённое в аннотации @Permission, permissionType — тип разрешения, в настоящее время поддерживаются три типа разрешений: интерфейс (API), шлюз (GATEWAY) и интерфейс (UI) (см. определение класса PermissionType.java)
// serviceName — имя службы, определённое в application.properties как spring.application.name
// Для проверки результата в серверной части реализован распределённый кэш, что позволяет избежать частого обращения к базе данных и возникновения проблем с производительностью
// Пример: у пользователя zhangsan есть разрешение, у пользователя lisi нет разрешения
if (StringUtils.equals (userId, «zhangsan»)) {
вернуть истину;
} иначе, если (StringUtils.equals (userId, «lisi»)) {
вернуть ложь;
}
вернуть истину;
}
}
``` ```
org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.ConfigurableApplicationContext;
import com.nepxion.aquarius.cache.annotation.EnableCache;
import com.nepxion.permission.annotation.EnablePermission;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = { "com.nepxion.permission.api" })
@EnablePermission
@EnableCache
public class MyApplication {
private static final Logger LOG = LoggerFactory.getLogger(MyApplication.class);
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(MyApplication.class, args);
MyController myController = applicationContext.getBean(MyController.class);
try {
LOG.info("Result : {}", myController.doA("zhangsan", "LDAP", "valueA"));
} catch (Exception e) {
LOG.error("Error", e);
}
try {
LOG.info("Result : {}", myController.doB("abcd1234", "valueB"));
} catch (Exception e) {
LOG.error("Error", e);
}
}
}
В RestController добавить @Permission аннотацию для реализации API-функции проверки разрешений:
package com.nepxion.permission.example.service;
/**
* <p>Title: Nepxion Permission</p>
* <p>Description: Nepxion Permission</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.nepxion.permission.annotation.Permission;
import com.nepxion.permission.annotation.Token;
import com.nepxion.permission.annotation.UserId;
import com.nepxion.permission.annotation.UserType;
@RestController
public class MyController {
private static final Logger LOG = LoggerFactory.getLogger(MyController.class);
// Явная проверка разрешений на основе UserId и UserType аннотаций, параметры передаются через аннотации
@RequestMapping(path = "/doA/{userId}/{userType}/{value}", method = RequestMethod.GET)
@Permission(name = "A-Permission", label = "A权限", description = "A权限的描述")
public int doA(@PathVariable(value = "userId") @UserId String userId, @PathVariable(value = "userType") @UserType String userType, @PathVariable(value = "value") String value) {
LOG.info("===== doA被调用");
return 123;
}
// Явная проверка разрешений на основе Token аннотации, параметры передаются через аннотацию
@RequestMapping(path = "/doB/{token}/{value}", method = RequestMethod.GET)
@Permission(name = "B-Permission", label = "B权限", description = "B权限的描述")
public String doB(@PathVariable(value = "token") @Token String token, @PathVariable(value = "value") String value) {
LOG.info("----- doB被调用");
return "abc";
}
// Неявная проверка разрешений на основе Rest запроса, параметры передаются через Header
@RequestMapping(path = "/doC/{value}", method = RequestMethod.GET)
@Permission(name = "C-Permission", label = "C权限", description = "C权限的描述")
public boolean doC(@PathVariable(value = "value") String value) {
LOG.info("----- doC被调用");
return true;
}
}
Конфигурация бизнес-клиента:
# Spring cloud config
spring.application.name=permission-springcloud-my-client-example
server.port=1212
eureka.client.serviceUrl.defaultZone=http://10.0.75.1:9528/eureka/
# Ribbon config
ribbon.ReadTimeout=60000
ribbon.ConnectTimeout=60000
# Permission config
# Разрешение Feign перехвата включено или выключено, без этой строки считается включенным
permission.feign.enabled=true
Вход приложения SpringCloud, необходимо добавить @EnablePermissionFeign аннотацию, чтобы активировать функцию перехвата разрешений Feign (конечно, вы также можете отключить его в файле конфигурации permission.feign.enabled = false), эта аннотация может передавать данные заголовка запроса в бэкэнд бизнес-сервис. Компания: Nepxion
@author Haojun Ren @version 1.0
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import com.nepxion.permission.feign.annotation.EnablePermissionFeign;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnablePermissionFeign
public class MyApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(MyApplication.class).run(args);
}
}
package com.nepxion.permission.example.client;
/**
* <p>Title: Nepxion Permission</p>
* <p>Description: Nepxion Permission</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(value = "permission-springcloud-my-service-example")
public interface MyFeign {
@RequestMapping(path = "/doA/{userId}/{userType}/{value}", method = RequestMethod.GET)
int doA(@PathVariable(value = "userId") String userId, @PathVariable(value = "userType") String userType, @PathVariable(value = "value") String value);
@RequestMapping(path = "/doB/{token}/{value}", method = RequestMethod.GET)
String doB(@PathVariable(value = "token") String token, @PathVariable(value = "value") String value);
@RequestMapping(path = "/doC/{value}", method = RequestMethod.GET)
boolean doC(@PathVariable(value = "value") String value);
}
package com.nepxion.permission.example.client;
/**
* <p>Title: Nepxion Permission</p>
* <p>Description: Nepxion Permission</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Autowired
private MyFeign myFeign;
@RequestMapping(path = "/doA/{userId}/{userType}/{value}", method = RequestMethod.GET)
public int doA(@PathVariable(value = "userId") String userId, @PathVariable(value = "userType") String userType, @PathVariable(value = "value") String value) {
return myFeign.doA(userId, userType, value);
}
@RequestMapping(path = "/doB/{token}/{value}", method = RequestMethod.GET)
public String doB(@PathVariable(value = "token") String token, @PathVariable(value = "value") String value) {
return myFeign.doB(token, value);
}
@RequestMapping(path = "/doC/{value}", method = RequestMethod.GET)
public boolean doC(@PathVariable(value = "value") String value) {
return myFeign.doC(value);
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )