摘要:此文章僅僅說明在整合時的一些坑并不是教程增加依賴集成依賴配置三個必須的用于授權和登錄創建自己的實例用于實現權限三種方式實現定義權限路徑第一種使用角色名定義第二種使用權限定義第三種使用接口的自定義配置此處配置之后需要在對應的
此文章僅僅說明在springboot整合shiro時的一些坑,并不是教程
增加依賴
org.apache.shiro shiro-spring-boot-web-starter 1.4.0-RC2
配置三個必須的Bean
Realm
用于授權和登錄
@Bean public Realm realm() { //創建自己的Realm實例 return new UserRealm(); }
ShiroFilterChainDefinition
用于實現權限
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); // 三種方式實現定義權限路徑 // 第一種:使用角色名定義 chainDefinition.addPathDefinition("/admin/**", "authc, roles[admin]"); // 第二種:使用權限code定義 chainDefinition.addPathDefinition("/docs/**", "authc, perms[document:read]"); // 第三種:使用接口的自定義配置(此處配置之后需要在對應的接口使用@RequiresPermissions("")) chainDefinition.addPathDefinition("/**", "authc"); return chainDefinition;
CacheManager
緩存管理
@Bean protected CacheManager cacheManager() { return new MemoryConstrainedCacheManager(); }
還有一些配置,可以在配置文件中配置,具體配置項見 shiro配置
以下內容是為了實現前后端分離,配置shiro攔截器實現返回401狀態碼的需求
編寫攔截器類
public class FormLoginFilter extends PathMatchingFilter { @Override protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { Subject subject = SecurityUtils.getSubject(); boolean isAuthenticated = subject.isAuthenticated(); if (!isAuthenticated) { HttpServletResponse resp = (HttpServletResponse) response; resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED); resp.getWriter().print("NO AUTH!"); return false; } return true; } }
在之前配置的三個Bean的基礎上多配置一個BeanShiroFilterFactoryBean
@Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); // 必須設置SecuritManager shiroFilterFactoryBean.setSecurityManager(securityManager); Mapfilters = shiroFilterFactoryBean.getFilters(); //配置攔截器,實現無權限返回401,而不是跳轉到登錄頁 filters.put("authc", new FormLoginFilter()); // 如果不設置默認會自動尋找Web工程根目錄下的"/login.jsp"頁面 shiroFilterFactoryBean.setLoginUrl("/login"); // 登錄成功后要跳轉的鏈接 shiroFilterFactoryBean.setSuccessUrl("/index"); // 未授權界面; shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 攔截器 Map filterChainDefinitionMap = new LinkedHashMap (); // 過濾鏈定義,從上向下順序執行,一般將 /**放在最為下邊 // authc:所有url都必須認證通過才可以訪問; anon:所有url都都可以匿名訪問 filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; }
此處配置了過濾鏈,上面三個必須的Bean中修改其中的ShiroFilterChainDefinition
@Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { //不需要在此處配置權限頁面,因為上面的ShiroFilterFactoryBean已經配置過,但是此處必須存在,因為shiro-spring-boot-web-starter或查找此Bean,沒有會報錯 return new DefaultShiroFilterChainDefinition();; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68736.html
摘要:開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權限問題前后端分離二使用完美處理權限問題前后端分離三中密碼加鹽與中異常統一處理 開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
摘要:進行下一項配置,為了區分必須加入。另起一行,以示尊重。這行代碼主要是用于驗證,后面再說。然后跑下接口,發現沒問題,正常打印,說明主體也在上下文中了。說明這會上下文環境中我們主體不存在。所說以,主體數據生命周期是一次請求。 showImg(https://segmentfault.com/img/bVbtoG1?w=1600&h=900); 原來一直使用shiro做安全框架,配置起來相當...
閱讀 958·2022-06-21 15:13
閱讀 1848·2021-10-20 13:48
閱讀 1029·2021-09-22 15:47
閱讀 1365·2019-08-30 15:55
閱讀 3113·2019-08-30 15:53
閱讀 520·2019-08-29 12:33
閱讀 712·2019-08-28 18:15
閱讀 3458·2019-08-26 13:58