日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot + Shiro 集成

發布時間:2023/12/31 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot + Shiro 集成 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

Spring Boot + Shiro 集成

Shiro 是一個流行的 Java 安全框架。

其實 Spring 有一個 Spring Security 的安全框架,我試用了一下,太復雜了。同樣的安全需求,用 Shiro 要簡單、快捷得多,也利于理解。

本手冊的源碼托管在 GitHub 上:

YorkeCao/shiro-spring-boot-sample

下面主要介紹在 Spring Boot 項目中引入 Shiro,對應用進行安全管控。

集成

可以利用 Shiro 啟動器來完成與 Spring Boot 的集成。

這里為了簡單,盡量少做配置。實際上 Shiro 有很多自定義選項。詳細介紹請移步官網。

  • 引入 Shiro 啟動器

    Shiro 官方提供了 Spring Boot 啟動器:shiro-spring-boot-starter,在 pom.xml 文件中引入:

    <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring-boot-starter --> <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-starter</artifactId><version>1.4.0</version> </dependency>

    ?

  • 配置 Shiro

    這里我們提供一個最簡單的 Java Class 配置。

    里面用到了一個自定義的 Realm:CustomRealm。

    package io.yorkecao.sample.config;import io.yorkecao.sample.shiro.CustomRealm; import org.apache.shiro.spring.LifecycleBeanPostProcessor; 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;/*** @author Yorke*/ @Configuration public class ShiroConfig {@Bean(name = "customRealm")public CustomRealm customRealm() {return new CustomRealm();}@Bean(name = "securityManager")public DefaultWebSecurityManager defaultWebSecurityManager(CustomRealm customRealm) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager ();securityManager.setRealm(customRealm);return securityManager;}@Bean(name = "lifecycleBeanPostProcessor")public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {return new LifecycleBeanPostProcessor();}@Bean(name = "shiroFilter")public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);return shiroFilterFactoryBean;} }

    ?

  • 實現自定義 Realm

    Realm 是控制認證和授權的核心部分,也是開發人員必須自己實現的部分。

    實現自定義 Realm 最快捷的方式是繼承 AuthorizingRealm 類。

    package io.yorkecao.sample.shiro;import io.yorkecao.sample.dao.ShiroSampleDao; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.springframework.beans.factory.annotation.Autowired;import java.util.Set;/*** @author Yorke*/ public class CustomRealm extends AuthorizingRealm {@Autowiredprivate ShiroSampleDao shiroSampleDao;/*** 認證*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;String username = token.getUsername();String password = this.shiroSampleDao.getPasswordByUsername(username);return new SimpleAuthenticationInfo(username, password, getName());}/*** 授權*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {String username = (String) super.getAvailablePrincipal(principalCollection);SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();Set<String> roles = shiroSampleDao.getRolesByUsername(username);authorizationInfo.setRoles(roles);roles.forEach(role -> {Set<String> permissions = this.shiroSampleDao.getPermissionsByRole(role);authorizationInfo.addStringPermissions(permissions);});return authorizationInfo;} }

    這里用到了一個 DAO:shiroSampleDao。應該要通過它來從我們的數據庫中獲取用戶、角色等信息。但是為了方便,我只是模擬了一下。

    package io.yorkecao.sample.dao;import org.springframework.stereotype.Repository;import java.util.*;/*** @author Yorke*/ @Repository public class ShiroSampleDao {public Set<String> getRolesByUsername(String username) {Set<String> roles = new HashSet<>();switch (username) {case "zhangsan":roles.add("admin");break;case "lisi":roles.add("guest");break;}return roles;}public Set<String> getPermissionsByRole(String role) {Set<String> permissions = new HashSet<>();switch (role) {case "admin":permissions.add("read");permissions.add("write");break;case "guest":permissions.add("read");break;}return permissions;}public String getPasswordByUsername(String username) {switch (username) {case "zhangsan":return "zhangsan";case "lisi":return "lisi";}return null;} }

    ?

  • 實現 login、logout 接口

    在 Shiro 框架中實現登錄、登出很容易。

    這里我也提供了一個 read 和 write 的接口,這兩個接口在 Service 實現。

    package io.yorkecao.sample.web;import io.yorkecao.sample.service.ShiroSampleService; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;/*** @author Yorke*/ @RestController public class ShiroSampleController {@Autowiredprivate ShiroSampleService shiroSampleService;@GetMapping("/login")public void login(String username, String password) {UsernamePasswordToken token = new UsernamePasswordToken(username, password);token.setRememberMe(true);Subject currentUser = SecurityUtils.getSubject();currentUser.login(token);}@GetMapping("/logout")public void logout() {Subject currentUser = SecurityUtils.getSubject();currentUser.logout();}@GetMapping("/read")public String read() {return this.shiroSampleService.read();}@GetMapping("/write")public String write() {return this.shiroSampleService.write();} }

    ?

  • 通過注解設置訪問資源所需權限

    可以通過 @RequiresPermissions 等注解設置訪問資源所需的權限。

    package io.yorkecao.sample.service;import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.stereotype.Service;/*** @author Yorke*/ @Service public class ShiroSampleService {@RequiresPermissions("read")public String read() {return "reading...";}@RequiresPermissions("write")public String write() {return "writting...";} }

    ?

  • 測試

    • 在登錄之前,訪問 /read 和 /write 接口都無效
    • 用 lisi 登錄(GET http://localhost:8080/login?username=lisi&password=lisi)后,可以訪問 /read,不能訪問 /write
    • 用 zhangsan 登錄(GET http://localhost:8080/login?username=zhangsan&password=zhangsan)后,/read 和 /write 都可以訪問
    • 登出后,訪問 /read 和 /write 接口都無效

    轉載于:https://my.oschina.net/YorkeCao/blog/1058017

    總結

    以上是生活随笔為你收集整理的Spring Boot + Shiro 集成的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。