SpringBoot 整合 Shiro 密碼登錄的實(shí)現(xiàn)代碼
導(dǎo)入依賴(lài)(pom.xml)
<!--整合Shiro安全框架--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <!--集成jwt實(shí)現(xiàn)token認(rèn)證--> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.2.0</version> </dependency>
創(chuàng)建 ShiroConfig 配置類(lèi)
@Configurationpublic class ShiroConfig { /** * ShiroFilterFactoryBean */ @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier('securityManager') DefaultWebSecurityManager defaultWebSecurityManager) { ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); //設(shè)置安全管理器 factoryBean.setSecurityManager(defaultWebSecurityManager); // 添加shiro的內(nèi)置過(guò)濾器 /* * anon:無(wú)需認(rèn)證就可以訪問(wèn) * authc:必須認(rèn)證才能訪問(wèn) * user:必須擁有 記住我 功能才能用 * perms:擁有對(duì)某個(gè)資源的權(quán)限能訪問(wèn) * role:擁有某個(gè)角色權(quán)限能訪問(wèn) */ Map<String, String> filterMap = new LinkedHashMap<>(); // 放行不需要權(quán)限認(rèn)證的接口 //放行登錄接口 filterMap.put('/login/**', 'anon'); //放行用戶(hù)接口 filterMap.put('/', 'anon'); // 網(wǎng)站首頁(yè) //認(rèn)證管理員接口 filterMap.put('/administrators/**', 'authc'); factoryBean.setFilterChainDefinitionMap(filterMap); // 設(shè)置無(wú)權(quán)限時(shí)跳轉(zhuǎn)的 url // 設(shè)置登錄的請(qǐng)求 factoryBean.setLoginUrl('/login/toLogin'); return factoryBean; } /** * 注入 DefaultWebSecurityManager */ @Bean(name = 'securityManager') public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier('customRealm') CustomRealm customRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //關(guān)聯(lián)CustomRealm securityManager.setRealm(customRealm); return securityManager; } /** * 注入 securityManager */ @Bean public CustomRealm customRealm() { return new CustomRealm(); }}
創(chuàng)建密碼登錄時(shí)驗(yàn)證授權(quán) CustomRealm 類(lèi)
@Componentpublic class CustomRealm extends AuthorizingRealm { @Autowired AdministratorsService administratorsService; /* * 設(shè)置加密方式 */ { HashedCredentialsMatcher mather = new HashedCredentialsMatcher(); // 加密方式 mather.setHashAlgorithmName('md5'); // 密碼進(jìn)行一次運(yùn)算 mather.setHashIterations(512); this.setCredentialsMatcher(mather); } /** * 授權(quán) */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { System.out.println('————授權(quán)————doGetAuthorizationInfo————'); return null; } /** * 認(rèn)證 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.out.println('————認(rèn)證————doGetAuthenticationInfo————'); UsernamePasswordToken userToken = (UsernamePasswordToken) token; // 連接數(shù)據(jù)庫(kù) 查詢(xún)用戶(hù)數(shù)據(jù) QueryWrapper<Administrators> wrapper = new QueryWrapper<>(); wrapper.eq('username', userToken.getUsername()); Administrators administrators = administratorsService.getOne(wrapper); if (administrators == null) { return null; // 拋出異常 UnknownAccountException } // 密碼認(rèn)證,shiro做 return new SimpleAuthenticationInfo('', administrators.getPassword(), ''); }}
控制層用戶(hù)密碼登錄
//用戶(hù)名登錄 @ApiOperation(value = '管理員登錄', notes = '用戶(hù)名登錄--不進(jìn)行攔截') @PostMapping('/doLogin') public String doLogin(@RequestParam('username') String username, @RequestParam('password') String password, HttpSession session,Model model) { // 獲取當(dāng)前的用戶(hù) Subject subject = SecurityUtils.getSubject(); // 封裝用戶(hù)的登錄數(shù)據(jù) UsernamePasswordToken token = new UsernamePasswordToken(username, password); try { subject.login(token); //保存session會(huì)話(huà) 管理員名字 session.setAttribute('adname', username); return 'admin'; } catch (UnknownAccountException e) { model.addAttribute('usererror', '用戶(hù)名錯(cuò)誤!請(qǐng)重新輸入。'); return 'login'; } catch (IncorrectCredentialsException ice) { model.addAttribute('pwerror', '密碼錯(cuò)誤!請(qǐng)重新輸入。'); return 'login'; } }
到此這篇關(guān)于SpringBoot 整合 Shiro 密碼登錄的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)SpringBoot 整合 Shiro 密碼登錄內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)2. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)車(chē)輛管理系統(tǒng)3. HTML5實(shí)戰(zhàn)與剖析之觸摸事件(touchstart、touchmove和touchend)4. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫(xiě)金額)的函數(shù)5. Jsp servlet驗(yàn)證碼工具類(lèi)分享6. jscript與vbscript 操作XML元素屬性的代碼7. 基于PHP做個(gè)圖片防盜鏈8. Jsp+Servlet實(shí)現(xiàn)文件上傳下載 文件列表展示(二)9. asp.net core 認(rèn)證和授權(quán)實(shí)例詳解10. XML在語(yǔ)音合成中的應(yīng)用
