<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Apache Shiro 是一個開源的輕量級的 Java 安全框架,它提供身份驗證、授權、密碼管理以及對談管理等功能。相對於 Spring Security ,Shiro 框架更加直觀、易用,同時也能提供健壯的安全性。
在傳統的 SSM 框架中,手動整合 Shiro 的設定步驟還是比較多的,針對 Spring Boot ,Shiro 官方提供了 shiro-spring-boot-web-starter 用來簡化 Shiro 在 Spring Boot 中的設定。
首先建立一個普通的 Spring Boot Web 專案,新增 Shiro 依賴以及頁面模板依賴
<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>
這裡不需要新增 spring-boot-starter-web 依賴,shiro-spring-boot-web-starter 中已經依賴了 spring-boot-starter-web 。同時,此處使用 Thymeleaf 模板,為了在 Thymeleaf 使用 shiro 標籤,加入了 thymeleaf-extras-shiro 依賴。
在 application.properties 中設定 Shiro 的基本資訊
# 開啟 Shiro 設定,預設為 true
shiro.enabled=true
# 開啟 Shiro Web 設定,預設為 true
shiro.web.enabled=true
# 設定登入地址,預設為 /login.jsp
shiro.loginUrl=/login
# 設定登入成功的地址,預設為 /
shiro.successUrl=/index
# 未獲授權預設跳轉地址
shiro.unauthorizedUrl=/unauthorized
# 是否允許通過 URL 引數實現對談跟蹤,如果網站支援 Cookie,可以關閉此選項,預設為 true
shiro.sessionManager.sessionIdUrlRewritingEnabled=true
# 是否允許通過 Cookie 實現對談跟蹤,預設為 true
shiro.sessionManager.sessionIdCookieEnabled=true
然後在 Java 程式碼中設定 Shiro ,提供兩個最基本的 Bean 即可
@Configuration public class ShiroConfig { @Bean public Realm realm() { TextConfigurationRealm realm = new TextConfigurationRealm(); realm.setUserDefinitions("sang=123,usern admin=123,admin"); realm.setRoleDefinitions("admin=read,writen 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(); } }
程式碼解釋:
然後設定登入介面以及頁面存取介面
@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"; } }
程式碼解釋:
對於其他不需要角色就能存取的介面,直接在 WebMvc 中設定即可
@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; } }
當用戶存取未授權的資源時,跳轉到 unauthorized 檢視中,並攜帶出錯誤資訊。
設定完成後,最後在 resources/templates 目錄下建立 5 個 HTML 頁面進行測試。
(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> <h3>Hello, <shiro:principal/></h3> <h3><a href="/logout" rel="external nofollow" >登出登入</a></h3> <h3><a shiro:hasRole="admin" href="/admin" rel="external nofollow" >管理員頁面</a></h3> <h3><a shiro:hasAnyRoles="admin,user" href="/user" rel="external nofollow" >普通使用者頁面</a></h3> </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> <h1>普通使用者頁面</h1> </body> </html>
(4)admin.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>管理員頁面</h1> </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> <h3>未獲授權,非法存取</h3> <h3 th:text="${error}"></h3> </div> </body> </html>
啟動專案,存取登入頁面,使用 sang/123 登入
注意:由於 sang 使用者不具備 admin 角色,因此登入成功後的頁面沒有前往管理員頁面的超連結。
然後使用 admin/123 登入。
如果使用者使用 sang 登入,然後去存取:http://localhost:8080/admin,會跳轉到未授權頁面
以上通過一個簡單的案例展示瞭如何在 Spring Boot 中整合 Shiro 以及如何在 Thymeleaf 中使用 Shiro 標籤,一旦整合成功,接下來 Shiro 的用法就和原來的一模一樣。此處主要將 Spring Boot 整合 Shiro,對於 Shiro 的其它用法,可以參考 Shiro 官方檔案。
到此這篇關於SpringBoot淺析安全管理之Shiro框架的文章就介紹到這了,更多相關SpringBoot Shiro框架內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45