weii822 2009-03-25 16:40
浏览 280
已采纳

Acegi能够隐藏权限吗?

   大家好。小弟看了Acegi框架之后,觉得它的确是非常好的安全控制系统。当用户的访问不在其权限之内时,系统往往跳转到一个信息提示页(当然,这是开发者自己实现的)。但有这样的一个需求:[b]只显示用户合法的权限[/b]。这样,用户访问不合法的资源的问题根本不存在了。同时,也不用明确地告诉用户哪些功能你们是不能访问的(这样避免用户感觉系统太“无情”了,呵呵)
    不知道各位有没有这样的解决方案啊??
    多谢!! :D 
  • 写回答

2条回答 默认 最新

  • playfish05 2009-03-25 16:43
    关注

    JSP页面中的页面元素,URL,按钮是否可见或变灰都可通过Acegi标签库来实现,使用Acegi标签库,可设置不同的权限ID允许点击的按钮,访问的URL,或隐藏无权限的功能菜单。

    如何配置和使用标签库?

    打开acegi-security-1.0.3.jar,在META-INF目录中有一个authz.tld文件,将此文件复制到你的web应用的WEB-INF\tld中,然后配置web.xml,增加:

       <taglib>  
    
     <taglib-uri>http://acegisecurity.sf.net/authz</taglib-uri>  
    
     <taglib-location>/WEB-INF/tld/authz.tld</taglib-location>  
    
     </taglib>
    

    然后JSP页面可以通过声明<%@ taglib uri="http://acegisecurity.sf.net/authz" prefix="authz"%>来引用标签库。

    声明了标签以后,在页面中可以按下面的格式使用acegi标签(authz标签可以嵌套使用):

     <td> 一般用户权限
    
     </td>  
    

     <td> 超级用户权限
    
     </td>  
    
     </authz:authorize>
    
     </authz:authorize>
    
        <authz:authorize ifAnyGranted="AUTH_SYS">  
    
     <td> 系统维护权限
    
     </td>  
    
     </authz:authorize>
    

    也可以在JavaScript中用document.write输出权限标签:

    //订单中心 document.write('<authz:authorize ifAnyGranted="AUTH_TAG_ORDER_CENTER"> '); new tree(TREE_ITEMS1, TREE_TPL); document.write('</authz:authorize>');

    在有javaScript脚本中有时不方便引用acegi标签,可以从SecurityContextHolder中获得权限集合,然后判断当前登录的用户,其权限集合中是否有某权限,根据判断结果来决定显示或隐藏哪些页面元素,见下面的JSP:

    <%@ page contentType="text/html; charset=UTF-8"%>

    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>

    <%@ taglib uri="http://acegisecurity.sf.net/authz" prefix="authz"%>

    <%@ page import="org.acegisecurity.Authentication" %>

    <%@ page import="org.acegisecurity.context.SecurityContext" %>

    <%@ page import="org.acegisecurity.context.SecurityContextHolder" %>

    <%@ page import="org.acegisecurity.userdetails.UserDetails" %>

    <%@ page import="org.acegisecurity.ui.AccessDeniedHandlerImpl" %>

    <%@ page import="org.springframework.aop.framework.ProxyFactoryBean"%>

    <%@ page import="org.springframework.context.ApplicationContext"%>

    <%@ page import="org.springframework.context.support.ClassPathXmlApplicationContext"%>

    <%@ page import="org.acegisecurity.GrantedAuthority"%>

    <%@ page import="com.mysoft.common.ValidateAcegiAuth"%>

    <%

    SecurityContext ctx = SecurityContextHolder.getContext();

    %>

    。。。

    //下面是调用自定义的类ValidateAcegiAuth,输入当前登录用户的SecurityContext,及权限码,如果有AUTH_FUN_TICKET_CHKERR权限,则执行相应的JS脚本。 <%if(ValidateAcegiAuth.validate(ctx,"AUTH_FUN_TICKET_CHKERR")){%> //具有AUTH_FUN_TICKET_CHKERR 权限,执行相应js脚本… <%}%>

    下面是ValidateAcegiAuth类的代码:

    package com.mysoft.common;

    import org.acegisecurity.Authentication;

    import org.acegisecurity.context.SecurityContext;

    import org.acegisecurity.context.SecurityContextHolder;

    import org.acegisecurity.userdetails.UserDetails;

    import org.acegisecurity.ui.AccessDeniedHandlerImpl;

    import org.springframework.aop.framework.ProxyFactoryBean;

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import org.acegisecurity.GrantedAuthority;

    /**

    • 验证权限集合中是否有某一权限

    • @author bzwang

    *

    *

    */

    public class ValidateAcegiAuth

    {

       /**
    
       * 验证权限集合中是否有某一权限
    
       * @param ctxLoginUser SecurityContext
    
       * @param sAuthID 权限ID
    
       * @return boolean 是否有指定的权限
    
       */
    
       public static boolean validate(SecurityContext ctxLoginUser,String sAuthID)
    
       {
    
              boolean bool = false;
    
              Authentication authLoginUser = null;
    
              GrantedAuthority[] arrayAuthorities = null;
    
              if(ctxLoginUser!=null)
    
              {
    
                  authLoginUser = ctxLoginUser.getAuthentication();
    
                  if(authLoginUser!=null)
    
                  {
    
                         arrayAuthorities = authLoginUser.getAuthorities();
    
                         for(int i=0;i<arrayAuthorities.length;i++)
    
                         {
    
                             if(arrayAuthorities[i].toString().equals(sAuthID))
    
                          {
    
                             bool = true;  
    
                               break;
    
                          }
    
                         }
    
    
    
                  }
    
                  else
    
                  {
    
                         bool = false;
    
                  }
    
    
    
           }
    
              else
    
              {
    
                     bool = false;
    
              }
    
    
    
    
    
              return bool;
    
       }
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 android报错 brut.common.BrutException: could not exec (exit code = 1)
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥15 复杂网络,变滞后传递熵,FDA
  • ¥20 csv格式数据集预处理及模型选择
  • ¥15 部分网页页面无法显示!
  • ¥15 怎样解决power bi 中设置管理聚合,详细信息表和详细信息列显示灰色,而不能选择相应的内容呢?