1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/nepxion-Permission

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Nepxion Permission — это микросервисный API-фреймворк на основе Spring Cloud, который использует распределённое кэширование через Redis для хранения прав доступа. Он реализован с использованием Nepxion Matrix AOP и поддерживает как аннотированный, так и REST-вызовы.

Основные возможности:

  • автоматическое сканирование и загрузка прав доступа (можно включить или отключить через конфигурационный файл);
  • проверка прав доступа из распределённого кэша и через вызовы API (можно включить или отключить через конфигурационный файл);
  • поддержка проверки прав доступа по UserId и Token;
  • предоставление интерфейса Feign для взаимодействия с базой данных и кэшем;
  • явная проверка прав доступа на основе аннотаций с передачей параметров через аннотации;
  • неявная проверка прав доступа через REST-запросы с передачей параметров в заголовке запроса.

Для получения имён переменных метода с помощью стандартного отражения необходимо установить параметр компилятора «-parameters» в IDE и Maven.

Nepxion Permission предоставляет простой в использовании AOP-фреймворк, но не является полноценной системой управления правами доступа. Пользователям необходимо самостоятельно реализовать следующие модули:

  • модель базы данных на основе прав доступа, ролей и пользователей (Pojo-классы уже реализованы в permission-entity);
  • пользовательский интерфейс для работы с правами доступа;
  • взаимодействие с другими системами;
  • распределённое кэширование для проверки прав доступа;
  • проверку прав доступа на основе токенов;
  • интеграцию с UI и API GATEWAY.

Версия фреймворка должна соответствовать версии 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;
    }
}

Имитация бизнес-клиента на основе Feign вызова

Конфигурация бизнес-клиента:

# 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);
    }
}

На основе вызова Feign

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 )

Вы можете оставить комментарий после Вход в систему

Введение

**Nepxion Permission** — это система разрешений, основанная на Spring Cloud с использованием фреймворка Nepxion Matrix AOP и Aquarius. Она добавляет контроль разрешений к микросервисным API. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/nepxion-Permission.git
git@api.gitlife.ru:oschina-mirror/nepxion-Permission.git
oschina-mirror
nepxion-Permission
nepxion-Permission
master