From fb6c5fb37f722f5bdc40a3f64e3077a89c832802 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Wed, 18 Dec 2019 21:08:31 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20security=20?=
=?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
lab-33/lab-33-shiro-demo/pom.xml | 30 ++++++++
.../lab01/shirodemo/Application.java | 13 ++++
.../lab01/shirodemo/config/ShiroConfig.java | 59 +++++++++++++++
.../shirodemo/controller/DemoController.java | 36 ++++++++++
.../controller/SecurityController.java | 71 +++++++++++++++++++
.../shirodemo/controller/TestController.java | 31 ++++++++
.../src/main/resources/static/login.html | 14 ++++
lab-33/pom.xml | 19 +++++
pom.xml | 1 +
9 files changed, 274 insertions(+)
create mode 100644 lab-33/lab-33-shiro-demo/pom.xml
create mode 100644 lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/Application.java
create mode 100644 lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/config/ShiroConfig.java
create mode 100644 lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/DemoController.java
create mode 100644 lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/SecurityController.java
create mode 100644 lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/TestController.java
create mode 100644 lab-33/lab-33-shiro-demo/src/main/resources/static/login.html
create mode 100644 lab-33/pom.xml
diff --git a/lab-33/lab-33-shiro-demo/pom.xml b/lab-33/lab-33-shiro-demo/pom.xml
new file mode 100644
index 00000000..9e923e46
--- /dev/null
+++ b/lab-33/lab-33-shiro-demo/pom.xml
@@ -0,0 +1,30 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.10.RELEASE
+
+
+ 4.0.0
+
+ lab-33-shiro-demo
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.apache.shiro
+ shiro-spring-boot-starter
+ 1.4.2
+
+
+
+
diff --git a/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/Application.java b/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/Application.java
new file mode 100644
index 00000000..1b3e017c
--- /dev/null
+++ b/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/Application.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab01.shirodemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/config/ShiroConfig.java b/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/config/ShiroConfig.java
new file mode 100644
index 00000000..42cd152e
--- /dev/null
+++ b/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/config/ShiroConfig.java
@@ -0,0 +1,59 @@
+package cn.iocoder.springboot.lab01.shirodemo.config;
+
+import org.apache.shiro.realm.Realm;
+import org.apache.shiro.realm.SimpleAccountRealm;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Configuration
+public class ShiroConfig {
+
+ @Bean
+ public Realm realm() {
+ SimpleAccountRealm realm = new SimpleAccountRealm();
+ realm.addAccount("admin", "admin", "ADMIN");
+ return realm;
+ }
+
+ @Bean
+ public DefaultWebSecurityManager securityManager() {
+ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+ securityManager.setRealm(this.realm());
+ return securityManager;
+ }
+
+ @Bean
+ public ShiroFilterFactoryBean shiroFilterFactoryBean() {
+ // 创建 ShiroFilterFactoryBean 对象,用于创建 ShiroFilter 过滤器
+ ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
+
+ // 设置 SecurityManager
+ filterFactoryBean.setSecurityManager(this.securityManager());
+
+ // 设置 URL 们
+ filterFactoryBean.setLoginUrl("/login"); // 登陆 URL
+ filterFactoryBean.setSuccessUrl("/login_success"); // 登陆成功 URL
+ filterFactoryBean.setUnauthorizedUrl("/unauthorized"); // 无权限 URL
+
+ // 设置 URL 的权限配置
+ filterFactoryBean.setFilterChainDefinitionMap(this.filterChainDefinitionMap());
+
+ return filterFactoryBean;
+ }
+
+ private Map filterChainDefinitionMap() {
+ Map filterMap = new LinkedHashMap<>(); // 注意要使用有序的 LinkedHashMap ,顺序匹配
+ filterMap.put("/test/echo", "anon"); // 允许匿名访问
+ filterMap.put("/test/admin", "roles[ADMIN]"); // 需要 ADMIN 角色
+ filterMap.put("/test/normal", "roles[NORMAL]"); // 需要 NORMAL 角色
+ filterMap.put("/logout", "logout"); // 退出
+ filterMap.put("/**", "authc"); // 默认剩余的 URL ,需要经过认证
+ return filterMap;
+ }
+
+}
diff --git a/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/DemoController.java b/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/DemoController.java
new file mode 100644
index 00000000..f581a03e
--- /dev/null
+++ b/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/DemoController.java
@@ -0,0 +1,36 @@
+package cn.iocoder.springboot.lab01.shirodemo.controller;
+
+import org.apache.shiro.authz.annotation.RequiresGuest;
+import org.apache.shiro.authz.annotation.RequiresRoles;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @RequiresGuest
+ @GetMapping("/echo")
+ public String demo() {
+ return "示例返回";
+ }
+
+ @GetMapping("/home")
+ public String home() {
+ return "我是首页";
+ }
+
+ @RequiresRoles("ADMIN")
+ @GetMapping("/admin")
+ public String admin() {
+ return "我是管理员";
+ }
+
+ @RequiresRoles("NORMAL")
+ @GetMapping("/normal")
+ public String normal() {
+ return "我是普通用户";
+ }
+
+}
diff --git a/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/SecurityController.java b/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/SecurityController.java
new file mode 100644
index 00000000..de1f36fb
--- /dev/null
+++ b/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/SecurityController.java
@@ -0,0 +1,71 @@
+package cn.iocoder.springboot.lab01.shirodemo.controller;
+
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.ExpiredCredentialsException;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.LockedAccountException;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Controller
+@RequestMapping("/")
+public class SecurityController {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @GetMapping("/login")
+ public String loginPage() {
+ return "login.html";
+ }
+
+ @ResponseBody
+ @PostMapping("/login")
+ public String login(HttpServletRequest request) {
+ // 判断是否已经登陆
+ Subject subject = SecurityUtils.getSubject();
+ if (subject.getPrincipal() != null) {
+ return "你已经登陆账号:" + subject.getPrincipal();
+ }
+
+ // 获得登陆失败的原因
+ String shiroLoginFailure = (String) request.getAttribute(FormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME);
+ // 翻译成人类看的懂的提示
+ String msg = "";
+ if (UnknownAccountException.class.getName().equals(shiroLoginFailure)) {
+ msg = "账号不存在";
+ } else if (IncorrectCredentialsException.class.getName().equals(shiroLoginFailure)) {
+ msg = "密码不正确";
+ } else if (LockedAccountException.class.getName().equals(shiroLoginFailure)) {
+ msg = "账号被锁定";
+ } else if (ExpiredCredentialsException.class.getName().equals(shiroLoginFailure)) {
+ msg = "账号已过期";
+ } else {
+ msg = "未知";
+ logger.error("[login][未知登陆错误:{}]", shiroLoginFailure);
+ }
+ return "登陆失败,原因:" + msg;
+ }
+
+ @ResponseBody
+ @GetMapping("/login_success")
+ public String loginSuccess() {
+ return "登陆成功";
+ }
+
+ @ResponseBody
+ @GetMapping("/unauthorized")
+ public String unauthorized() {
+ return "你没有权限";
+ }
+
+}
diff --git a/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/TestController.java b/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/TestController.java
new file mode 100644
index 00000000..3671a0e4
--- /dev/null
+++ b/lab-33/lab-33-shiro-demo/src/main/java/cn/iocoder/springboot/lab01/shirodemo/controller/TestController.java
@@ -0,0 +1,31 @@
+package cn.iocoder.springboot.lab01.shirodemo.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/test")
+public class TestController {
+
+ @GetMapping("/demo")
+ public String demo() {
+ return "示例返回";
+ }
+
+ @GetMapping("/home")
+ public String home() {
+ return "我是首页";
+ }
+
+ @GetMapping("/admin")
+ public String admin() {
+ return "我是管理员";
+ }
+
+ @GetMapping("/normal")
+ public String normal() {
+ return "我是普通用户";
+ }
+
+}
diff --git a/lab-33/lab-33-shiro-demo/src/main/resources/static/login.html b/lab-33/lab-33-shiro-demo/src/main/resources/static/login.html
new file mode 100644
index 00000000..3996aa89
--- /dev/null
+++ b/lab-33/lab-33-shiro-demo/src/main/resources/static/login.html
@@ -0,0 +1,14 @@
+
+
+
+
+ 登陆页面
+
+
+
+
+
diff --git a/lab-33/pom.xml b/lab-33/pom.xml
new file mode 100644
index 00000000..fc684135
--- /dev/null
+++ b/lab-33/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-33
+ pom
+
+ lab-33-shiro-demo
+
+
+
+
diff --git a/pom.xml b/pom.xml
index afc0deb9..ae1767e3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,6 +41,7 @@
lab-30
lab-31
lab-32
+ lab-33