shiro配合html頁面完成細粒化權限控制


shiro配合html頁面完成細粒化權限控制

原創 2016年10月04日 12:02:34

shiro是現在非常普遍使用的java權限框架了,因為其使用非常的簡便,適合快速的解決項目的權限需求問題。

 

現在我在自己項目中配置了shiro,項目前端是html靜態界面,動態數據都是由ajax完成。shiro中使用框架提供的jsp標簽完成頁面的細粒化權限控制,在我這個情況下無法配合使用,所以自己稍微拓展了一下,可以便捷的控制html頁面控件的權限。

在網上沒有查詢到類似的用法,所以這里分享一下自己的方法,順便也簡單記錄一下項目實戰中使用shiro快速的開發流程作為參考。

 

首先 數據庫中三個基本的表和基本的字段  下面是最簡化的建表

 

項目中使用的是mybatis與數據庫交互   mapper的xml文件中這樣寫分別獲取用戶 角色 權限 

 

[html]  view plain  copy
 
  1. <resultMap id="BaseResultMap" type="com.cyt.music.interfaces.pojo.user.UserInfo" >  
  2.   <id column="id" property="id" jdbcType="INTEGER" />  
  3.   <result column="userName" property="username" jdbcType="VARCHAR" />  
  4.   <result column="userStatus" property="userstatus" jdbcType="VARCHAR" />  
  5.   <result column="roleId" property="roleid" jdbcType="INTEGER" />  
  6.   <result column="password" property="password" jdbcType="VARCHAR" />  
  7. </resultMap>  
  8.   
  9. <select id="getByUserName" parameterType="String" resultMap="BaseResultMap">  
  10.   select * from user_info where userName=#{userName}  
  11. </select>  
  12.   
  13. <select id="getRoles" parameterType="String" resultType="String">  
  14.   select r.roleName from user_info u,user_role r where u.roleId=r.id and u.userName=#{userName}  
  15. </select>  
  16.   
  17. <select id="getPermissions" parameterType="String" resultType="String">  
  18.   select p.permissionName from user_info u,user_role r,user_permission p where u.roleId=r.id and p.roleId=r.id and u.userName=#{userName}  
  19. </select>  

 

然后是shiro的核心 自定義realm 網上有很多教程都非常詳細的講解了realm 在這里也是非常簡化的自定義

 

[java]  view plain  copy
 
  1. @Resource  
  2. private UserService userService;  
  3.   
  4. /** 
  5.  * 為當限前登錄的用戶授予角色和權 
  6.  */  
  7. @Override  
  8. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
  9.     String userName=(String)principals.getPrimaryPrincipal();  
  10.     SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();  
  11.     authorizationInfo.setRoles(userService.getRoles(userName));  
  12.     authorizationInfo.setStringPermissions(userService.getPermissions(userName));  
  13.     return authorizationInfo;  
  14. }  
  15.   
  16. /** 
  17.  * 驗證當前登錄的用戶 
  18.  */  
  19. @Override  
  20. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {  
  21.     String userName=(String)token.getPrincipal();  
  22.     UserInfo user=userService.getByUserName(userName);  
  23.     if(user!=null){  
  24.         AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(),"xx");  
  25.         return authcInfo;  
  26.     }else{  
  27.         return null;  
  28.     }  
  29. }  

如何整合springmvc去配置自定義realm  和配置過濾器這些在網上都有非常詳細的配置說明

 

接下來就是自定義的html細粒化控制了

在前端每個頁面加載的時候都要向后台發出一次請求去請求到當前登錄用戶的角色

 

[javascript]  view plain  copy
 
  1.   $(document).ready(function () {            
  2.      //判斷角色  
  3.       judgeAuthority();  
  4.   });   
  5.   
  6. function judgeAuthority(){  
  7.     $.ajax({  
  8.         type: "post",  
  9.         url: "",  
  10.         contentType: 'application/json;charset=utf-8',  
  11.         success: function (data) {  
  12.             for(var i=0;i<data.length;i++){  
  13.                 if(data[i]=="admin"){  
  14.                     $(".admin").css("display","block");  
  15.                 }  
  16.             }  
  17.         }  
  18.     })  
  19. }  

在你需要做隱藏的控件class中 加載你定義的角色名就可以了 在此處是admin  這兩個按鈕只有在擁有admin角色用戶登陸的時候才會顯示

 

最后controller層對角色進行控制,吧當前用戶擁有的角色json形式返回給前端,前端自己處理

 

[java]  view plain  copy
 
  1. @RequestMapping("/session")  
  2. public @ResponseBody List<String> session(HttpServletRequest request){  
  3.     Subject subject= SecurityUtils.getSubject();  
  4.     Session session=subject.getSession();  
  5.     List<String> roleList=new ArrayList<String>();  
  6.     if(subject.hasRole("admin")){  
  7.         roleList.add("admin");  
  8.     }  
  9.     if(subject.hasRole("teacher")){  
  10.         roleList.add("teacher");  
  11.     }  
  12.     return roleList;  
  13. }  
至此即可以完成html頁面對每個控件都能根據登陸 用戶角色的不同進行權限控制了
方法是能走通 勉強實現自己的需求,感覺可以做一個好點的封裝能把角色名暴露出來自定義,把前端操作暴露出來自定義不僅僅只是空間的顯示或者隱藏.這些都可以在后續做思考和修改。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM