Tip: Это общий шаблонный фреймворк, который можно использовать как с разделёнными фронтендом и бэкендом, так и без разделения. Даже если проект не распределённый, его всё равно можно применять, но в этом нет необходимости.
Подробнее см. step5
То есть общая структура фреймворка уже создана, и большая часть конфигурации входа почти завершена. Каждому веб-приложению или приложению нужно только настроить конфигурацию перехвата входа (обязательно) и реализацию userDetailServiceImpl (обязательно), которая соответствует методу в файле конфигурации. Фреймворк уже добавил журнал, чтобы можно было наглядно увидеть, как это работает. Конкретные шаги см. в операции 0.
В базовой структуре shiro с неразделёнными фронтендом и бэкэндом браузер будет хранить sessionId в cookie при каждом запросе к серверу. Таким образом, сеанс сохраняется.
В архитектуре с разделённым фронтендом и бэкэндом HTTP-запросы являются безсостоятельными. Обычно они не используют файлы cookie для хранения sessionId, а используют токены в заголовках запросов. Токены содержат sessionId для сохранения сеанса.
На основе распределённой архитектуры совместное использование сеансов является основной трудностью. Один из способов — совместное использование сеансов в tomcat, но это требует ресурсов. Другой способ — сохранить сеанс в redis. Независимо от того, сколько серверов используется, сначала получите доступ к redis. Наконец, сохраните сеанс.
3.1 Совет: Поскольку сеанс больше не хранится на сервере, необходимо переписать метод получения сеанса. После анализа исходного кода выясняется, что SessionDAO — это класс, который получает сеанс. Поэтому необходимо переписать этот класс.
@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;
}
}
@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 )