From 4c70d9f0656bbec48fa619f2ec9aa0ee12fca2c1 Mon Sep 17 00:00:00 2001 From: wu <731351411@qq.com> Date: 星期一, 04 十二月 2023 09:04:51 +0800 Subject: [PATCH] Merge branch 'master' of http://10.153.19.25:10101/r/CanadaMes --- springboot-vue3/src/main/java/com/example/springboot/security/config/ShiroConfig.java | 185 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 185 insertions(+), 0 deletions(-) diff --git a/springboot-vue3/src/main/java/com/example/springboot/security/config/ShiroConfig.java b/springboot-vue3/src/main/java/com/example/springboot/security/config/ShiroConfig.java new file mode 100644 index 0000000..52ad80c --- /dev/null +++ b/springboot-vue3/src/main/java/com/example/springboot/security/config/ShiroConfig.java @@ -0,0 +1,185 @@ +package com.example.springboot.security.config; + +import com.example.springboot.security.JWTRealm; +import com.example.springboot.security.NoSessionFilter; +import com.example.springboot.security.StatelessDefaultSubjectFactory; +import com.example.springboot.security.UserRealm; +import org.apache.shiro.authc.credential.HashedCredentialsMatcher; +import org.apache.shiro.codec.Base64; +import org.apache.shiro.mgt.DefaultSessionStorageEvaluator; +import org.apache.shiro.mgt.DefaultSubjectDAO; +import org.apache.shiro.spring.LifecycleBeanPostProcessor; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.CookieRememberMeManager; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.servlet.SimpleCookie; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; + +import javax.servlet.Filter; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +@Configuration +public class ShiroConfig { + + + /** + * Shiro鐢熷懡鍛ㄦ湡澶勭悊鍣� + * + * @return + */ + @Bean + public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { + return new LifecycleBeanPostProcessor(); + } + + /** + * 寮�鍚疭hiro鐨勬敞瑙�(濡侤RequiresRoles,@RequiresPermissions),闇�鍊熷姪SpringAOP鎵弿浣跨敤Shiro娉ㄨВ鐨勭被,骞跺湪蹇呰鏃惰繘琛屽畨鍏ㄩ�昏緫楠岃瘉 + * DefaultAdvisorAutoProxyCreator鐨勯『搴忓繀椤诲湪shiroFilterFactoryBean涔嬪墠锛屼笉鐒禨ecurityUtils.getSubject().getPrincipal()鑾峰彇涓嶅埌鍙傛暟 + * + * @return + */ + @Bean + @DependsOn({"lifecycleBeanPostProcessor"}) + public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() { + DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); + advisorAutoProxyCreator.setProxyTargetClass(true); + return advisorAutoProxyCreator; + } + + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() { + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(defaultSecurityManager()); + return authorizationAttributeSourceAdvisor; + } + + @Bean(name = "shiroFilterFactoryBean") + public ShiroFilterFactoryBean shiroFilterFactoryBean() { + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + shiroFilterFactoryBean.setSecurityManager(defaultSecurityManager()); + + // 杩囨护瑙勫垯 + Map<String, String> linkedHashMap = new LinkedHashMap<>(); + // 鏃犵姸鎬佺櫥褰曟儏鍐典笅鍏抽棴浜唖hiro涓殑session锛屽鑷存墍鏈夐渶瑕佸姞涓奱uthc鎺ュ彛璇锋眰鏃跺�欓兘浼氭姤閿欙紝 + // 鎵�浠ヤ娇鐢ˊRequiresRoles,@RequiresPermissions娉ㄨВ,aop鏂瑰紡瀹炵幇鎺ュ彛鐨勬潈闄愭牎楠� + + /* 娣诲姞shiro鐨勫唴缃繃婊ゅ櫒锛岃嚜瀹氫箟url瑙勫垯 + * Shiro鑷甫鎷︽埅鍣ㄩ厤缃鍒� + * rest锛氭瘮濡�/admins/user/**=rest[user],鏍规嵁璇锋眰鐨勬柟娉曪紝鐩稿綋浜�/admins/user/**=perms[user锛歮ethod] ,鍏朵腑method涓簆ost锛実et锛宒elete绛� + * port锛氭瘮濡�/admins/user/**=port[8081],褰撹姹傜殑url鐨勭鍙d笉鏄�8081鏄烦杞埌schemal锛�//serverName锛�8081?queryString,鍏朵腑schmal鏄崗璁甴ttp鎴杊ttps绛夛紝serverName鏄綘璁块棶鐨刪ost,8081鏄痷rl閰嶇疆閲宲ort鐨勭鍙o紝queryString鏄綘璁块棶鐨剈rl閲岀殑锛熷悗闈㈢殑鍙傛暟 + * perms锛氭瘮濡�/admins/user/**=perms[user锛歛dd锛�*],perms鍙傛暟鍙互鍐欏涓紝澶氫釜鏃跺繀椤诲姞涓婂紩鍙凤紝骞朵笖鍙傛暟涔嬮棿鐢ㄩ�楀彿鍒嗗壊锛屾瘮濡�/admins/user/**=perms["user锛歛dd锛�*,user锛歮odify锛�*"]锛屽綋鏈夊涓弬鏁版椂蹇呴』姣忎釜鍙傛暟閮介�氳繃鎵嶉�氳繃锛屾兂褰撲簬isPermitedAll()鏂规硶 + * roles锛氭瘮濡�/admins/user/**=roles[admin],鍙傛暟鍙互鍐欏涓紝澶氫釜鏃跺繀椤诲姞涓婂紩鍙凤紝骞朵笖鍙傛暟涔嬮棿鐢ㄩ�楀彿鍒嗗壊锛屽綋鏈夊涓弬鏁版椂锛屾瘮濡�/admins/user/**=roles["admin,guest"],姣忎釜鍙傛暟閫氳繃鎵嶇畻閫氳繃锛岀浉褰撲簬hasAllRoles()鏂规硶銆�//瑕佸疄鐜皁r鐨勬晥鏋滅湅http://zgzty.blog.163.com/blog/static/83831226201302983358670/ + * anon锛氭瘮濡�/admins/**=anon 娌℃湁鍙傛暟锛岃〃绀哄彲浠ュ尶鍚嶄娇鐢� + * authc锛氭瘮濡�/admins/user/**=authc琛ㄧず闇�瑕佽璇佹墠鑳戒娇鐢紝娌℃湁鍙傛暟 + * authcBasic锛氭瘮濡�/admins/user/**=authcBasic娌℃湁鍙傛暟琛ㄧずhttpBasic璁よ瘉 + * ssl锛氭瘮濡�/admins/user/**=ssl娌℃湁鍙傛暟锛岃〃绀哄畨鍏ㄧ殑url璇锋眰锛屽崗璁负https + * user锛氭瘮濡�/admins/user/**=user娌℃湁鍙傛暟琛ㄧず蹇呴』瀛樺湪鐢ㄦ埛锛屽綋鐧诲叆鎿嶄綔鏃朵笉鍋氭鏌� + * 璇︽儏瑙佹枃妗� http://shiro.apache.org/web.html#urls- + * */ + // 鐢ㄦ埛鏉冮檺 +// linkedHashMap.put("/api/user/selectPage", "perms[user:select]"); +// linkedHashMap.put("/api/user/selectById", "perms[user:select]"); +// linkedHashMap.put("/api/user/updateById", "perms[user:update]"); +// linkedHashMap.put("/api/user/removeByIds", "perms[user:delete]"); +// // 鍟嗗搧鏉冮檺 +// linkedHashMap.put("/api/product/deleteBatchIds", "perms[product:delete]"); +// linkedHashMap.put("/api/product/updateById", "perms[product:update]"); +// linkedHashMap.put("/api/product/insert", "perms[product:add]"); +// +// // 瑙掕壊鏉冮檺 +// linkedHashMap.put("/api/role/saveOrUpdate", "perms[role:add,role:update]"); +// linkedHashMap.put("/api/role/removeByIds", "perms[role:delete]"); +// linkedHashMap.put("/api/role/getById", "perms[role:select]"); +// linkedHashMap.put("/api/role/selectPage", "perms[role:select]"); +// +// // 鑿滃崟鏉冮檺 +// linkedHashMap.put("/api/menuList/removeByIds", "perms[menuList:delete]"); +// linkedHashMap.put("/api/menuList/saveOrUpdate", "perms[menuList:add,menuList:update]"); +// +// // 璁㈠崟鏉冮檺 +// linkedHashMap.put("/api/order/deleteBatchIds", "perms[order:delete]"); +// linkedHashMap.put("/api/order/updateById", "perms[order:update]"); +// +// // 鎺堟潈鐨勬潈闄� +// linkedHashMap.put("/api/rolePermission/saveOrUpdate", "perms[rolePermission:add]"); +// linkedHashMap.put("/api/rolePermission/removeByIds", "perms[rolePermission:delete]"); + + // 鑷畾涔夎繃婊ゅ櫒 + HashMap<String, Filter> filterHashMap = new HashMap<>(); + filterHashMap.put("jwt", new NoSessionFilter()); + shiroFilterFactoryBean.setFilters(filterHashMap); + // 鐧诲綍涔嬪悗鎵嶅彲浠ヨ姹傜殑鎺ュ彛 + linkedHashMap.put("/api/**", "jwt"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(linkedHashMap); + return shiroFilterFactoryBean; + } + + @Bean + public DefaultWebSecurityManager defaultSecurityManager() { + DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(); + defaultWebSecurityManager.setRealms(Arrays.asList(userRealm(), jwtRealm())); + // 绂佺敤shiro涓殑session + DefaultSubjectDAO defaultSubjectDAO = new DefaultSubjectDAO(); + DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator(); + defaultSessionStorageEvaluator.setSessionStorageEnabled(false); + defaultSubjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator); + defaultWebSecurityManager.setSubjectDAO(defaultSubjectDAO); + defaultWebSecurityManager.setSubjectFactory(subjectFactory()); + return defaultWebSecurityManager; + } + + /** + * 鐧诲綍鐨勮璇佸拰鎺堟潈 + * + * @return + */ + @Bean + public UserRealm userRealm() { + UserRealm userRealm = new UserRealm(); + userRealm.setCredentialsMatcher(hashedCredentialsMatcher()); + return userRealm; + } + + /** + * token鐨勮璇佸拰鎺堟潈 + * + * @return + */ + @Bean + public JWTRealm jwtRealm() { + return new JWTRealm(); + } + + @Bean + public StatelessDefaultSubjectFactory subjectFactory() { + return new StatelessDefaultSubjectFactory(); + } + + /* + * 鍑瘉鍖归厤鍣� 鐢变簬鎴戜滑鐨勫瘑鐮佹牎楠屼氦缁橲hiro鐨凷impleAuthenticationInfo杩涜澶勭悊浜� + */ + @Bean + public HashedCredentialsMatcher hashedCredentialsMatcher() { + HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); + hashedCredentialsMatcher.setHashAlgorithmName("MD5");// 鏁e垪绠楁硶:杩欓噷浣跨敤MD5绠楁硶; + hashedCredentialsMatcher.setHashIterations(1024);// 鏁e垪鐨勬鏁帮紝姣斿鏁e垪涓ゆ锛岀浉褰撲簬MD5(MD5("")); + return hashedCredentialsMatcher; + } + + @Bean + public CookieRememberMeManager cookieRememberMeManager() { + CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager(); + SimpleCookie simpleCookie = new SimpleCookie("rememberMe"); + simpleCookie.setMaxAge(259200000); + cookieRememberMeManager.setCookie(simpleCookie); + cookieRememberMeManager.setCipherKey(Base64.decode("6ZmI6I2j5Y+R5aSn5ZOlAA==")); + return cookieRememberMeManager; + } +} \ No newline at end of file -- Gitblit v1.8.0