歡迎您光臨本站 註冊首頁

由於最近做項目需要,在用戶登陸後有一個功能是需要用戶的信息,進行寫入數據庫的操作。但是目前還用不到Shiro的高級權限,只為了簡單獲取用戶信息,自己整合了一個只記錄用戶,獲取用戶信息的功能。
導入Shiro依賴

org.apache.shiroshiro-spring1.4.0


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

filterMap = new LinkedHashMap(); // 放行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記錄用戶登錄信息並獲取當前登錄用戶信息的實現代碼已經有256次圍觀

http://coctec.com/docs/java/show-post-233824.html