开发者社区> 问答> 正文

shiro根据角色来进行权限验证,后台新增了一个角色后,每次都要去更新shiro.ini:报错 

大家好:
我的一个项目用了shiro,项目里面管理员可以管理角色,用户,菜单。
权限方面是通过角色进行管理的。
在shiro.ini配置文件里面已经配置好了url和角色的关系。如下:

[urls]
/admin/** = anon
/user/goPwdMe = anon
/user/savePwdMe = anon
/user/checkOldPwd = anon
/user/** = roles[admin]
/role/**  = roles[admin]
/adv/** = roles[admin,advuser]
/carlogo/** = roles[admin,order_admin]
/fee/** = roles[admin,order_admin]
/menu/** = roles[admin]
/order/** = roles[admin,order_admin]
/merchant/subCateList = anon
/merchant/** = roles[admin]
/appweb/** = anon
/areaAll/** = anon

现在的问题是,如果后台管理员在后台新增了一个角色,在shiro.ini里面我就要对应着的加上该角色的对应的url的权限配置。
请问一下,有什么办法可以解决这个问题,可以动态的来做管理,不需要管理员新增一个角色就要更改一次shiro.ini 

展开
收起
kun坤 2020-06-04 21:07:10 922 0
1 条回答
写回答
取消 提交回答
  • jfinal-drampie  动态数据库权限

    public class MyJdbcAuthzService implements JdbcAuthzService { @Override public Map<String, AuthzHandler> getJdbcAuthz() { //加载数据库的url配置 Map<String, AuthzHandler> authzJdbcMaps = new HashMap<String, AuthzHandler>(); //    Map<String, AuthzHandler> authzJdbcMaps = new TreeMap<String, AuthzHandler>( //        new Comparator<String>() { //          public int compare(String k1, String k2) { //            return new Integer(k2.length()).compareTo(k1.length()); //          } // //        }); //遍历角色 List<Role> roles = Role.dao.findAll(); List<Permission> permissions = null; for (Role role : roles) { //角色可用 if (role.getDate("deleted_at") == null) { permissions = Permission.dao.findByRole("", role.get("id")); //遍历权限 for (Permission permission : permissions) { //权限可用 if (permission.getDate("deleted_at") == null) { if (permission.getStr("url") != null && !permission.getStr("url").isEmpty()) { authzJdbcMaps.put(permission.getStr("url"), new JdbcPermissionAuthzHandler(permission.getStr("value"))); } } } } } return authzJdbcMaps; } }
    --create role--

    INSERT INTO sec_role(id,name, value, intro, pid,left_code,right_code,created_at) VALUES (sec_role_id_seq.nextval,'超级管理员','R_ADMIN','',0,1,8, current_timestamp), (sec_role_id_seq.nextval,'系统管理员','R_MANAGER','',1,2,7,current_timestamp), (sec_role_id_seq.nextval,'会员','R_MEMBER','',2,3,4,current_timestamp), (sec_role_id_seq.nextval,'普通用户','R_USER','',2,5,6,current_timestamp);

    --create permission-- INSERT INTO sec_permission(id, name, value, url, intro,pid,left_code,right_code, created_at) VALUES (sec_permission_id_seq.nextval,'管理员目录','P_D_ADMIN','/admin/','',0,1,6,current_timestamp), (sec_permission_id_seq.nextval,'角色权限管理','P_ROLE','/admin/role/','',1,2,3,current_timestamp), (sec_permission_id_seq.nextval,'用户管理','P_USER','/admin/user/','',1,4,5,current_timestamp), (sec_permission_id_seq.nextval,'会员目录','P_D_MEMBER','/member/','',0,9,10,current_timestamp), (sec_permission_id_seq.nextval,'普通用户目录','P_D_USER','/user/**','',0,11,12,current_timestamp);

    //如果系统不重启需要加载新权限到全局过滤 ShiroKit.addJdbcAuthz(authority.getStr("url"),authority.getStr("auth_key"));

    ######回复 @Ikuo : deleted_at 未被删除的数据######回复 @Dreampie : if (role.getDate("daleted_at") == null)这句什么意思######回复 @Ikuo : if (role.getDate("daleted_at") == null)这句什么意思######回复 @Ikuo : https://github.com/Dreampie/jfinal-shiro######在吗?教教我这个怎么写######楼主,是如何解决的呢?能分享一下解决方式?######

    引用来自“开源编程”的评论

    楼主,是如何解决的呢?能分享一下解决方式? 换用permission的方式。参考一下玛雅牛的那个demo
    2020-06-08 11:03:04
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
安全机制与User账户身份验证实战 立即下载
《用管控策略设定多账号组织全局访问边界》 立即下载
低代码开发师(初级)实战教程 立即下载