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

OSCHINA-MIRROR/lexapps-shiro-frame

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

Этот фреймворк лучше всего подходит для проектов с разделением на фронтэнд и бэкэнд и с распределённым сеансовым обменом данными о правах доступа

Tip: Это общий шаблонный фреймворк, который можно использовать как с разделёнными фронтендом и бэкендом, так и без разделения. Даже если проект не распределённый, его всё равно можно применять, но в этом нет необходимости.

2019/02/27 Обновление: Переписан способ перехода при отсутствии авторизации или входе

Подробнее см. step5

Используемые основные компоненты фреймворка: springboot + mybatis-plus + shiro + redis

Описание фреймворка

  1. Данный проект представляет собой многомодульный проект с модулем безопасности (shiro-core, ссылка внизу), который необходимо импортировать только при использовании фреймворка безопасности (скопировать). В противном случае появится ошибка «нереализованный класс» (уже @Autowired). При необходимости можно напрямую скопировать модуль безопасности или импортировать зависимость shiro-core. Однако следует отметить, что пакет springbootApplication должен быть просканирован. Во-вторых, companyPropertis считывается из файла конфигурации, и его нельзя пропустить. Если вы копируете, вы можете напрямую изменить префикс. Импортированные зависимости должны быть переустановлены перед повторным импортом.

То есть общая структура фреймворка уже создана, и большая часть конфигурации входа почти завершена. Каждому веб-приложению или приложению нужно только настроить конфигурацию перехвата входа (обязательно) и реализацию userDetailServiceImpl (обязательно), которая соответствует методу в файле конфигурации. Фреймворк уже добавил журнал, чтобы можно было наглядно увидеть, как это работает. Конкретные шаги см. в операции 0.

Каждый раз, когда вы используете модуль безопасности, вам необходимо реализовать класс. В настоящее время существуют следующие методы входа:

  • Форма входа: имя пользователя — form:company:linenxi, пароль — 123456. Это означает, что имя пользователя linenxi, а пароль — 123456;
  • Вход с помощью проверочного кода: имя пользователя — mobile:company:13587872968, пароль — 9876. Это означает, что номер телефона — 13587872968, проверочный код — 9876;
  • Социальный вход: имя пользователя — social:company:abcdefg, пароль — openId:company:wx. Это означает, что имя пользователя — abcdefg, метод входа — wx через openId (также может быть unionId, qq-вход, тогда wx заменяется на qq).

1. Предыстория

В базовой структуре shiro с неразделёнными фронтендом и бэкэндом браузер будет хранить sessionId в cookie при каждом запросе к серверу. Таким образом, сеанс сохраняется.

2. Производное

В архитектуре с разделённым фронтендом и бэкэндом HTTP-запросы являются безсостоятельными. Обычно они не используют файлы cookie для хранения sessionId, а используют токены в заголовках запросов. Токены содержат sessionId для сохранения сеанса.

3. Окончательно

На основе распределённой архитектуры совместное использование сеансов является основной трудностью. Один из способов — совместное использование сеансов в tomcat, но это требует ресурсов. Другой способ — сохранить сеанс в redis. Независимо от того, сколько серверов используется, сначала получите доступ к redis. Наконец, сохраните сеанс.

3.1 Совет: Поскольку сеанс больше не хранится на сервере, необходимо переписать метод получения сеанса. После анализа исходного кода выясняется, что SessionDAO — это класс, который получает сеанс. Поэтому необходимо переписать этот класс.

Шаги операции

Операция 0: ShiroConfig реализует необходимые настройки перехвата и точки входа при неудачном входе

@Slf4j
public class APPShiroConfig {
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, String> filterMap = new LinkedHashMap();
        filterMap.put("111111111111111111111/shiro/mp/login", "anon");
        filterMap.put("22222222222222222222/**", "authc");
        log.info("Текущий режим блокировки системы: {}", filterMap);
        shiroFilterFactoryBean.setUnauthorizedUrl("33333333333/admin/page/noAuth");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        shiroFilterFactoryBean.setLoginUrl("4444444444444444444/shiro/mp/nologinCode");
        return shiroFilterFactoryBean;
    }
}

Операция 0: Обязательные классы реализации поиска пользователей. Для входа с использованием формы требуется имя пользователя, для входа с проверочным кодом — из redis, для социального входа — из социальной таблицы. Необходимо только реализовать интерфейс ShiroUserDetailService, и весь фреймворк будет завершён.

@Slf4j
public class ShiroUserDetailServiceImpl implements ShiroUserDetailService {
    @Autowired
    private CompanyProperties companyProperties;
    @Autowired
    private MpUserInfoMapper mpUserInfoMapper;
    @Autowired
    private MpSocialInfoMapper mpSocialInfoMapper;
    @Autowired
    private MpShiroPermsInfoMapper mpShiroPermsInfoMapper;

    @Override
    public ShiroUserDetail getByMobile(String mobile) throws AuthenticationException {
        MpUserInfo mpUserInfo = mpUserInfoMapper.selectOne(new QueryWrapper<MpUserInfo>().eq("mobile", mobile));
        if (PublicUtil.isEmpty(mpUserInfo)) {
            log.error("Не удалось найти пользователя, связанного с этим номером мобильного телефона: mobile=[ {} ]", mobile);
            throw new AccountException("Не удалось найти пользователя, соответствующего этому номеру мобильного телефона");
        }
        return this.filling(mpUserInfo);
    }

    @Override
    public ShiroUserDetail getByUserName(String username) throws AuthenticationException {
        MpUserInfo mpUserInfo = mpUserInfoMapper.selectOne(new QueryWrapper<MpUserInfo>().eq("username", username));
        if (PublicUtil.isEmpty(mpUserInfo)) {
            log.error("Не удалось найти пользователя с указанным именем пользователя: username=[ {} ]", username);
            throw new AccountException("Не удалось найти пользователя с указанным именем пользователя");
        }
        return this.filling(mpUserInfo);
    }

    @Override
    public ShiroUserDetail getBySocialProvider(String itemId, String socialProviderId) throws
``` Subject subject = getSubject(request, response);
    if (subject.getPrincipal() == null) {
        log.error("Данный пользователь при доступе к ресурсам, защищенным ролями, не вошел в систему.");
        // Не вошёл в систему
        ShiroURLFunction.saveRequestAndRedirectToLogin(request, response);
    } else {
        HttpServletRequest httpServletRequest= (HttpServletRequest) request;
        log.error("Пользователь: [ {} ] не имеет доступа к данному ресурсу роли [ {} ]",ShiroUtils.getUser().getUsername(),httpServletRequest.getRequestURI());
        ShiroThreadLocalMap.put("noAuthError", new StringBuilder().append("Пользователь: [ ")
                .append(ShiroUtils.getUser().getUsername()).append(" ]")
                .append("не имеет доступа к данному ресурсу роли [ ").append(httpServletRequest.getRequestURI()).append(" ]"));
        ShiroURLFunction.saveRequestAndRedirectToNoAuth(request, response);
    }
    return false;
}

Комментарии ( 0 )

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

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления (1)

все

Участники

все

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

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