摘要:關于的自動對用戶對象序列化并加密當獲得請求時能夠獲取反序列化且解密之后的用戶對象。
shirorememberMe流程原理研究
輸入用戶密碼正兒八經登錄時, 如果勾選了"記住我", 則后臺給shiro設置rememberme
前一次登錄勾選了記住我, 則本次登錄時isRemembered()==true(如果上一次設置了rememberme, 本次登錄是不會觸發action中的login()的方法的, 即會直接進入登錄狀態. 這里為了演示, 強行進入login()方法).
經過shiro的login()則表示為認證登錄的. 就是說authentication==true. 訪問權限最高.
rememberMe==true, 則將不會進入任何action. 可以訪問所有user控制的頁面或路徑. 但不能訪問authc控制的.
但是authentication=false. 這里有個關鍵點:
subject.isAuthenticated()==true,
則subject.isRemembered()==false;
反之一樣
下圖所示, authentication=false, 并且能夠principle不為空, 能夠獲取用戶信息.
另外對于過濾器,一般這樣使用:
訪問一般網頁,如個人在主頁之類的,我們使用user攔截器即可,user攔截器只要用戶登錄(isRemembered()==true or isAuthenticated()==true)通過即可訪問成功;
訪問特殊網頁,如我的訂單,提交訂單頁面,我們使用authc攔截器即可,authc攔截器會判斷用戶是否是通過Subject.login(isAuthenticated()==true)登錄的,如果是才放行,否則會跳轉到登錄頁面叫你重新登錄。
關于rememberMe的cookieshiro自動對用戶對象序列化并加密. 當獲得請求時, 能夠獲取反序列化且解密之后的用戶對象。
當設置rememberMe==false, 將會自動清空rememberMe cookie.
如下圖, 在設置rememberMe==false的前提下, 之前的rememberMe cookie已經不見了.
項目重啟后(排除緩存影響). 強行訪問action, 能夠獲取user對象.
調用shiro的logout()方法, 即消除自動登錄功能.
rememberMe功能實現 簡單實現引入shiro框架
引入maven坐標.
org.apache.shiro shiro-all ${shiro.version}
配置spring
/css/**=anon /js/**=anon /images/**=anon /validatecode.jsp*=anon /userAction_login.action=anon /customerAction_login.action=anon /info.jsp*=anon /courierAction_pageQuery*=perms["courier:list"] /pages/base/courier.jsp*=perms["courier:list"] /** = user /pay/** = authc
實現上文配置文件中realm
public class UserRealm extends AuthorizingRealm { @Autowired private UserDao userDao; @Autowired private PermissionDao permissionDao; @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; // !這里的username可能并不是真正的username, 可能是手機號或者其他可以作為登錄憑證的字段! String username = token.getUsername(); User u = userDao.findByUsernameOrTelephone(username, username); if (u == null) { return null; } AuthenticationInfo info = new SimpleAuthenticationInfo(u, u.getPassword(), this.getName()); return info; } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { //獲取當前用戶 User user = (User) principalCollection.getPrimaryPrincipal(); //內置用戶:授予所有權限 Listpermissions = null; if (user != null && user.getUsername().equals("admin")) { permissions = permissionDao.findAll(); } else { // 其他普通用戶:查出該用戶對應的所有權限 permissions = permissionDao.findByUserId(user.getId()); } // 授權 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for (Permission p : permissions) { info.addStringPermission(p.getKeyword()); } return info; } }
登錄action
@Action(value = "userAction_login") public String login() throws UnsupportedEncodingException { Log.begin(); String validateCode_ser = (String) ServletActionContext.getRequest().getSession().getAttribute("validateCode"); Subject subject; if (StringUtils.isNotBlank(this.validateCode) && this.validateCode.equals(validateCode_ser)) { subject = SecurityUtils.getSubject(); // 不論用戶輸入的是用戶名還是手機號, 前臺標簽統一用username接收 UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword()); //[[ADD 2018-1-9 14:44:01 // 設置是否"記住我" rememberme = rememberme == null ? false : rememberme; //null=>false token.setRememberMe(rememberme); // ]] try { subject.login(token); if (rememberme) LOG.info("用戶【{}】自動登錄----{}", "天王", String.valueOf(System.currentTimeMillis())); } catch (AuthenticationException e) { e.printStackTrace(); return LOGIN; } } else { this.addActionError("輸入的驗證碼有誤!"); return ERROR; }//end if return "home"; }
注意: 默認cookie會保存一年. 這個有點太長了, 通常需要縮短.
主要是spring配置的區別, 需要: 1. 配置自定義cookie; 2. 注入給rememberMeManager; 3. 將rememberMeManager注入給securityManager.
復雜實現/css/**=anon /js/**=anon /images/**=anon /validatecode.jsp*=anon /userAction_login.action=anon /customerAction_login.action=anon /info.jsp*=anon /courierAction_pageQuery*=perms["courier:list"] /pages/base/courier.jsp*=perms["courier:list"] /** = user /pay/** = authc
這種方式需要在spring中配置很多參數. 很繁瑣. 但是功能齊全. 如果只想實現簡單的自動功能, 可以參照簡單實現.
本部分spring配置可參見: 第十三章 RememberMe——《跟我學Shiro》
參考資料:
[1] http://jinnianshilongnian.ite...
[2] http://blog.icoolxue.com/shir...
[3] http://blog.csdn.net/lhacker/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68229.html
摘要:寫在前面在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。 寫在前面 在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。但是,一方面,不同的應用對于數據的合法性和可見性要求的維度與粒度都有所區別;另一方面,以當前微服務、多服務的架構方式,如何共享Sessi...
JAVA單點登錄有好多種方式,譬如用cookie的domain做,用中間代理做等等,但都需要自行做許多開發工作。而其中耶魯大學的開源項目CAS提供了一個一站式解決方案,只需很少的擴展即可輕松實現企業級單點登錄?;A知識網上其他挺多的,這里我就不詳述了。本文通過分析http請求過程中httpheader,cookie等數據剖析了cas(非代理模式,默認驗證邏輯。其他如restletAPI等可擴展邏輯...
閱讀 2078·2023-04-25 17:57
閱讀 1284·2021-11-24 09:39
閱讀 2482·2019-08-29 16:39
閱讀 3311·2019-08-29 13:44
閱讀 3116·2019-08-29 13:14
閱讀 2313·2019-08-26 11:36
閱讀 3809·2019-08-26 11:00
閱讀 948·2019-08-26 10:14