Spring Boot интегрирует Shiro, и все эти два метода суммированы!

Spring Boot
Spring Boot интегрирует Shiro, и все эти два метода суммированы!

Для управления разрешениями в Spring Boot, вообще говоря, основным решением является Spring Security, но с технической точки зрения можно использовать и Shiro.

Сегодня Brother Song расскажет вам об интеграции Shiro со Spring Boot!

В целом Spring Security и Shiro сравниваются следующим образом:

  1. Spring Security — это мощная среда управления безопасностью; Shiro — облегченная среда управления безопасностью.
  2. У Spring Security сложная концепция и сложная конфигурация; у Shiro простая концепция и простая конфигурация.
  3. Spring Security мощный; Shiro простой
  4. ...

Хотя Shiro имеет простые функции, он также может соответствовать большинству бизнес-сценариев. Так что в традиционные проекты SSM вообще можно интегрировать Shiro.

В Spring Boot, поскольку Spring Boot официально предоставляет большое количество очень удобных готовых Starters, конечно, Spring Security Starters также предоставляется, что упрощает использование Spring Security в Spring Boot, даже просто добавляя Dependencies может защитить все интерфейсы, поэтому, если это проект Spring Boot, обычно выбирается Spring Security.

Это всего лишь предполагаемая комбинация, с чисто технической точки зрения, как бы она ни комбинировалась, проблем нет.

Существует два разных варианта интеграции Shiro в Spring Boot:

  1. Первый — оставить его нетронутым и переписать конфигурацию SSM, чтобы интегрировать Shiro в Java.
  2. Второй — использовать стартер, официально предоставленный Широ для настройки, но этот стартер не сильно упрощает настройку.

нативная интеграция

  • Создать проект

Чтобы создать проект Spring Boot, просто добавьте веб-зависимости:

После успешного создания проекта добавьте связанные с Shiro зависимости.Зависимости в полном файле pom.xml выглядят следующим образом:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-web</artifactId>
        <version>1.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.4.0</version>
    </dependency>
</dependencies>
  • Создать мир

Далее давайте настроим основной компонент Realm:

public class MyRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        if (!"javaboy".equals(username)) {
            throw new UnknownAccountException("账户不存在!");
        }
        return new SimpleAuthenticationInfo(username, "123", getName());
    }
}

Простую операцию аутентификации можно реализовать в Realm без авторизации, конкретный способ написания авторизации такой же, как и у Широ в SSM, поэтому не буду вдаваться в подробности. Аутентификация здесь означает, что имя пользователя должно быть javaboy, а пароль пользователя должен быть 123, если эти условия соблюдены, вы можете успешно войти в систему!

  • Настроить Широ

Далее настройте Широ:

@Configuration
public class ShiroConfig {
    @Bean
    MyRealm myRealm() {
        return new MyRealm();
    }
    
    @Bean
    SecurityManager securityManager() {
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(myRealm());
        return manager;
    }
    
    @Bean
    ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(securityManager());
        bean.setLoginUrl("/login");
        bean.setSuccessUrl("/index");
        bean.setUnauthorizedUrl("/unauthorizedurl");
        Map<String, String> map = new LinkedHashMap<>();
        map.put("/doLogin", "anon");
        map.put("/**", "authc");
        bean.setFilterChainDefinitionMap(map);
        return bean;
    }
}

Конфигурация Широ здесь в основном настраивает 3 компонента:

  1. Сначала вам нужно предоставить экземпляр Realm.
  2. Необходимо настроить SecurityManager, а Realm настроить в SecurityManager.
  3. Настройте ShiroFilterFactoryBean и укажите правила перехвата пути в ShiroFilterFactoryBean.
  4. Настройте интерфейсы входа и тестирования.

Среди них конфигурация ShiroFilterFactoryBean немного больше, и смыслы конфигурации следующие:

  • setSecurityManager указывает на указанный SecurityManager.
  • setLoginUrl указывает указанную страницу входа.
  • setSuccessUrl указывает указанную страницу успешного входа в систему.
  • Правила перехвата пути настраиваются в следующей карте, обратите внимание, что она должна быть по порядку.

