Heim  >  Artikel  >  Java  >  So verwenden Sie das Shiro-Framework des SpringBoot-Sicherheitsmanagements

So verwenden Sie das Shiro-Framework des SpringBoot-Sicherheitsmanagements

PHPz
PHPznach vorne
2023-05-10 17:49:061318Durchsuche

Shiro-Einführung

Apache Shiro ist ein leichtes Open-Source-Java-Sicherheitsframework, das Authentifizierungs-, Autorisierungs-, Passwortverwaltungs- und Sitzungsverwaltungsfunktionen bietet. Im Vergleich zu Spring Security ist das Shiro-Framework intuitiver und benutzerfreundlicher und bietet gleichzeitig robuste Sicherheit.

Im traditionellen SSM-Framework gibt es noch viele Konfigurationsschritte für die manuelle Integration von Shiro. Für Spring Boot stellt Shiro offiziell shiro-spring-boot-web-starter zur Verfügung, um die Konfiguration von Shiro in Spring Boot zu vereinfachen .

Shiro integrieren

1 Erstellen Sie ein Projekt

Erstellen Sie zunächst ein normales Spring Boot-Webprojekt, fügen Sie Shiro-Abhängigkeiten und Seitenvorlagenabhängigkeiten hinzu#🎜🎜 #

<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-spring-boot-web-starter</artifactId>
  <version>1.4.0</version>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
  <groupId>com.github.theborakompanioni</groupId>
  <artifactId>thymeleaf-extras-shiro</artifactId>
  <version>2.0.0</version>
</dependency>

Hier muss keine Spring-Boot-Starter-Web-Abhängigkeit hinzugefügt werden, Shiro-Spring-Boot-Web-Starter hängt bereits von Spring-Boot-Starter-Web ab. Gleichzeitig wird hier die Thymeleaf-Vorlage verwendet. Um den Shiro-Tag in Thymeleaf verwenden zu können, wird die Abhängigkeit thymeleaf-extras-shiro hinzugefügt.

2. Shiro-Grundkonfiguration

Konfigurieren Sie die grundlegenden Informationen von Shiro in application.properties

# Schalten Sie die Shiro-Konfiguration ein Der Standardwert ist true

shiro.enabled=true
# Shiro Web-Konfiguration aktivieren, der Standardwert ist true
shiro.web.enabled=true
# Konfigurieren Sie die Anmeldeadresse, der Standardwert ist /login.jsp# 🎜🎜#shiro.loginUrl=/login
# Konfigurieren Sie die Adresse für eine erfolgreiche Anmeldung. Der Standardwert ist /
shiro.successUrl=/index
# Nicht autorisierte Standard-Sprungadresse # 🎜🎜#shiro .unauthorizedUrl=/unauthorized
# Ob die Sitzungsverfolgung über URL-Parameter zugelassen werden soll, Sie können diese Option deaktivieren true
# Gibt an, ob die Sitzungsverfolgung über Cookies implementiert werden soll. Der Standardwert ist true
shiro.sessionManager.sessionIdCookieEnabled=true


Konfigurieren Sie dann Shiro im Java-Code und stellen Sie ihn bereit die beiden grundlegendsten Beans# 🎜🎜#

@Configuration
public class ShiroConfig {
    @Bean
    public Realm realm() {
        TextConfigurationRealm realm = new TextConfigurationRealm();
        realm.setUserDefinitions("sang=123,user\n admin=123,admin");
        realm.setRoleDefinitions("admin=read,write\n user=read");
        return realm;
    }
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition =
                new DefaultShiroFilterChainDefinition();
        chainDefinition.addPathDefinition("/login", "anon");
        chainDefinition.addPathDefinition("/doLogin", "anon");
        chainDefinition.addPathDefinition("/logout", "logout");
        chainDefinition.addPathDefinition("/**", "authc");
        return chainDefinition;
    }
    @Bean
    public ShiroDialect shiroDialect() {
        return new ShiroDialect();
    }
}

Code-Erklärung:

