Springboot+Shiro記錄用戶登錄信息并獲取當(dāng)前登錄用戶信息的實(shí)現(xiàn)代碼
由于最近做項(xiàng)目需要,在用戶登陸后有一個(gè)功能是需要用戶的信息,進(jìn)行寫入數(shù)據(jù)庫的操作。但是目前還用不到Shiro的高級(jí)權(quán)限,只為了簡單獲取用戶信息,自己整合了一個(gè)只記錄用戶,獲取用戶信息的功能。
導(dǎo)入Shiro依賴
<!-- Shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency>
User類
這個(gè)類只需要自己定義一個(gè)username(可以其他的phone、email都行)和password(密碼)就可以,其他的可以自己擴(kuò)充。
UserRealm(核心)
這個(gè)類的功能:
1、用戶的授權(quán)操作,但是這里先不授予權(quán)限(后續(xù)可以在這里補(bǔ)充)
2、用戶認(rèn)證,這里有三種認(rèn)證結(jié)果。
① 用戶登錄成功
② 拋出UnknownAccountException異常,表示獲取的user是null 。
③ 拋出IncorrectCredentialsException異常,表示這個(gè)user的密碼錯(cuò)誤。
import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; /** * 自定義Realm */ public class UserRealm extends AuthorizingRealm { @Autowired(required = false) private UserService userService; private final Logger logger = LoggerFactory.getLogger(UserRealm.class); /** * 執(zhí)行授權(quán)邏輯 * * @param arg0 * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { System.out.println("執(zhí)行授權(quán)邏輯"); //給資源進(jìn)行授權(quán) SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //不授權(quán)先不寫 return info; } /** * 執(zhí)行認(rèn)證邏輯 * * @param arg0 * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException { System.out.println("執(zhí)行認(rèn)證邏輯"); // 編寫shiro判斷邏輯,判斷用戶名和密碼 UsernamePasswordToken token = (UsernamePasswordToken) arg0; // 判斷用戶名 User user = userService.findUserByPhone(token.getUsername()); if (user == null) { // 該用戶不存在 return null; // shiro底層會(huì)拋出UnKnowAccountException } return new SimpleAuthenticationInfo(user, user.getPassword(), ""); // 判斷密碼 } }
ShiroConfig類(核心)
代碼基本不需要修改,根據(jù)個(gè)人不同的情況,需要修改的地方是第一個(gè)方法。
這里修改的原因是,每個(gè)人想要攔截的頁面都不一樣。因?yàn)槲覜]有做任何的授權(quán),我使用了
filterMap.put("/*", "anon");
為所有的頁面,都開啟了放行,無需認(rèn)證就可以訪問,代碼中注釋部分是權(quán)限的定義
import java.util.LinkedHashMap; import java.util.Map; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Shiro的配置類 */ @Configuration public class ShiroConfig { /** * 創(chuàng)建ShiroFilterFactoryBean * * @param securityManager * @return */ @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); //設(shè)置安全管理器 shiroFilterFactoryBean.setSecurityManager(securityManager); //添加Shiro內(nèi)置過濾器 /** * Shiro內(nèi)置過濾器,可以實(shí)現(xiàn)權(quán)限相關(guān)的攔截器 * 常用的過濾器: * anon: 無需認(rèn)證(登錄)可以訪問 * authc: 必須認(rèn)證才可以訪問 * user: 如果使用rememberMe的功能可以直接訪問 * perms: 該資源必須得到資源權(quán)限才可以訪問 * role: 該資源必須得到角色權(quán)限才可以訪問 */ Map<String, String> filterMap = new LinkedHashMap<String, String>(); // 放行l(wèi)ogin.html頁面 filterMap.put("/login", "anon"); // 要將登陸的接口放出來,不然沒權(quán)限訪問登陸的接口 // 授權(quán)過濾器 // 注意:當(dāng)前授權(quán)攔截后,shiro會(huì)自動(dòng)跳轉(zhuǎn)到未授權(quán)頁面 filterMap.put("/*", "anon"); // TODO 此處我做過修改 shiroFilterFactoryBean.setLoginUrl("/login"); // 修改調(diào)整的登錄頁面 shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 設(shè)置未授權(quán)提示頁面 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); return shiroFilterFactoryBean; } /** * 創(chuàng)建DefaultWebSecurityManager * * @param userRealm * @return */ @Bean(name = "securityManager") public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm); // 關(guān)聯(lián)realm return securityManager; } /** * 創(chuàng)建Realm * * @return */ @Bean(name = "userRealm") public UserRealm getRealm() { return new UserRealm(); } }
UserController類(用戶登錄)
這里就是登陸成功,以及拋出兩個(gè)異常的地方。
/** * 用戶登錄 * * @param request * @return */ @PostMapping("/userLogin") @ResponseBody public String userLogin(HttpServletRequest request) { String phone = request.getParameter("phone"); String password = request.getParameter("password"); String result = ""; Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(phone, password); try { subject.login(token); result = "登陸成功"; } catch (UnknownAccountException e) { result = "用戶名不存在"; } catch (IncorrectCredentialsException e) { result = "密碼錯(cuò)誤"; } return result; }
這樣就完成了記錄用戶登錄信息,并且完成登錄。
唯一有可能遇到的問題是網(wǎng)頁的問題,這里需要在ShiroConfig類第一個(gè)方法里去配置。
獲取當(dāng)前用戶登錄信息
只需要這一條語句就可以
User user = (User) SecurityUtils.getSubject().getPrincipal(); // 獲取當(dāng)前登錄用戶
到此這篇關(guān)于Springboot+Shiro記錄用戶登錄信息并獲取當(dāng)前登錄用戶信息的文章就介紹到這了,更多相關(guān)Springboot+Shiro用戶登錄信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springsecurity實(shí)現(xiàn)用戶登錄認(rèn)證快速使用示例代碼(前后端分離項(xiàng)目)
- Spring mvc 實(shí)現(xiàn)用戶登錄的方法(攔截器)
- spring aop action中驗(yàn)證用戶登錄狀態(tài)的實(shí)例代碼
- springmvc+spring+mybatis實(shí)現(xiàn)用戶登錄功能(下)
- springmvc+spring+mybatis實(shí)現(xiàn)用戶登錄功能(上)
- SpringMvc實(shí)現(xiàn)簡易計(jì)算器功能
- Spring實(shí)現(xiàn)加法計(jì)算器和用戶登錄功能
相關(guān)文章
SpringSecurity添加圖形驗(yàn)證碼認(rèn)證實(shí)現(xiàn)
本文主要介紹了SpringSecurity添加圖形驗(yàn)證碼認(rèn)證實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Java訂單30分鐘未支付自動(dòng)取消該怎么實(shí)現(xiàn)
在開發(fā)中往往會(huì)遇到一些關(guān)于延時(shí)任務(wù)的需求,例如生成訂單30分鐘未支付,則自動(dòng)取消,下面這篇文章主要給大家介紹了關(guān)于Java訂單30分鐘未支付自動(dòng)取消該怎么實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-03-03SpringBoot在生產(chǎn)快速禁用Swagger2的方法步驟
這篇文章主要介紹了SpringBoot在生產(chǎn)快速禁用Swagger2的方法步驟,使用注解關(guān)閉Swagger2,避免接口重復(fù)暴露,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-12-12JAVA 并發(fā)容器的一些易出錯(cuò)點(diǎn)你知道嗎
今天給大家?guī)淼奈恼率荍ava并發(fā)編程的相關(guān)知識(shí),文中對(duì)java同步容器與并發(fā)容器做了非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-09-09idea切換分支的時(shí)候,忽略一些無用的修改設(shè)置
這篇文章主要介紹了idea切換分支的時(shí)候,忽略一些無用的修改操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02java 實(shí)現(xiàn)判斷回文數(shù)字的實(shí)例代碼
這篇文章主要介紹了java 實(shí)現(xiàn)判斷回文數(shù)字的實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03