电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

解決springboot+shiro 權限攔截失效的問題

瀏覽:8日期:2023-04-21 09:32:40

最近因為項目需要,接觸了shiro。新手入門

發現權限攔截失效,

一直以為是以為授權和DB的問題

研究了一個下午,終于發現了問題所在

解決springboot+shiro 權限攔截失效的問題

我的訪問路徑沒有寫前面的斜杠!!,而DB中的資源路徑是可以省略的,崩潰了吧

但是問題來了,為什么在其他地方可以忽略掉前面的小斜杠呢?

經過幾分鐘的搗鼓發現,在springboot中,不論是thymeleaf的模板也好(我用的thymeleaf),還是后端代碼也好,底層會自動補全這個斜杠

問題解決!!

補充知識:SpringBoot整合shiro的一個完整的小案例

SpringBoot整合配置版的shiro很簡單,邏輯清

首先在pom.xml的配置如下,shiro使用緩存ehcache

<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.4</version> </dependency> <!-- shiro spring. --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.2.2</version> </dependency> <!-- shiro ehcache --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.2.2</version> </dependency>

接著配置shiro

@Configurationpublic class ShiroConfig { @Bean public ShiroFilterFactoryBean shirFilter(DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); // 必須設置 SecurityManager shiroFilter.setSecurityManager(securityManager); // 攔截器 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); // 設置login URL shiroFilter.setLoginUrl('/login'); // 登錄成功后要跳轉的鏈接 shiroFilter.setSuccessUrl('/main'); filterChainDefinitionMap.put('/webjars/**', 'anon'); filterChainDefinitionMap.put('/druid/**', 'anon'); //靜態資源的處理 filterChainDefinitionMap.put('/js/**', 'anon'); filterChainDefinitionMap.put('/css/**', 'anon'); filterChainDefinitionMap.put('/asserts/**', 'anon'); filterChainDefinitionMap.put('/fonts/**', 'anon'); filterChainDefinitionMap.put('/images/**', 'anon'); // 退出系統的過濾器 filterChainDefinitionMap.put('/logout', 'logout'); filterChainDefinitionMap.put('/login', 'anon'); filterChainDefinitionMap.put('/kaptcha', 'anon'); filterChainDefinitionMap.put('/**', 'authc'); shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilter; } @Bean public HashedCredentialsMatcher hashedCredentialsMatcher() { HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); hashedCredentialsMatcher.setHashAlgorithmName('MD5'); hashedCredentialsMatcher.setHashIterations(1024); return hashedCredentialsMatcher; } @Bean public ShiroRealm shiroRealm(HashedCredentialsMatcher hashedCredentialsMatcher) { ShiroRealm shiroRealm = new ShiroRealm(); shiroRealm.setCredentialsMatcher(hashedCredentialsMatcher); return shiroRealm; } //shiro使用緩存ehcachae @Bean public EhCacheManager ehCacheManager() { EhCacheManager ehCacheManager = new EhCacheManager(); ehCacheManager.setCacheManagerConfigFile('classpath:ehcache.xml'); return ehCacheManager; } @Bean('sessionManager') public SessionManager sessionManager(){ DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); sessionManager.setSessionValidationSchedulerEnabled(true); sessionManager.setSessionIdCookieEnabled(true); return sessionManager; } @Bean('securityManager') public DefaultWebSecurityManager securityManager(ShiroRealm shiroRealm, SessionManager sessionManager) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(shiroRealm); securityManager.setSessionManager(sessionManager); return securityManager; } @Bean('lifecycleBeanPostProcessor') public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor(); } @Bean public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator(); proxyCreator.setProxyTargetClass(true); return proxyCreator; } @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); advisor.setSecurityManager(securityManager); return advisor; }}

在配置中提到的realm如下配置

public class ShiroRealm extends AuthorizingRealm { @Autowired private UserService userService; @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken = (UsernamePasswordToken) token; // 取出表單用戶名 String username = upToken.getUsername(); // 查詢是否有該用戶 if (userService.getByName(username) == null) { throw new UnknownAccountException('用戶不存在!'); } // 靠用戶名從數據庫查詢該用戶的全部信息 User user = userService.getByName(username); // 傳入:用戶名,加密后的密碼,鹽值,該realm的名字,加密算法和加密次數在已經在配置文件中指定 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, user.getPassword(),ByteSource.Util.bytes(username), getName()); return info; } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 1. 從 PrincipalCollection 中來獲取登錄用戶的信息 Object principal = principals.getPrimaryPrincipal(); // 2. 利用登錄的用戶的信息來..當前用戶的角色或權限(可能需要查詢數據庫) Set<String> roles = new HashSet<String>(); roles.add('user'); if ('admin'.equals(principal)) { roles.add('admin'); } // 3. 創建 SimpleAuthorizationInfo, 并設置其 reles 屬性 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles); // 4. 返回 SimpleAuthorizationInfo 對象. return info; }}

由于我做的平臺只有一個管理員就不寫注冊了,這時手動算出一個admin用戶的密碼

public static void main(String[] args) { Object result = new SimpleHash('MD5','123456',ByteSource.Util.bytes('admin'),1024); System.out.println(result); }

最后寫登錄的Controller

@Controllerpublic class LoginController { // 處理登錄邏輯 @PostMapping('/login') public String login(String username, String password, String kaptcha, HttpSession session, Map<String, Object> map) { Subject currentUser = SecurityUtils.getSubject(); if (!currentUser.isAuthenticated()) { // 把用戶名和密碼封裝為 UsernamePasswordToken 對象 UsernamePasswordToken token = new UsernamePasswordToken(username, password); // 設置為rememberme token.setRememberMe(true); try {// 執行登錄.currentUser.login(token); } // 所有認證時異常的父類 catch (AuthenticationException ae) {map.put('password', '輸入的用戶名或密碼錯誤');log.info('登錄失敗: ' + ae.getMessage());return 'login'; } } if (!session.getAttribute('code').equals(kaptcha)) { map.put('kaptcha', '輸入的驗證碼錯誤'); return 'login'; } session.setAttribute('loginUser', 'user'); return 'main'; }}

以上這篇解決springboot+shiro 權限攔截失效的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 江苏密集柜_电动_手动_移动_盛隆柜业江苏档案密集柜厂家 | 直流电能表-充电桩电能表-导轨式电能表-智能电能表-浙江科为电气有限公司 | 昆明挖掘机修理厂_挖掘机翻新再制造-昆明聚力工程机械维修有限公司 | 论文查重_免费论文查重_知网学术不端论文查重检测系统入口_论文查重软件 | 超声波清洗机_超声波清洗机设备_超声波清洗机厂家_鼎泰恒胜 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 重庆轻质隔墙板-重庆安吉升科技有限公司| 房在线-免费房产管理系统软件-二手房中介房屋房源管理系统软件 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | 昆明挖掘机修理厂_挖掘机翻新再制造-昆明聚力工程机械维修有限公司 | DNA亲子鉴定_DNA基因检测中心官方预约平台-严选好基因网 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 铸铁平台,大理石平台专业生产厂家_河北-北重机械 | 新车测评网_网罗汽车评测资讯_汽车评测门户报道 | 电动百叶窗,开窗器,电动遮阳百叶,电动开窗机生产厂家-徐州鑫友工控科技发展有限公司 | 板材品牌-中国胶合板行业十大品牌-环保板材-上海声达板材 | 自进式锚杆-自钻式中空注浆锚杆-洛阳恒诺锚固锚杆生产厂家 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 垃圾清运公司_环卫保洁公司_市政道路保洁公司-华富环境 | 十二星座查询(性格特点分析、星座运势解读) - 玄米星座网 | 高柔性拖链电缆-聚氨酯卷筒电缆-柔性屏蔽电缆厂家-玖泰电缆 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 四探针电阻率测试仪-振实密度仪-粉末流动性测定仪-宁波瑞柯微智能 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 厌氧工作站-通用型厌氧工作站-上海胜秋科学仪器有限公司 | 冷却塔降噪隔音_冷却塔噪声治理_冷却塔噪音处理厂家-广东康明冷却塔降噪厂家 | 信阳网站建设专家-信阳时代网联-【信阳网站建设百度推广优质服务提供商】信阳网站建设|信阳网络公司|信阳网络营销推广 | 贵州成人高考网_贵州成考网 | 烟台金蝶财务软件,烟台网站建设,烟台网络推广 | 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | 冷热冲击试验箱_温度冲击试验箱价格_冷热冲击箱排名_林频厂家 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 泰国专线_泰国物流专线_广州到泰国物流公司-泰廊曼国际 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 耐热钢-耐磨钢-山东聚金合金钢铸造有限公司 | 空调风机,低噪声离心式通风机,不锈钢防爆风机,前倾皮带传动风机,后倾空调风机-山东捷风风机有限公司 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | LOGO设计_品牌设计_VI设计 - 特创易 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 环球电气之家-中国专业电气电子产品行业服务网站! | 纯化水设备-纯水设备-超纯水设备-[大鹏水处理]纯水设备一站式服务商-东莞市大鹏水处理科技有限公司 |