private String getUsername() { Object principal = SecurityUtils.getSubject().getPrincipal(); return principal.toString(); } private String getIp(){ Subject subject = SecurityUtils.getSubject(); String host = subject.getSession().getHost(); return host; }
通過這兩個方法,可以預見,基本上所有的信息都可以在SecurityUtils.getSubject()中獲取到;
以下是從別的文章中看到的:
當獲取用戶名的時候,是自己登錄時放入session的吧,正確是SecurityUtils.getSubject().getPrincipal();就是你的realms內doGetAuthenticationInfo時new SimpleAuthenticationInfo的第一個構造參數,直接放user對象就行了;
以下為轉載的文章:關於shiro中的session
在安全框領域,Apache Shiro 提供了一個獨一無二的東西:一個完整的企業級Session 解決方案,從最簡單的命令行及智能手機應用到最大的集群企業Web 應用程序。
如果你需要session 支持,你可以使用Shiro的Session支持,比Web 容器或使用EJB 有狀態會話Bean這兩種機制的使用和管理更為簡單。 下面是Shiro對Session支持的一些特點: 1) POJO/J2SE based(IoC friendly) - Shiro 的一切(包括所有Session 和Session Management 方面)都是基於接口和POJO 實現這可以讓你輕松地配置
所有擁有任何JavaBeans 兼容配置格式(如JSON,YAML,Spring XML 或類似的機制)的會話組件。你也可以輕松地擴展Shiro的組件或編寫你自己所需的來完全
自定義sessionmanagement。 2) Easy Custom Session Storage - 因為Shiro 的Session 對象是基於POJO 的,會話數據可以很容易地存儲在任意數量的數據源。這允許你自定義你的應用程
序會話數據的確切位置——例如,文件系統,聯網的分布式緩存,關系數據庫,或專有的數據存儲。 3) Container-Independent Clustering! - Shiro 的會話可以很容易地聚集通過使用任何隨手可用的網絡緩存產品,像Ehcache + Terracotta,Coherence,
GigaSpaces,等等。這意味着你可以為Shiro 配置會話群集一次且僅一次,無論你部署到什么容器中,你的會話將以相同的方式聚集。不需要容器的具體配置! 4) Heterogeneous Client Access - 與EJB 或web 會話不同,Shiro 會話可以被各種客戶端技術“共享”。例如,一個桌面應用程序可以“看到”和“共享”同一個被
使用的物理會話通過在Web 應用程序中的同一用戶。我們不知道除了Shiro 以外的其他框架能夠支持這一點。 5) Event Listeners - 事件監聽器允許你在會話生命周期監聽生命周期事件。你可以偵聽這些事件和對自定義應用程序的行為作出反應——例如,更新用戶記錄當他們的
會話過期時。 6) Host Address Retention - Shiro Sessions 從會話發起地方保留IP 地址或主機名。這允許你確定用戶所在,並作出相應的反應(通常是在IP 分配確定的企業
內部網絡環境)。 7) Inactivity/Expiration Support - 由於不活動導致會話過期,如果你希望的話,它們可以通過touch()方法來保持它們“活着”。這在RIA(富互聯網應用)環境非
常有用,用戶可能會使用桌面應用程序,但可能不會經常與服務器進行通信,但該服務器的會話不應過期。 8) Transparent Web Use - Shiro 的網絡支持,充分地實現和支持關於Sessions(HttpSession 接口和它的所有相關的API)的Servlet2.5 規范.這意味着你可
以使用在現有Web 應用程序中使用Shiro 會話,並且你不需要改變任何現有的Web 代碼。 9) Can be used for SSO - 由於Shiro 會話是基於POJO 的,它們可以很容易地存儲在任何數據源,而且它們可以跨程序“共享”。我們稱之為"poor man's SSO",
並且它可以用來提供簡單的登錄體驗,由於共享的會話能夠保留身份驗證狀態。 在Shiro中使用Session非常簡單,可以通過與當前執行的Subject 交互來獲取Session。例如: Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); session.setAttribute("someKey", someValue); 對於那些熟悉HttpServletRequest API 的人,Subject.getSession(boolean create)方法與HttpServletRequest.getSession(boolean create)方法有着
異曲同工之效。 l 如果該Subject 已經擁有一個Session,則boolean 參數被忽略且Session 被立即返回。 l 如果該Subject 還沒有一個Session 且create 參數為true,則創建一個新的會話並返回該會話。 l 如果該Subject 還沒有一個Session 且create 參數為false,則不會創建新的會話且返回null。 l 當你獲取了一個Subject 的Session 后,你可以用它來做許多事情,像設置或取得attribute,設置其超時時間,等等。 ———————————————— 版權聲明:本文為CSDN博主「peterwanghao」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/peterwanghao/article/details/8191115