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 .
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>
# Schalten Sie die Shiro-Konfiguration ein Der Standardwert ist trueHier 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 ShiroDialectshiro.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(); } }Nach dem Login kopieren
Code-Erklärung:
@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"; } }
#🎜🎜 #
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"); } }
@ControllerAdvice public class ExceptionController { @ExceptionHandler(AuthorizationException.class) public ModelAndView error(AuthorizationException e) { ModelAndView mv = new ModelAndView("unauthorized"); mv.addObject("error", e.getMessage()); return mv; } }
<!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>
<!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>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2>普通用户页面</h2> </body> </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!