1. 程式人生 > >角色許可權管理與資料許可權管理

角色許可權管理與資料許可權管理

專案是基於jhipster生成的後端專案,使用spring boot相關的技術。
我的做法:
在JWT的FILTER裡面,新增自己的一些業務邏輯,把資料和選單許可權資訊獲取到, 並存到JWT中去。
 

   String login = "admin";
        String DATA_ACL_STR = "";
        try {
            login = claims.get("sub").toString();
            DATA_ACL_STR = resAclRepository.findAclByUser(login);
         } catch (Exception ex) {
            ex.printStackTrace();
        }
        Collection<? extends GrantedAuthority> authorities = Arrays
                .stream((claims.get(AUTHORITIES_KEY).toString() + "," + DATA_ACL_STR).split(","))
                .map(SimpleGrantedAuthority::new).collect(Collectors.toList());

        User principal = new User(claims.getSubject(), "", authorities);
SecurityContextHolder.getContext().setAuthentication(principal);

用到的兩張表的設計如下:

CREATE TABLE `t_res_acl` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `jhi_role` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `res_type` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `res_value` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `created_time` datetime DEFAULT NULL,
  `created_by` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `modified_time` datetime DEFAULT NULL,
  `modified_by` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE `t_menu_res` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `menu_type` varchar(255) NOT NULL,
  `pid` bigint(20) DEFAULT NULL,
  `permission` varchar(255) NOT NULL,
  `jhi_disable` bit(1) DEFAULT NULL,
  `created_time` datetime,
  `created_by` varchar(255) DEFAULT NULL,
  `modified_time` datetime,
  `modified_by` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

 


使用一個自定義的AOP攔截器,攔截特定的幾個方法,這幾個特定的方法都有一個業務欄位,暫且僅對業務進行資料控制。
攔截到的方法從
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
從這個getAuthorities中進行資料檢查,因為在前面的JWT FILTER中把許可權資訊存在這裡了。
同時,在JWTFILTER里根據獲取到的使用者請求的URL和請求的方法,可以判斷是否是需要保護的資源,如果是,則同樣從許可權中確認一下,
如果沒有訪問許可權,則中止過濾器,否則繼續。
// 判斷許可權中是否含有當前URL的訪問許可權

if (!authentication.getAuthorities().contains(new SimpleGrantedAuthority(AuthoritiesConstants.ADMIN)) // 管理員角色使用者不判斷許可權
                    && this.tokenProvider.ValidateMenuRes(permission) // 此資源是需要保護的
                    && !authentication.getAuthorities().contains(new SimpleGrantedAuthority(permission))) {
                servletResponse.getWriter().write("Current User is not authorized to access resource:" + permission);
                return;
            }