shiro是如今很是廣泛使用的java權限框架了,由於其使用很是的簡便,適合快速的解決項目的權限需求問題。javascript
如今我在本身項目中配置了shiro,項目前端是html靜態界面,動態數據都是由ajax完成。shiro中使用框架提供的jsp標籤完成頁面的細粒化權限控制,在我這個狀況下沒法配合使用,因此本身稍微拓展了一下,能夠便捷的控制html頁面控件的權限。css
在網上沒有查詢到相似的用法,因此這裏分享一下本身的方法,順便也簡單記錄一下項目實戰中使用shiro快速的開發流程做爲參考。html
首先 數據庫中三個基本的表和基本的字段 下面是最簡化的建表前端

項目中使用的是mybatis與數據庫交互 mapper的xml文件中這樣寫分別獲取用戶 角色 權限 java
- <resultMap id="BaseResultMap" type="com.cyt.music.interfaces.pojo.user.UserInfo" >
- <id column="id" property="id" jdbcType="INTEGER" />
- <result column="userName" property="username" jdbcType="VARCHAR" />
- <result column="userStatus" property="userstatus" jdbcType="VARCHAR" />
- <result column="roleId" property="roleid" jdbcType="INTEGER" />
- <result column="password" property="password" jdbcType="VARCHAR" />
- </resultMap>
-
- <select id="getByUserName" parameterType="String" resultMap="BaseResultMap">
- select * from user_info where userName=#{userName}
- </select>
-
- <select id="getRoles" parameterType="String" resultType="String">
- select r.roleName from user_info u,user_role r where u.roleId=r.id and u.userName=#{userName}
- </select>
-
- <select id="getPermissions" parameterType="String" resultType="String">
- 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}
- </select>
而後是shiro的核心 自定義realm 網上有不少教程都很是詳細的講解了realm 在這裏也是很是簡化的自定義ajax
- @Resource
- private UserService userService;
-
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
- String userName=(String)principals.getPrimaryPrincipal();
- SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
- authorizationInfo.setRoles(userService.getRoles(userName));
- authorizationInfo.setStringPermissions(userService.getPermissions(userName));
- return authorizationInfo;
- }
-
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
- String userName=(String)token.getPrincipal();
- UserInfo user=userService.getByUserName(userName);
- if(user!=null){
- AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(),"xx");
- return authcInfo;
- }else{
- return null;
- }
- }
如何整合springmvc去配置自定義realm 和配置過濾器這些在網上都有很是詳細的配置說明
接下來就是自定義的html細粒化控制了spring
在前端每一個頁面加載的時候都要向後臺發出一次請求去請求到當前登陸用戶的角色數據庫
- $(document).ready(function () {
-
- judgeAuthority();
- });
-
- function judgeAuthority(){
- $.ajax({
- type: "post",
- url: "",
- contentType: 'application/json;charset=utf-8',
- success: function (data) {
- for(var i=0;i<data.length;i++){
- if(data[i]=="admin"){
- $(".admin").css("display","block");
- }
- }
- }
- })
- }
在你須要作隱藏的控件class中 加載你定義的角色名就能夠了 在此處是admin 這兩個按鈕只有在擁有admin角色用戶登錄的時候纔會顯示

最後controller層對角色進行控制,吧當前用戶擁有的角色json形式返回給前端,前端本身處理json
- @RequestMapping("/session")
- public @ResponseBody List<String> session(HttpServletRequest request){
- Subject subject= SecurityUtils.getSubject();
- Session session=subject.getSession();
- List<String> roleList=new ArrayList<String>();
- if(subject.hasRole("admin")){
- roleList.add("admin");
- }
- if(subject.hasRole("teacher")){
- roleList.add("teacher");
- }
- return roleList;
- }
至此便可以完成html頁面對每一個控件都能根據登錄 用戶角色的不一樣進行權限控制了 方法是能走通 勉強實現本身的需求,感受能夠作一個好點的封裝能把角色名暴露出來自定義,把前端操做暴露出來自定義不單單只是空間的顯示或者隱藏.這些均可以在後續作思考和修改。