如果我通過 Azure 兩步身份驗證登錄,我可以使用在 Azure 應用程式配置中定義的“管理員”角色保護 Java/Spring 方法:
@PreAuthorize("hasAuthority('APPROLE_Admin')")
如果我使用 Spring Security 和傳統的 Active Directory 身份驗證以及映射到 ROLE_Admin 的組,我可以使用以下內容來獲取 true/false 以確定登錄用戶是否在該角色中:
request.isUserInRole("ROLE_Admin")
但對于 Azure 應用程式角色,同樣總是回傳 false,即使它應該為 true:
request.isUserInRole("APPROLE_Admin")
問題:
有沒有辦法為 Azure 應用程式角色呼叫 isUserInRole()?或者也許可以在 JSP 中使用一種替代方法來確定登錄用戶是否處于特定的 Azure 應用程式角色中?
原因
我想將它與 JSP/JSTL 結合使用,以隱藏僅當您是管理員時才相關的頁面元素。這曾經非常適合傳統的 AD 身份驗證,但現在我使用 Azure 兩步身份驗證,這讓我發瘋。
uj5u.com熱心網友回復:
Spring 通過前綴來區分角色和權限,這是ROLE_默認的。不以前綴開頭的所有內容都不會被視為角色。出于這個原因,isUserInRole如果前綴不存在,則該方法將前綴添加到其引數:SecurityContextHolderAwareRequestWrapper.java#L136。另一方面,hasAuthority不這樣做。
根據您的實際用例,您有多種選擇:
- 重新配置或洗掉 Spring Security 使用的前綴。請參閱如何使用 JavaConfig 從 Spring Security 中洗掉 ROLE_ 前綴?
- 在您的 JSP 中使用
hasAuthority而不是:isUserInRole
<sec:authorize access="hasAuthority('APPROLE_Admin')">
...
</sec:authorize>
- 撰寫您自己的方法來手動檢查從SecurityContextHolder.getContext()檢索的權限
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/533836.html
標籤:爪哇天蓝色jsp弹簧安全
