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

OSCHINA-MIRROR/XuanYin-data-auth-mybatis

Клонировать/Скачать
README.md 7.9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 13.05.2025 03:12 964d788

плагин для управления правами доступа в MyBatis

Описание

Архитектура программного обеспечения

Описание архитектуры программного обеспечения

spring-boot-starter mybatis

Основная задача заключается в том, чтобы не требовать явного внедрения объектов для проверки прав доступа, таких как User, в каждый интерфейс Dao. Достаточно добавить аннотацию @AuthData к интерфейсу Mapper, чтобы можно было указать выражение для получения параметров User в файле mapper.xml.

Внимание: этот плагин не предотвращает внедрение SQL, поэтому следует избегать прямого использования внешних переданных значений. (На самом деле, права доступа обычно не зависят от внешней информации)

Способ использования#### Пример кода находится в самом низу

1. Скачайте проект, соберите его в jar-файл или скачайте jar-файл напрямую

2. Включите в spring-boot

3. Реализуйте интерфейс IAuthData и зарегистрируйте его в контейнере Spring, где getAuthType() является именем группы, а getDataAuth() — методом получения данных для управления правами доступа

4. В интерфейсах Dao добавьте аннотацию @AuthData, можно передать массив имен групп, если не передать, то будут вызваны методы getDataAuth() всех зарегистрированных IAuthData

5. В соответствующих тегах SQL добавьте выражения управления правами доступа:

Например:
getDataAuth() возвращает: 
    { "userType": 1 , "orgList": [ "001" , "002" ] , "areaCode" : 1001 , "bol": true }

В SQL напишите: 
    #(userType == 1)[ AND org_id IN @{orgList} ]
    
В итоге будет распознано как: 
    AND org_id IN ("001","002")

#[ AND status = @{bol} ] распознается как AND status = 1

Правила

Теги начинаются с #, за которым следует "()" или "[]"
"()" похожи на тег if, содержимое — выражение OGNL, конечный результат должен быть типа boolean; можно опустить, тогда считается действительным
"[]" могут содержать любое содержимое, включая @{} для получения значений
@{} — выражение OGNL, результат поддерживает базовые типы, String, коллекции; boolean преобразуется в 1 и 0, коллекции преобразуются в (value1,value2....)

Выражение OGNL — это то, что используется в mybatis, if-test#### Основной процесс выполнения

1. Выполнение интерфейса Dao в MyBatis
2. Триггерирование перехватчика MyBatis "com.xuanyue.mybatisplug.plug.DataAuthPlug.intercept()"
3. Выполнение DataAuthHandler.parseSql() для анализа и интерпретации
4. Проверка, является ли интерфейс наследником @AuthData, если нет, то SQL не анализируется и возвращается исходное SQL
5. Если интерфейс наследуется от @AuthData, из контекста Spring получается реализация IAuthData, указанная в аннотации, и вызывается getDataAuth() для получения объекта управления правами доступа
6. Используя полученные данные управления правами доступа, SQL анализируется и возвращается распознанное SQL
7. Возвращение к обычному процессу выполнения MyBatis
Пример кода:

    /**
     * Реализация IAuthData
     * Сначала реализуем интерфейс для получения объекта авторизации
     */
    @Component
    public class AuthDataDemo implements IAuthData {

        /* Возвращает имя типа авторизации, используемое для определения области данных авторизации */
        @Override
        public String getAuthType() {
            return "demoAuthData";
        }

        /* Возвращает реальные данные */
        @Override
        public Map<String, Object> getDataAuth() {

            Map<String, Object> result = new HashMap<>();
            result.put("name", "甲");
            result.put("age", 32);

            List<String> hobbys = new LinkedList<>();
            hobbys.add("看码云");
            hobbys.add("看马云");

            result.put("hobbys", hobbys);
            result.put("isBoy", true);
            result.put("invalid", false);
```            return result;
        }
    }

    /**
     * Интерфейс Mapper
     */
    @Mapper
    public interface DemoMapper {

        /**
         * Обратите внимание, здесь нет передаваемых параметров
         * Также можно не указывать параметры для @AuthData
         * В этом случае будет вызван метод getDataAuth() для всех зарегистрированных в контейнере Spring IAuthData
         * Если есть только один реализующий класс, то не указывать параметры будет удобнее
         */
        @AuthData({"demoAuthData"})
        public String DemoQuery();

    }

    <!-- Это файл DemoMapper.xml -->
    <select id="DemoQuery" resultType="String">

        SELECT 
            "возвращаемое значение" 
        FROM 
            dual
        WHERE
            1 = 1

        #( name != null and name.length() > 0 )
        [ AND "乙" = @{ name } ]

        <!-- Здесь нет круглых скобок "()", по умолчанию считается успешным -->
        #[ AND 32 = @{ age } ]

        <!-- Списковые типы раскрываются автоматически, сохранение вручную IN используется для удобства чтения -->
        #( hobbys != null and hobbys.size() > 0 )
        [ AND "看码云" IN @{ hobbys } ]

        <!-- Логические типы автоматически преобразуются в 0 и 1 -->
        #( isBoy )
        [ AND 1 = @{ isBoy } ]

        <!-- Значение invalid равно false, эта строка не будет отрендерена -->
        #( invalid )
        [ AND 1 = 2 ]

    </select>
===========================================================
Итоговый SQL:
        SELECT 
            "возвращаемое значение" 
        FROM 
            dual
        WHERE
            1 = 1
        AND "乙" = "甲"
        AND 32 = 32
        AND "看码云" IN ( "看码云", "看马云" )
        AND 1 = 1

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/XuanYin-data-auth-mybatis.git
git@api.gitlife.ru:oschina-mirror/XuanYin-data-auth-mybatis.git
oschina-mirror
XuanYin-data-auth-mybatis
XuanYin-data-auth-mybatis
master