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