shiro 怎么自动实现对路径权限的分配

wwwgame 发布于 2013/08/25 17:12
阅读 6K+
收藏 0

访问路径必须指定有相应权限才能访问,而且这个指定过程只能在代码中写死。 怎么自动实现对路径权限的分配,只需要在后台配, 不需要在代码里perms,自动根据路径来指定具有相同路径权限的用户可访问?

感觉应该使用自定义filter,但是在jFinal里面又不知道怎么挂自己的filter。


加载中
0
iSea
iSea

Shiro没用过,觉得应该是可以灵活配置的,不是写死的。

自定义Filter跟普通的servlet是没多大区别的,注意在web.xml中的顺序就行了,写在框架配置的前面应该没多大问题。

0
玛雅牛
玛雅牛

用户-角色-权限来解决。
在代码里只要求某个action需要什么权限。
在后台可以自动配置用户所属的角色和角色所拥有的权限。
用户登录时,获取所有的角色、根据角色获取所有的权限。


0
wwwgame
wwwgame

引用来自“玛雅牛”的答案

用户-角色-权限来解决。
在代码里只要求某个action需要什么权限。
在后台可以自动配置用户所属的角色和角色所拥有的权限。
用户登录时,获取所有的角色、根据角色获取所有的权限。


问题是,不想在代码里写授权action权限的的代码,编程时不需要去关注这个,系统会自动按照url地址去比较, 然后决定是否有权访问, 这样可以只需要管理后台访问资源即可。

好像需要继承一下shiro里的验证filter,网上有,有spring配的例子,但是shiro.ini里面怎么配自定义的filter?
0
xmut
xmut

引用来自“玛雅牛”的答案

用户-角色-权限来解决。
在代码里只要求某个action需要什么权限。
在后台可以自动配置用户所属的角色和角色所拥有的权限。
用户登录时,获取所有的角色、根据角色获取所有的权限。


在代码里只要求某个action需要什么权限。

这个也太死板了,太不灵活了吧。这种后期叫客户怎么调整业务角色?重新编码?




wwwgame
wwwgame
你也发现了,按照逻辑来讲,shiro的这种设计是对的,但是如果做一个框架权限,每次增加一个资源,还要在代码里写他所允许的权限,的确不好,如果写到shiro.ini里还需要重启服务器。估计shiro里扩展它的认证filter是可以实现自己的路径认证方式
0
0
豆豆熊
豆豆熊
我记得以前shiro 有个拦截器 就是判断action 在表中权限 而不是每个方法上写注解!
wwwgame
wwwgame
有资料吗
0
玛雅牛
玛雅牛

shiro有针对权限的注解,代码中只写需要什么权限(字符串)

public class CardController extends Controller {

	@RequiresPermissions("card:new")
	public void newPage(){
		setAttr("title"," 新增卡片");
		render("new.html");
	}

	@Before(CardValidator.class)
	@RequiresPermissions("card:create")
	public void create(){
		String cardId = this.getPara("card_id");
。。。。

新建模块时,模块所需要的权限就定了。

然后在数据库中有一个t_permissions表,在这个表里新增两条记录。
id,  p ermission, desc
1, card:new   , 新增card页面权限
2, card:create, 创建card权限

将t_roles表中的id为1的admin(管理员)角色与这两个权限建立关联。
在 t_role_permission表里新增两条记录
role_id,permission_id
1,1
1,2

给id为1的用户dev用户赋予管理员权限。
在t_user_role表里新增一条记录。
user_id,role_id
1,1

创建一个shiro的JDBC Realm,在用户登录后加载所有权限(一般出于性能考虑会和ehcache联用),可以参见:http://my.oschina.net/myaniu/blog/137205

0
玛雅牛
玛雅牛

可以参考我为JFinal写的shiro插件:http://www.oschina.net/question/925382_114550

使用注解,启动时计算所有权限要求,运行时请求时调用启动时构建好的权限检查类,这些都是为了性能考虑,降低权限检查对性能的影响。

0
wwwgame
wwwgame

shiro的权限就好像权限卡,管理部门想对资源有多少权限分类,就做多少类权限卡,然后按级别发给不同的群体,然后告诉每个资源门卫,不见什么样的权限卡,就别让他进去。

我们实际编程中可能会这样,做一个资源链接,然后,管理员决定这个资源分配给谁,谁就有权,这里应该是省去了上面的:1、权限卡,2、以及告诉门卫所需卡的类别,这两个过程都隐藏了,其实也存在,只是固定成了,URL就是权限卡,用户拥有的URL与访问的URL匹配是既定验证规则,不需要在程序里面指定。应该是扩展filter来解决,shiro本身已有的验证类里面没有这样的filter,只是不知道写好的验证filter怎么用。与spring结合的方式,里面可以加载自定义的filter,然后就可以在shiro.ini [urls]里面用了。

0
Dreampie
Dreampie

jfinal-dreampie  动态数据库权限

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("daleted_at") == null) {
        permissions = Permission.dao.findByRole("", role.get("id"));
        //遍历权限
        for (Permission permission : permissions) {
          //权限可用
          if (permission.getDate("daleted_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"));

返回顶部
顶部