權限的理解與Shiro

權限的理解

權限的話,權限做起來就是5張表;用戶表、角色表、用戶角色表、權限表、權限角色表。給用戶授角色給角色授權限;我認為權限,就是不同用戶登錄看到的菜單按鈕不同這是一個表面的權限,真正做的好在于它內部的攔截,我每點擊一個url我就知道它有沒有權限,就比如新增按鈕,我頁面上沒有新增按鈕,我非法拿到了新增按鈕是url,我是否能夠操作?,這就需要內部攔截,頁面顯示不難,比如左側菜單完全可以用樹的形式,通過用戶登錄拿到用戶id,根據用戶id查到一組角色id,根據一組角色id查到一組權限,然后把權限顯示到頁面上。但是頁面沒有這個按鈕,如果我非法拿到按鈕的url進行訪問時,這樣如何去進行攔截,才是重點,具體怎么做其實有很多方法,我簡單總結了以下有兩種,是運用了Shiro,因為我每一個url都會有一個對比,去判斷它是否有權限,那么我就會設置一個權限標記,比如說我頁面上有個按鈕,我給按鈕做一個權限標記,然后存到數據庫中,當我登錄后,需要攔截的時候把這些權限標記拿出來,那么問題是怎么根據url得到一組權限標記和取出來的一組權限標記進行對比,判斷是否有權限吶?我總結的有兩種,一種就是,我們現在用的是springmvc,我直接在方法上面指定一個權限標記,這個url對應的就是這個權限標記,這樣的話當我請求的時候就會把url和權限標記進行對比,看他是否有權限;還有一種就是,通過url進行規則化,然后通過url算出一組權限標記,然后寫一個Realm.java攔截器,然后把這個url算出權限標記跟Shrio里面存的一組權限標記進行對比,如果有就攔截上,沒有就攔截不了。

其實權限做的更好就是做到數據權限,數據權限就是頁面上 的按鈕菜單都一樣,但是不同身份的人點擊同樣的按鈕或菜單它顯示的數據是不同的。比如有一個菜單叫,工資管理,普通員工點擊顯示自己的工資信息,而總經理點擊看到的是整個部門的工資信息,這就是數據權限。做數據權限就是看這個數據的范圍是有什么決定的,一般數據的范圍是根據部門決定的,就是在我給角色授權的時候我可以決定它可以訪問到那些部門,所以就要表結構的改變,在用戶角色表中再添加一個字段,部門 id或你要訪問的數據范圍,將來查詢的時候結果是一個權限的id對應一個部門的id,當我在頁面點擊的時候,就會向后臺傳一個部門的id,查詢的時候就根據部門id查出數據,這樣就做到了數據權限!

Shiro控制權限的執行流程

在pom.xml中配置Shiro依賴(shiro-spring1.2.4、shiro-ehcache1.2.4等)

Web.xml(shiroFilter)和Spring-Service.xml中配置攔截器(shiroFilter)綁定Realm.java實體類在 LoginAction.java當用戶登錄的時候去查用戶信息,然后存在cache里,(使用用戶的登錄信息創建Token來new UsernamePasswordToken(username, password) 驗證客戶身份是否合法)

合法的話在Realm.java類中對客戶認證并授權,有兩個方法第一個認證方法一、AuthenticationInfo:認證

//得到用戶Subject

Subject currentUser=SecurityUtils.getSubject();

currentUser.getSession().setAttribute("user", user);//將用戶對象存入Subject(SecurityUtils安全工具)

查詢數據庫,取用戶名密碼

AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getName(), user.getPassword(), this.getName());

return authenticationInfo;

二、AuthorizationInfo :授權

1.根據用戶名查詢當前用戶擁有的角色(存入集合中后遍歷)

1.1將角色名稱提供給info

authorizationInfo.setRoles(角色集合set);

2.根據角色查詢當前權限按鈕標記名稱(存入集合中后遍歷)

2.1? 將權限名稱提供給info

authorizationInfo.setStringPermissions(權限標記集合set);

return authorizationInfo;

在jsp中使<shiro:haspermission. name="權限標記">標簽包按鈕;控制顯示

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • Shiro Demo 準備工作 運行前申明 請看完本頁面的所有細節,對你掌握這個項目來說很重要,別一上來就搞,你不...
    全是為了他閱讀 4,264評論 4 65
  • 前言 因為想做一個快速的后臺開發模板框架(方便以后直接開發功能而不用糾結環境和頁面框架搭建的選擇),當時在權限控制...
    Raye閱讀 1,764評論 0 31
  • 感恩 感恩爸爸養育我,承擔我各種開銷,讓我從小沒有負擔壓力的生活。 感恩爸爸每年都會記得我的生日,買蛋糕、準備一桌...
    晶晶_37cd閱讀 331評論 0 0
  • 網絡庫 說到網絡庫,這是開發必備,除非你的App玩單機。現在特別火也特別好用的網絡庫就數AFNetworking了...
    對面來個小胖子閱讀 367評論 0 0