這篇文章主要講解了Springboot+Shiro如何實現記錄用戶登錄信息并獲取當前登錄用戶信息,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
由于最近做項目需要,在用戶登陸后有一個功能是需要用戶的信息,進行寫入數據庫的操作。但是目前還用不到Shiro的高級權限,只為了簡單獲取用戶信息,自己整合了一個只記錄用戶,獲取用戶信息的功能。
導入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、用戶的授權操作,但是這里先不授予權限(后續可以在這里補充)
2、用戶認證,這里有三種認證結果。
① 用戶登錄成功
② 拋出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);
/**
* 執行授權邏輯
*
* @param arg0
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
System.out.println("執行授權邏輯");
//給資源進行授權
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//不授權先不寫
return info;
}
/**
* 執行認證邏輯
*
* @param arg0
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
System.out.println("執行認證邏輯"); // 編寫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類(核心)
代碼基本不需要修改,根據個人不同的情況,需要修改的地方是第一個方法。
這里修改的原因是,每個人想要攔截的頁面都不一樣。因為我沒有做任何的授權,我使用了
filterMap.put("/*", "anon");為所有的頁面,都開啟了放行,無需認證就可以訪問,代碼中注釋部分是權限的定義
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 {
/**
* 創建ShiroFilterFactoryBean
*
* @param securityManager
* @return
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//設置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
//添加Shiro內置過濾器
/**
* Shiro內置過濾器,可以實現權限相關的攔截器
* 常用的過濾器:
* anon: 無需認證(登錄)可以訪問
* authc: 必須認證才可以訪問
* user: 如果使用rememberMe的功能可以直接訪問
* perms: 該資源必須得到資源權限才可以訪問
* role: 該資源必須得到角色權限才可以訪問
*/
Map<String, String> filterMap = new LinkedHashMap<String, String>();
// 放行login.html頁面
filterMap.put("/login", "anon"); // 要將登陸的接口放出來,不然沒權限訪問登陸的接口
// 授權過濾器
// 注意:當前授權攔截后,shiro會自動跳轉到未授權頁面
filterMap.put("/*", "anon");
// TODO 此處我做過修改
shiroFilterFactoryBean.setLoginUrl("/login"); // 修改調整的登錄頁面
shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 設置未授權提示頁面
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean;
}
/**
* 創建DefaultWebSecurityManager
*
* @param userRealm
* @return
*/
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(userRealm); // 關聯realm
return securityManager;
}
/**
* 創建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;
}這樣就完成了記錄用戶登錄信息,并且完成登錄。
唯一有可能遇到的問題是網頁的問題,這里需要在ShiroConfig類第一個方法里去配置。
獲取當前用戶登錄信息
只需要這一條語句就可以
User user = (User) SecurityUtils.getSubject().getPrincipal(); // 獲取當前登錄用戶
看完上述內容,是不是對Springboot+Shiro如何實現記錄用戶登錄信息并獲取當前登錄用戶信息有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。