Springboot+Shiro記錄用戶登錄信息并獲取當前登錄用戶信息的實現(xiàn)代碼
由于最近做項目需要,在用戶登陸后有一個功能是需要用戶的信息,進行寫入數(shù)據(jù)庫的操作。但是目前還用不到Shiro的高級權(quán)限,只為了簡單獲取用戶信息,自己整合了一個只記錄用戶,獲取用戶信息的功能。
導入Shiro依賴
<!-- Shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency>
User類
這個類只需要自己定義一個username(可以其他的phone、email都行)和password(密碼)就可以,其他的可以自己擴充。
UserRealm(核心)
這個類的功能:
1、用戶的授權(quán)操作,但是這里先不授予權(quán)限(后續(xù)可以在這里補充)
2、用戶認證,這里有三種認證結(jié)果。
① 用戶登錄成功
② 拋出UnknownAccountException異常,表示獲取的user是null 。
③ 拋出IncorrectCredentialsException異常,表示這個user的密碼錯誤。
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)邏輯");
//給資源進行授權(quán)
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//不授權(quán)先不寫
return info;
}
/**
* 執(zhí)行認證邏輯
*
* @param arg0
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
System.out.println("執(zhí)行認證邏輯"); // 編寫shiro判斷邏輯,判斷用戶名和密碼
UsernamePasswordToken token = (UsernamePasswordToken) arg0; // 判斷用戶名
User user = userService.findUserByPhone(token.getUsername());
if (user == null) { // 該用戶不存在
return null; // shiro底層會拋出UnKnowAccountException
}
return new SimpleAuthenticationInfo(user, user.getPassword(), ""); // 判斷密碼
}
}
ShiroConfig類(核心)
代碼基本不需要修改,根據(jù)個人不同的情況,需要修改的地方是第一個方法。
這里修改的原因是,每個人想要攔截的頁面都不一樣。因為我沒有做任何的授權(quán),我使用了
filterMap.put("/*", "anon");
為所有的頁面,都開啟了放行,無需認證就可以訪問,代碼中注釋部分是權(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)置過濾器,可以實現(xiàn)權(quán)限相關(guān)的攔截器
* 常用的過濾器:
* anon: 無需認證(登錄)可以訪問
* authc: 必須認證才可以訪問
* 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)過濾器
// 注意:當前授權(quán)攔截后,shiro會自動跳轉(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類(用戶登錄)
這里就是登陸成功,以及拋出兩個異常的地方。
/**
* 用戶登錄
*
* @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 = "密碼錯誤";
}
return result;
}
這樣就完成了記錄用戶登錄信息,并且完成登錄。
唯一有可能遇到的問題是網(wǎng)頁的問題,這里需要在ShiroConfig類第一個方法里去配置。
獲取當前用戶登錄信息
只需要這一條語句就可以
User user = (User) SecurityUtils.getSubject().getPrincipal(); // 獲取當前登錄用戶
到此這篇關(guān)于Springboot+Shiro記錄用戶登錄信息并獲取當前登錄用戶信息的文章就介紹到這了,更多相關(guān)Springboot+Shiro用戶登錄信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring-cloud入門之eureka-client(服務注冊)
本篇文章主要介紹了spring-cloud入門之eureka-client(服務注冊),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
Spring框架開發(fā)IOC兩種創(chuàng)建工廠方法詳解
這篇文章主要介紹了Spring框架IOC兩種創(chuàng)建工廠方法詳解,文中附含詳細的代碼示例分別對靜態(tài)方法和實例方法創(chuàng)建工廠作了簡要的分析2021-09-09
Java數(shù)據(jù)結(jié)構(gòu)之鏈表的增刪查改詳解
在這篇文章中,小編將帶大家了解一下Java數(shù)據(jù)結(jié)構(gòu)中鏈表的增刪查改(以下結(jié)果均在IDEA中編譯)希望在方便自己復習的同時也能幫助到大家2022-09-09