После того, как все это настроено, следующим шагом будет настройка контроллера входа в систему:

@RestController
public class LoginController {
    @PostMapping("/doLogin")
    public void doLogin(String username, String password) {
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(new UsernamePasswordToken(username, password));
            System.out.println("登录成功!");
        } catch (AuthenticationException e) {
            e.printStackTrace();
            System.out.println("登录失败!");
        }
    }
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
    @GetMapping("/login")
    public String  login() {
        return "please login!";
    }
}

При тестировании сначала получите доступ к интерфейсу /hello, поскольку вы не вошли в систему, он автоматически перейдет к интерфейсу /login:

Затем вызовите интерфейс /doLogin для завершения входа:

Снова получите доступ к интерфейсу /hello, и вы сможете успешно получить к нему доступ:

Использование Широ Стартера

Вышеупомянутый метод настройки фактически эквивалентен использованию XML-конфигурации в SSM и переписыванию ее с помощью Java-кода в Spring Boot.В дополнение к этому методу мы также можем напрямую использовать Starter, предоставленный Shiro.

  • Создайте проект, как указано выше.

После успешного создания добавьтеshiro-spring-boot-web-starter, эта зависимость может заменить предыдущуюshiro-webиshiro-springДве зависимости, файл pom.xml выглядит следующим образом:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-web-starter</artifactId>
        <version>1.4.0</version>
    </dependency>
</dependencies>
  • Создать мир

Царство здесь такое же, как и предыдущее, так что повторяться не буду.

  • Настройка базовой информации Широ

Далее настройте базовую информацию Широ в application.properties:

shiro.sessionManager.sessionIdCookieEnabled=true
shiro.sessionManager.sessionIdUrlRewritingEnabled=true
shiro.unauthorizedUrl=/unauthorizedurl
shiro.web.enabled=true
shiro.successUrl=/index
shiro.loginUrl=/login

Объяснение конфигурации:

  1. Первая строка указывает, разрешать ли размещение идентификатора sessionId в файле cookie.
  2. Вторая строка указывает, разрешать ли размещение sessionId в блоке URL.
  3. Третья строка указывает путь перехода по умолчанию при доступе к неавторизованной странице.
  4. Четвертая строчка означает включение широ
  5. Пятая строка представляет собой страницу перехода для успешного входа в систему.
  6. Шестая строка представляет собой страницу входа
  • Настроить ШироКонфиг
@Configuration
public class ShiroConfig {
    @Bean
    MyRealm myRealm() {
        return new MyRealm();
    }
    @Bean
    DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(myRealm());
        return manager;
    }
    @Bean
    ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();
        definition.addPathDefinition("/doLogin", "anon");
        definition.addPathDefinition("/**", "authc");
        return definition;
    }
}

Конфигурация здесь аналогична предыдущей, но экземпляр ShiroFilterFactoryBean больше не нужен, вместо этого есть ShiroFilterChainDefinition, где вы можете определить правила сопоставления путей Shiro.

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

Суммировать

В этой статье представлены два способа интеграции Spring Boot с Широ: один — это традиционная версия Java, а другой — Starter, предоставленный официальным лицом Широ, два способа, я не знаю, нужно ли вам учиться?

Случай с этой статьей, я загрузил ее на GitHub, приветствую всех в звездах:GitHub.com/Len VE/Java не…

Если у вас есть какие-либо вопросы по этой статье, пожалуйста, оставьте сообщение для обсуждения.

Обратите внимание на общедоступную учетную запись [Jiangnan A Little Rain], сосредоточьтесь на технологиях с полным стеком, таких как Spring Boot + микросервисы и разделение интерфейса и сервера, делитесь регулярными видеоуроками, отвечайте на Java после того, как уделите внимание, и получайте Сухие товары Java тщательно приготовлены Songge для вас!