日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot 整合 Shiro 密碼登錄與郵件驗(yàn)證碼登錄功能(多 Realm 認(rèn)證)

瀏覽:29日期:2023-03-23 17:29:45

導(dǎo)入依賴(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>

在 SpringBoot 項(xiàng)目配置 config 包下創(chuàng)建 ShiroConfig 配置類

@Configurationpublic class ShiroConfig { /** * ShiroFilterFactoryBean * <p> * 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) */ @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier('securityManager') DefaultWebSecurityManager defaultWebSecurityManager) { ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); // 設(shè)置安全管理器 factoryBean.setSecurityManager(defaultWebSecurityManager); // 添加shiro的內(nèi)置過(guò)濾器 Map<String, String> filterMap = new LinkedHashMap<>(); // 放行不需要權(quán)限認(rèn)證的接口 // 網(wǎng)站首頁(yè) filterMap.put('/', 'anon'); filterMap.put('/index', 'anon'); filterMap.put('/index.html', 'anon'); // 不驗(yàn)證跳轉(zhuǎn)接口 filterMap.put('/into/**', 'anon'); // 需要權(quán)限認(rèn)證的接口 // 驗(yàn)證跳轉(zhuǎn)接口 filterMap.put('/verifyInto/**', 'authc'); factoryBean.setFilterChainDefinitionMap(filterMap); // 訪問(wèn)沒(méi)有授權(quán)的資源 factoryBean.setLoginUrl('redirect:/into/login'); // 設(shè)置無(wú)權(quán)限時(shí)跳轉(zhuǎn)的url factoryBean.setUnauthorizedUrl('redirect:/into/login'); return factoryBean; } /** * 管理shiro的生命周期 */ @Bean('lifecycleBeanPostProcessor') public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor(); } /** * 注入 密碼登錄CustomRealm */ @Bean @DependsOn('lifecycleBeanPostProcessor') public UserPasswordRealm userPasswordRealm() { return new UserPasswordRealm(); } /** * 注入 郵箱驗(yàn)證登錄EmailRealm */ @Bean @DependsOn('lifecycleBeanPostProcessor') public UserEmailRealm userEmailRealm() { return new UserEmailRealm(); } /** * 默認(rèn)安全管理器 */ @Bean public DefaultWebSecurityManager securityManager(UserPasswordRealm userPasswordRealm, UserEmailRealm userEmailRealm, AbstractAuthenticator abstractAuthenticator) { DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(); List<Realm> realms = new ArrayList<>(); realms.add(userPasswordRealm); realms.add(userEmailRealm); defaultWebSecurityManager.setRealms(realms); // 記住我 defaultWebSecurityManager.setRememberMeManager(cookieRememberMeManager()); defaultWebSecurityManager.setAuthenticator(abstractAuthenticator); return defaultWebSecurityManager; } /** * 認(rèn)證器 把我們的自定義驗(yàn)證加入到認(rèn)證器中 */ @Bean public AbstractAuthenticator abstractAuthenticator(UserPasswordRealm userPasswordRealm, UserEmailRealm userEmailRealm) { // 自定義模塊化認(rèn)證器,用于解決多realm拋出異常問(wèn)題 //開(kāi)始沒(méi)用自定義異常問(wèn)題,發(fā)現(xiàn)不管是賬號(hào)密碼錯(cuò)誤還是什么錯(cuò)誤 //shiro只會(huì)拋出一個(gè)AuthenticationException異常 ModularRealmAuthenticator authenticator = new MyCustomModularRealmAuthenticator(); // 認(rèn)證策略:AtLeastOneSuccessfulStrategy(默認(rèn)),AllSuccessfulStrategy,F(xiàn)irstSuccessfulStrategy authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy()); // 加入realms List<Realm> realms = new ArrayList<>(); realms.add(userPasswordRealm); realms.add(userEmailRealm); authenticator.setRealms(realms); return authenticator; } /** * 加入shiro注解 代理生成器 切面 */ @Bean @DependsOn({'lifecycleBeanPostProcessor'}) public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); advisorAutoProxyCreator.setProxyTargetClass(true); return advisorAutoProxyCreator; } /** * 加入shiro注解 切點(diǎn) */ @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) { AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); return authorizationAttributeSourceAdvisor; } /** * 設(shè)置cookie 記住我生成cookie */ @Bean public CookieRememberMeManager cookieRememberMeManager() { CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager(); cookieRememberMeManager.setCookie(rememberMeCookie()); return cookieRememberMeManager; } /** * 設(shè)置cookie有效時(shí)間 */ @Bean public SimpleCookie rememberMeCookie() { /*這個(gè)參數(shù)是cookie的名稱,對(duì)應(yīng)前端頁(yè)面的checkbox的name=remremberMe*/ SimpleCookie simpleCookie = new SimpleCookie('rememberMe'); /*cookie的有效時(shí)間為30天,單位秒*/ simpleCookie.setMaxAge(259200); return simpleCookie; }}

創(chuàng)建自定義驗(yàn)證器 MyCustomModularRealmAuthenticator 類

public class MyCustomModularRealmAuthenticator extends ModularRealmAuthenticator { @Override protected AuthenticationInfo doMultiRealmAuthentication(Collection<Realm> realms, AuthenticationToken token) { AuthenticationStrategy authenticationStrategy = this.getAuthenticationStrategy(); AuthenticationInfo authenticationInfo = authenticationStrategy.beforeAllAttempts(realms, token); Iterator var5 = realms.iterator(); while (var5.hasNext()) { Realm realm = (Realm) var5.next(); authenticationInfo = authenticationStrategy.beforeAttempt(realm, token, authenticationInfo); if (realm.supports(token)) { AuthenticationInfo info = null; Throwable t = null; info = realm.getAuthenticationInfo(token); authenticationInfo = authenticationStrategy.afterAttempt(realm, token, info, authenticationInfo, t); } } authenticationInfo = authenticationStrategy.afterAllAttempts(token, authenticationInfo); return authenticationInfo; }}

創(chuàng)建密碼登錄時(shí)驗(yàn)證授權(quán) UserPasswordRealm 類

@Componentpublic class UserPasswordRealm extends AuthorizingRealm { // 注入用戶業(yè)務(wù) @Autowired private UserMapper userMapper; /** * 授權(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ù) 查詢用戶數(shù)據(jù) QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq('user_name', userToken.getUsername()); User user = userMapper.selectOne(wrapper); // 驗(yàn)證用戶 if (user == null) { throw new UnknownAccountException(); } return new SimpleAuthenticationInfo('', user.getUserPassword(), ''); } /** * 用來(lái)判斷是否使用當(dāng)前的 realm * * @param var1 傳入的token * @return true就使用,false就不使用 */ @Override public boolean supports(AuthenticationToken var1) { return var1 instanceof UsernamePasswordToken; }}

創(chuàng)建郵件驗(yàn)證碼登錄時(shí)驗(yàn)證授權(quán)UserEmailRealm 類

@Componentpublic class UserEmailRealm extends AuthorizingRealm { // 注入用戶業(yè)務(wù) @Autowired UserService userService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println('————郵箱登錄授權(quán)————doGetAuthorizationInfo————'); return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.out.println('————郵箱登錄認(rèn)證————doGetAuthenticationInfo————'); UserEmailToken userEmailToken = (UserEmailToken) token; String userEmail = (String) userEmailToken.getPrincipal(); // 連接數(shù)據(jù)庫(kù) 查詢用戶數(shù)據(jù) QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq('user_email', userEmail); User user = userService.getOne(wrapper); //因?yàn)闆](méi)有密碼,并且驗(yàn)證碼在之前就驗(yàn)證了 if (user == null) { throw new UnknownAccountException(); } return new SimpleAuthenticationInfo('', userEmail, ''); } /** * 用來(lái)判斷是否使用當(dāng)前的 realm * * @param var1 傳入的token * @return true就使用,false就不使用 */ @Override public boolean supports(AuthenticationToken var1) { return var1 instanceof UserEmailToken; }}

創(chuàng)建郵件驗(yàn)證碼登錄驗(yàn)證通過(guò)生成令牌的 UserEmailToken 類(密碼登錄時(shí)使用shiro默認(rèn)的 UsernamePasswordToken 令牌)

@Data // 使用lombok 生成get方法、set方法public class UserEmailToken implements HostAuthenticationToken, RememberMeAuthenticationToken { private String userEmail; private boolean rememberMe; private String host; public UserEmailToken() { this.rememberMe = false; } public UserEmailToken(String userEmail) { this(userEmail, false, null); } public UserEmailToken(String userEmail, boolean rememberMe) { this(userEmail, rememberMe, null); } public UserEmailToken(String userEmail, boolean rememberMe, String host) { this.userEmail = userEmail; this.rememberMe = rememberMe; this.host = host; } @Override public String getHost() { return host; } @Override public boolean isRememberMe() { return rememberMe; } /** * 重寫getPrincipal方法 */ @Override public Object getPrincipal() { return userEmail; } /** * 重寫getCredentials方法 */ @Override public Object getCredentials() { return userEmail; }}

創(chuàng)建密碼鹽值加密 MDPasswordUtil 工具類

public class MDPasswordUtil { public String getMDPasswordUtil(String userName, String userPassword) { String hashAlgorithmName = 'MD5'; // 加密方式:md5加密 Object credentials = userPassword; // 密碼 Object salt = ByteSource.Util.bytes(userName); // 鹽 int hashIterations = 512; // 加密次數(shù) Object result = new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations); return result.toString(); }}

控制層用戶密碼登錄

// 用戶密碼登錄 @PostMapping('/passwordLogin') public String userLogin(@RequestParam('userName') String userName, @RequestParam('userPassword') String userPassword, HttpSession session, Model model) { // 獲取當(dāng)前的用戶 Subject subject = SecurityUtils.getSubject(); // 對(duì)密碼進(jìn)行MD5鹽值加密 String md5Password = new MDPasswordUtil().getMDPasswordUtil(userName, userPassword); // 封裝用戶的登錄數(shù)據(jù) UsernamePasswordToken token = new UsernamePasswordToken(userName, md5Password); //rememberme記住我 token.setRememberMe(true); try { // 登錄,驗(yàn)證,保存令牌 subject.login(token); //查詢登錄信息 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq('user_name', userName); User user = userService.getOne(wrapper); //保存登錄用戶信息 session.setAttribute(user.getUserId().toString(), user); return 'admin'; } catch (UnknownAccountException e) { model.addAttribute('userError', '用戶名錯(cuò)誤!請(qǐng)重新輸入。'); return 'login'; } catch (IncorrectCredentialsException ice) { model.addAttribute('pwError', '密碼錯(cuò)誤!請(qǐng)重新輸入。'); return 'login'; } }

控制層用戶郵件驗(yàn)證碼密碼登錄

// 用戶郵箱登錄 @PostMapping('/emailLogin') public String emailLogin(@RequestParam('userEmail') String userEmail,@RequestParam('emailCode') String emailCode,HttpSession session, Model model) { // 根據(jù)userEmail從session中取出發(fā)送的驗(yàn)證碼 String sendEmailCode = (String) session.getAttribute(userEmail); // 比對(duì)驗(yàn)證碼 if (StringUtils.isNoneBlank(sendEmailCode) && sendEmailCode.equals(emailCode)) { try { UserEmailToken token = new UserEmailToken(userEmail); //rememberme記住我 token.setRememberMe(true); // 登錄,驗(yàn)證,保存令牌 Subject subject = SecurityUtils.getSubject(); subject.login(token); //查詢登錄信息 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq('user_email', userEmail); User user = userService.getOne(wrapper); //保存登錄用戶信息 session.setAttribute(user.getUserId().toString(), user); // 銷毀驗(yàn)證碼 session.removeAttribute(emailCode); return 'admin'; } catch (Exception e) { model.addAttribute('error', '驗(yàn)證碼錯(cuò)誤!請(qǐng)重新輸入。'); return 'login'; } } else { return 'login'; } }

SpringBoot 整合 Shiro 密碼登錄與郵件驗(yàn)證碼登錄(多 Realm 認(rèn)證)就可以了 (有點(diǎn)多,哈哈哈)

推薦大神:狂神說(shuō)Java

到此這篇關(guān)于SpringBoot 整合 Shiro 密碼登錄與郵件驗(yàn)證碼登錄(多 Realm 認(rèn)證)的文章就介紹到這了,更多相關(guān)SpringBoot 整合 Shiro登錄內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91精品在线免费视频| 美女性感视频久久| 韩国精品主播一区二区在线观看 | 欧美久久精品一级c片| 婷婷综合六月| 欧美99久久| 久久成人国产| 日韩av网站在线观看| 国产欧美日韩一区二区三区四区| 国产精品久久久久77777丨| 精品亚洲自拍| 欧美不卡高清一区二区三区| 午夜精品成人av| 久久国产成人| 国产精品九九| 91精品国产成人观看| 久久成人精品| 精品国产三区在线| 亚洲精品一区二区在线看| 日韩福利视频导航| 超级白嫩亚洲国产第一| 狠狠爱成人网| 国产精品大片| 激情五月色综合国产精品| 日本欧美一区二区| 神马午夜在线视频| 亚洲va久久久噜噜噜久久| 欧美永久精品| 99久久九九| 国产欧美综合一区二区三区| 日韩中文欧美| 91精品国产自产观看在线| 国产夫妻在线| 日韩精品视频中文字幕| 高清不卡亚洲| 日本高清久久| 亚洲天堂久久| 国产高清亚洲| 亚洲欧美成人综合| 黑人精品一区| 国产亚洲高清一区| 亚洲国产一区二区三区在线播放| 一本综合精品| 日韩精品久久久久久久电影99爱| 日本免费新一区视频| 免费视频国产一区| 欧美激情麻豆| 午夜电影一区| 九色精品91| 91视频一区| 国产精品亚洲二区| 日韩中文字幕一区二区三区| 亚洲风情在线资源| 久久麻豆视频| 日韩不卡免费视频| 国产精品美女久久久| 欧美精品资源| 国产精品综合| 日韩高清不卡一区| 亚洲精品字幕| 国产亚洲在线观看| 欧美va天堂在线| 伊伊综合在线| 高清一区二区| 国产一级成人av| 蜜桃视频在线观看一区| 亚洲精品2区| 国产专区一区| 久久影院一区| 日韩深夜视频| 欧美xxxx中国| 久久免费影院| 奇米色欧美一区二区三区| 国产精品美女| 国产午夜精品一区二区三区欧美| 欧美成人基地 | 美女视频黄久久| 日韩国产欧美三级| 亚洲人成网77777色在线播放| 国产视频亚洲| 好吊一区二区三区| 欧美美女一区| 婷婷激情图片久久| 午夜欧美精品| 亚洲欧美视频一区二区三区| 日韩一级网站| 视频一区免费在线观看| 免费观看在线色综合| 男女性色大片免费观看一区二区 | 欧美色图国产精品| 久久美女性网| 最近高清中文在线字幕在线观看1| 精品美女在线视频| 久久精品国内一区二区三区| 国产精品亚洲成在人线| 国产精品综合色区在线观看| 国产精品伊人| 国产成人精品三级高清久久91| 国产在线一区不卡| 日韩电影免费网站| 激情欧美一区二区三区| 中文亚洲欧美| 视频一区中文字幕精品| 91嫩草精品| 久久精品国产99| 国产成人久久精品一区二区三区| 日本不卡免费高清视频在线| 欧美不卡高清| 亚洲人成亚洲精品| 欧美日韩亚洲一区| 国产 日韩 欧美 综合 一区| 日本精品在线中文字幕| 午夜久久影院| 日韩av在线播放中文字幕| 国产精品最新| 欧美羞羞视频| 免费日本视频一区| 国产精品一区二区三区美女| 福利一区在线| 亚洲少妇自拍| 欧美啪啪一区| 奇米色欧美一区二区三区| 久久精品99国产国产精| 久久精品国产久精国产爱| 国产日本亚洲| 免费一区二区三区在线视频| 亚洲黄色免费av| 免费看的黄色欧美网站| 欧美日本二区| 日韩成人亚洲| 亚洲综合丁香| 国产精品mm| 欧美二区视频| 欧美日韩99| 国产高清不卡| 中文字幕一区二区三区四区久久 | 日韩中文字幕无砖| 免费看久久久| 国产精品88久久久久久| 日本不卡在线视频| 天堂8中文在线最新版在线| 老牛影视一区二区三区| 久久97视频| 亚洲欧美日本日韩| 国产一区二区三区四区五区传媒| re久久精品视频| 国产极品一区| 久久av一区二区三区| 国产毛片一区二区三区| 婷婷激情久久| 国产精品a级| 蜜桃久久av| 欧美二三四区| 国产精品亚洲欧美日韩一区在线 | 久久天堂av| 国产精品午夜一区二区三区| 国产精品99一区二区| 国产精品啊啊啊| 美女久久网站| 久久久久99| 欧美xxxx性| 美女精品一区| 99热精品久久| 精品国产麻豆| 88久久精品| 免费一级片91| 偷拍欧美精品| 国产资源在线观看入口av| 欧美午夜三级| 久久国产精品毛片| 91看片一区| 久久精品二区亚洲w码 | 欧美亚洲三区| 亚洲综合二区| 亚洲高清毛片| 精品国产一级| 综合亚洲视频| 精品国产黄a∨片高清在线| 亚洲婷婷丁香| 亚洲先锋成人| 国产精品精品| 国产精品99精品一区二区三区∴| 中文国产一区| 91精品福利| 日韩精品中文字幕第1页| 久久影视三级福利片| 91午夜精品| 婷婷亚洲成人| 日韩一区二区三区精品视频第3页| 婷婷亚洲五月| 亚洲涩涩在线| 日韩中文欧美| 日韩欧美精品| 日韩伦理福利| 亚洲欧洲美洲av| 国产精品国产三级国产在线观看| 欧美国产另类| 麻豆精品新av中文字幕| 国产精品白丝av嫩草影院| 国产精品日本一区二区不卡视频 |