Hier werden zwei Schlüssel-Beans bereitgestellt, eine ist Realm und die andere ist ShiroFilterChainDefinition. ShiroDialect soll die Verwendung von Shiro-Tags in Thymeleaf unterstützen. Wenn Sie in Thymeleaf keine Shiro-Tags verwenden, kann ShiroDialect

  • Realm ein benutzerdefinierter Realm sein Es kann auch von Shiro bereitgestellt werden. Der Einfachheit halber ist hier keine Datenbankverbindung konfiguriert: sang/123 und admin/123, entsprechend den Rollen user und admin.

  • ShiroFilterChainDefinition Bean ist mit den grundlegenden Filterregeln „/login“ und „/doLogin“ konfiguriert, auf die anonym zugegriffen werden kann, und „/logout“ ist eine Abmeldeanforderung . Alle anderen Anfragen erfordern eine Authentifizierung, bevor sie auf

  • zugreifen können. Konfigurieren Sie dann die Anmeldeschnittstelle und die Seitenzugriffsschnittstelle

    @Controller
    public class UserController {
        @PostMapping("/doLogin")
        public String doLogin(String username, String password, Model model) {
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            Subject subject = SecurityUtils.getSubject();
            try {
                subject.login(token);
            } catch (AuthenticationException e) {
                model.addAttribute("error", "用户名或密码输入错误!");
                return "login";
            }
            return "redirect:/index";
        }
        @RequiresRoles("admin")
        @GetMapping("/admin")
        public String admin() {
            return "admin";
        }
        @RequiresRoles(value = {"admin", "user"}, logical = Logical.OR)
        @GetMapping("/user")
        public String user() {
            return "user";
        }
    }

    Code-Erklärung: #🎜🎜 ## 🎜🎜#
Erstellen Sie in der doLogin-Methode zunächst eine UsernamePasswordToken-Instanz, rufen Sie dann ein Subject-Objekt ab und rufen Sie die Anmeldemethode im Objekt auf, um den Anmeldevorgang auszuführen Wenn die Ausnahme ausgelöst wird, bedeutet dies, dass die Anmeldung fehlgeschlagen ist. Wenn die Anmeldung erfolgreich ist, wird sie nach „/index“ /admin“ und „/user“ umgeleitet Für den Zugriff auf die Schnittstelle „/admin“ benötigen Sie die Administratorrolle. Für den Zugriff auf die Schnittstelle „/user“ benötigen Sie entweder die Administratorrolle oder die Benutzerrolle

#🎜🎜 #

Für andere Schnittstellen, auf die ohne Rolle zugegriffen werden kann, können Sie diese direkt in WebMvc konfigurieren

@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/index").setViewName("index");
        registry.addViewController("/unauthorized").setViewName("unauthorized");
    }
}
    Als nächstes erstellen Sie einen globalen Ausnahmehandler für die globale Ausnahmebehandlung, hier hauptsächlich zur Behandlung von Autorisierungsausnahmen# 🎜🎜#
    @ControllerAdvice
    public class ExceptionController {
        @ExceptionHandler(AuthorizationException.class)
        public ModelAndView error(AuthorizationException e) {
            ModelAndView mv = new ModelAndView("unauthorized");
            mv.addObject("error", e.getMessage());
            return mv;
        }
    }
  • Wenn der Benutzer auf nicht autorisierte Ressourcen zugreift, springt er zur nicht autorisierten Ansicht und zeigt eine Fehlermeldung an.

    Nachdem die Konfiguration abgeschlossen ist, erstellen Sie abschließend 5 HTML-Seiten im Verzeichnis resources/templates zum Testen.
  • (1)index.html

    <!DOCTYPE html>
    <html lang="en" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h4>Hello, <shiro:principal/></h4>
    <h4><a href="/logout" rel="external nofollow" >注销登录</a></h4>
    <h4><a shiro:hasRole="admin" href="/admin" rel="external nofollow" >管理员页面</a></h4>
    <h4><a shiro:hasAnyRoles="admin,user" href="/user" rel="external nofollow" >普通用户页面</a></h4>
    </body>
    </html>

    (2)login.html
  • <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div>
        <form action="/doLogin" method="post">
            <input type="text" name="username"><br>
            <input type="password" name="password"><br>
            <div th:text="${error}"></div>
            <input type="submit" value="登录">
        </form>
    </div>
    </body>
    </html>
(3)user.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>普通用户页面</h2>
</body>
</html>
# 🎜🎜#(4)admin.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>管理员页面</h2>
</body>
</html>

(5)unauthorized.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <h4>未获授权,非法访问</h4>
    <h4 th:text="${error}"></h4>
</div>
</body>
</html>

3. Testen Sie

Starten Sie das Projekt und besuchen Sie das Anmeldeseite, verwenden Sie sang/123, um sich anzumelden einen Hyperlink zur Administratorseite haben.

Dann melden Sie sich mit admin/123 an.

Wenn der Benutzer sich mit sang anmeldet und dann auf http://localhost:8080/admin zugreift, wird zur nicht autorisierten Seite gesprungen# 🎜🎜 #

Das obige ist der detaillierte Inhalt vonSo verwenden Sie das Shiro-Framework des SpringBoot-Sicherheitsmanagements. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen